static을 잘 사용하면 성능을 향상시킬 수 있지만, 잘못 사용하면 더 느려지거나, 오류가 생기고, 최악의 경우엔 JVM이 죽어버릴 수 있다. static은 여러 JVM에서는 다른 주소나 값을 참조하지만, 같은 JVM이나 WAS에서는 같은 주소를 참조하고, GC의 대상이 되질 않기 때문에 잘못 사용하면 성능을 하락시킬 수 있다. 특히 웹에서는 하나의 static 변수에 여러 스레드가 접근할 수 있으므로 주의해야한다. Static을 잘 사용하기 위해서는 1. 자주 사용하고 절대 변하지 않는 변수는 final static으로 선언한다. 특히 자주 사용하는 쿼리들이나 간단한 목록조회 쿼리도 final static으로 선언하면 GC대상에 포함되지 않기 때문에 성능에 좋다. 즉 템플릿 성격의 객체를 static..
Switch-Case 문 Switch-Case문은 작은 숫자부터 큰 숫자 순서대로 비교하는 것이 제일 빠르다. 조건문 조건문자체는 속도에 미치는 영향이 미미하다. 가독성에 더 신경쓰자. do-while문 public void test(List list){ int i=0; do{ if(list.get(i) == 10) break; }while(true); } 만약 list의 0번째가 10이라면 정상적인 동작을 하겠지만, 아닐 경우 무한루프를 돌며 CPU의 코어 한개를 잡아먹으므로 프로그램을 재시작해야할 수 있다. 조심하자 List를 대상으로 반복 for(int i=0; i
JMH : http://openjdk.java.net/projects/code-tools/jmh/Caliper : http://code.google.com/p/caliper/ 와 JUnit 테스트코드 실행용 라이브러리도 있다. JUnitPerf : http://www.clarkware.com/software/JUnitPerf.htmlJUnitBench : http://code.google.com/p/junitbench/ContiPerf : http://databene.org/contiperf.html
시작 이전의 AtomicLong 클래스의 updateAndGet 메소드를 사용해 한 인스턴스를 여러 스레드에서 안전하게 사용하는 법을 공부했었다. 그런데 동일한 원자값을 접근하는 스레드가 많은 경우에는 원자값을 사용중인지에 대해 검사를 엄청 해야하므로 성능이 떨어진다. 이럴땐 LongAdder와 LongAccumulator 클래스를 이용한다. LongAdder LongAdder 클래스는 각각을 모두 합하면 현재값이 되는 여러 변수로 구성되어있다. 여러 스레드가 서로 다른 인스턴스 변수를 업데이트하고 스레드가 증가하면 새로운 인스턴스가 제공된다. 즉 모든 스레드에 각각 다른 인스턴스 변수를 제공함으로써 경쟁을 줄이고 여러 스레드가 한 인스턴스 변수를 수정하는 일이 없도록 하는 것이다. LongAdder의 ..
자바8에서는 병렬 해쉬맵을 편하게 사용하기 위한 메소드가 추가되었다. Compute (key, (key, value)->value와 같은타입 리턴) 이 메소드는 키와 새로운 값을 계산하는 함수를 전달받는다. 두번째 인자로 받는 함수는 키와 값을 파라미터로 받아 값을 계산하고, 그 값을 리턴(적용) 한다. ex) map.compute(key, (k,v)->v.trim()); 위의 예제는 첫번째 인자로 받은 key와 매핑된 값의 공백을 없애주는 역할을 한다. 이 메소드의 개념은 수정(갱신)이라 봐도 무방할 것 같다. computeIfAbsent (key, key->value) 이 메소드는 키와 키를 받아 값 타입을 리턴하는 함수를 인자로 받는다. 만약 첫번째 인자로 받은 키와 매핑된 값이 존재하지 않으면 두..
이전에는 동기적 연산에서 예외를 제어하는 것을 봤었다. 이번에는 비동기적 연산에서 각 쓰레드에서 예외를 제어해보겠다. 동기적 연산에서는 그냥 코드들을 다 묶어서 예외처리를 해버렸다. 하지만 비동기연산에서는 호출자에게 예외를 넘기지 않아 호출자에서 예외를 처리할 수가 없다. 이럴 경우 스스로 예외를 처리해야한다. 나는 이 문제의 해결을 위해 BiFunction 타입을 선택했다. 이 타입은 Runnable과 Consumer 타입을 각각 인자로 받아 Runnable 타입을 리턴하는 함수를 지칭한다. public static void parallelTest(Runnable run1 , Runnable run2, Consumer con){ BiFunction bi = (run, consumer)->{ return..
원래 Input, Output Stream, 데이터베이스의 Connection 등 사용 후 close() 메소드를 호출해야 하는 클래스들이 있다. 하지만 자바7에는 이들을 자동으로 close 시켜주는 문법이 추가됬다. 이들은 AutoCloseable을 구현한 인터페이스로써 void close throws Exception 메소드를 포함한다. 껍데기는 대략 이렇다. try ( close할 변수선언) { // 연산 } catch(Exception e) { // 예외처리 } // 자동으로 close 예를 들자면 try ( Connection conn = DriverManager.getConnection(....); PreparedStatement pstmt = conn.preparedStatement(SQL)..
자바8에서는 메소드에서 함수도 리턴할 수 있다.이전에 했던 파일필터를 약간 변형하여디렉토리이면서 이름이 4글자 이상인 파일명을 필터링하는 함수를 리턴하는 메소드를 만들어보겠다 public static Predicate checkDirectory(int minLength){return file->file.getName().length() > minLength && file.isDirectory();} public static void main(String[] arg){File[] fileList = new File("경로").listFiles();Predicate filter = file->file.isDirectory();int minLength = 4;List directories = Arrays.st..
- Total
- Today
- Yesterday
- Clojure
- 메모리
- Docker
- Swift 2.0
- 시간
- 클로저
- 리액트
- 알람
- 날짜
- react
- 컴퓨터 시간
- 람다
- Java
- 자바 성능
- 성능개선
- json
- opensource
- javascript
- 자료구조
- 자바
- 프로세서
- 코어
- Stream
- RAMDA
- 퍼포먼스
- Jackson
- 성능
- rambda
- gitlab
- Java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |