전체 글 410

JAVA /기본 가비지 컬렉터 튜닝

기본 가비지 컬렉터 튜닝 비록 가비지 컬렉터 알고리즘 마다 힙을 처리하는 방식은 다르지만 기본적인 환경 설정 매개변수는 공유합니다. 힙 크기 정하기 가비지 컬렉터의 첫번째 기본 튜닝은 애플리케이션 힙 크기 입니다. 이는 힙의 제너레이션의 크기에 영향을 주는 고급 튜닝입니다. 대부분의 성능 문제에서 힙크기를 결정하는 것은 균형의 문제 입니다. 힙이 너무 작다면 프로그램 가비지 컬렉터를 수행하는 시간이 너무 길고 애플리케이션 로직을 수행하는데 충분한 시간을 쓸 수 없습니다. 하지만 단순히 매우 큰 힙을 쓰는것도 올바르지 않습니다. 가비지컬렉터 중단 시간은 힙의 크기에 좌우 되므로 힙의 크기가 늘어난다면 중단 시간도 늘어납니다. 즉 중단은 덜 일어나지만 한번 일어나면 크게 지연될 수 있습니다. 그리고 매우 큰..

JAVA,객체지향 2023.09.06

JAVA /가비지 컬렉터 알고리즘 정리/ 가비지 컬렉터 알고리즘 선택

JVM의 가비지 컬렉터 알고리즘 4개 시리얼 가비지 컬렉터 네개중 가장 단순한 알고리즘 애플리케이션이 클라이언트 클래스 머신에서 수행되고 있다면 디폴트 컬렉터 입니다. 시리얼 컬렉터는 힙을 처리하기 위해 단일 스레드를 사용합니다. 마이너나 풀 가비지컬랙션를 사용한다면 애플리케이션스레드는 모두 중지됩니다. 풀 가비지컬랙션가 일어나는 동안에는 올두 제너레이션은 완전히 압축될 것입니다. 시리얼 컬렉터는 -XX:+UseSerialGC 플래그를 통해 사용할 수 있습니다. 대부분의 JVM 플래그와 달리 시리얼 컬렉터는 + 부호를 - 부호로 바꾼다면 비활성화 됩니다. 또는 시리얼 컬렉터가 다폴트인 시스템에서 다른 가비지컬랙션 알고리즘을 명시한다면 비활성화 됩니다. 처리율 컬렉터 서버 클래스 머신 (다중 CPU 유닉스..

JAVA,객체지향 2023.09.06

JAVA 가비지 컬렉션

가비지 컬랙션이란? 가비지 컬렉션 튜닝은 자바 애플리케이션 성능을 개선하기 위해 할 수 있는 일 중 가장 중요합니다. 현재 JVM에서 사용할 수 있는 주요 가비지 컬렉터는 단일 CPU 머신에서 사용하는 시리얼 컬렉터(serial collector), 처리율 병렬 컬렉터(parallel collector), 동시 병렬 컬렉터(concurrent mark-sweep collector), G1(Garbage First) 컬렉터가 있습니다. 자바의 가장 매력적인 기능 중 하나는 개발자가 명시적으로 객체의 생명 주기를 관리할 필요가 없다는 점ㅣㅂ니다. 객체를 필요할때 생성하고 더이상 사용되지 않을 때 JVM이 자동으로 객체를 해체 시킵니다. 기본적으로 가비지컬렉터는 더이상 사용되지 않는 객체를 찾아서 그 객체와 ..

JAVA,객체지향 2023.09.06

JAVA JIT 컴파일러/ 역최적화 / 티어드 컴파일 레벨

역최적화 역최적화는 컴파일러가 선생한 컴파일의 일부를 원상태로 되돌리는 것을 의미합니다. 이에 대한 영향은 컴파일러가 대상 코드를 다시 컴파일 할 수 있을 때 까지 애플리케이션의 성능은 감소합니다. (그렇게 크지는 않다) 역최적화는 코드가 진입 불가와 좀비화일때 발생합니다. 진입불가 코드에 진입하지 못하게 만드는 요인은 두 개가 있습니다. 하나는 클래스와 인터페이스가 동작하는 방식에 기인한 것이고 다른 하나는 티어드 컴파일의 구현 세부 사항입니다. 주식 어플리케이션은 인터페이스로 StockPriceHistory를 가지고 있습니다. 이 인터페이스의 구현체로 StockPriceHistoryImpl과 로그를 쌓기 위한 인터페이스 구현체로 StockPriceHistoryLogger가 있습니다. 서블릿 코드에서는..

JAVA,객체지향 2023.09.06

JAVA JIT 컴파일러 /고급 컴파일러 튜닝 정리

고급 컴파일러 튜닝 컴파일이 동작하는 방법에 대한 상세 내역의 일부를 다루며 처리 과정에서 영향을 줄 수 있는 부가적인 튜닝을 소개하겠습니다. 하지만 이 값을 변경한다고 크게 달라지는 부분은 없습니다. 컴파일 스레드 컴파일 임계치에서 메소드가 컴파일 대상이 되면 컴파일 큐에 들어가 대기하게 됩니다. 큐는 한개 이상의 백그라운드 스레드에 의해 처리됩니다. 이건 컴파일이 비동기 프로세스로 대상 코드가 컴파일 중인 동안에도 계속해서 프로그램이 실행된다는 의미입니다. 메소드가 일반 컴파일을 한다면 다음 메소드를 호출하는 경우 컴파일된 메소드를 실행할 것입니다. 루프가 OSR을 통해 컴파일 된다면 루프가 다음 반복될 때 바로 컴파일된 코드를 실행합니다. 컴파일 큐는 FIFO 방식은 아닙니다. 호출 카운터 가 더 ..

JAVA,객체지향 2023.09.06

자바와 JIT 컴파일러 버전/ 컴파일러 튜닝 법 정리

JIT 세가지 버전 32-bit 클라이언트 버전 32-bit 서버 버전 64-bit 서버 버전 64-bit 서버 컴파일러는 티어드 컴파일을 지원하기 위해 클라이언트 컴파일도 가지고 있습니다. 32bit 운영체제를 가지고 있다면 JVM도 32bit를 사용해야 합니다. 64bit 운영체제를 가지고 있다면 JVM은 32bit 또는 64bit를 사용할 수 있습니다. 만약 힙 크기가 3GB보다 작다면 32bit 버전의 자바가 더 빠르게 동작할 수 있습니다. 당연하게 메모리 참조가 32bit 이므로 64bit 보다는 비용이 싸기 때문입니다. 만약 long이나 double 같은 64bit 변수를 광범위하게 사용하는게 아니고 전체 프로세스 크기가 4GB 미만이라면 32bit 컴파일러를 사용하는게 더 성능상의 우위가 있..

JAVA,객체지향 2023.09.06

JAVA JIT/ 서버와 클라이언트 컴파일러 기본튜닝

기본 튜닝 JIT 컴파일러는 두가지 형태로 나뉩니다. 사용할 형태는 흔히 애플리케이션이 실행되고 있을때 해야할 컴파일러 튜닝에 따라 결정됩니다. 두개의 컴파일러는 클라이언트와 서버로 알려져 있습니다. JVM 개발자 들은 흔히 c1(컴파일러 1, 클라이언트 컴파일러) 와 c2(컴파일러 2, 서버 컴파일러) 라는 이름으로 부릅니다. 두 컴파일러의 주요 차이점은 코드 컴파일에 있어서의 적극성 유무입니다. 클라이언트 컴파일러 서버 컴파일러보다 먼저 컴파일을 하기 시작합니다. 이는 서버 컴파일러보다 상대적으로 많은 코드를 컴파일한다는 의미이며 코드가 실행되기 시작하는 시간동안 클라이언트 컴파일러가 보다 더 빠를것입니다. 서버 컴파일러 클라이어트 컴파일러보다 더 많은 정보를 바탕으로 컴파일을 하고 더 나은 최적화를..

JAVA,객체지향 2023.09.06

java 핫스팟 컴파일

핫스팟 컴파일 핫스팟이란 이름은 코드 컴파일에 대한 접근법에서 유래했다고 합니다. 일반적인 프로그램은 전체 코드 중 일부만 자주 실행되며 애플리케이션의 성능은 이 일부가 얼마나 빠르게 실행되는가에 의해 좌우됩니다. 이 중요한 영역을 애플리케이션의 핫 스팟 이라고 합니다. 해당 영역의 코드가 많이 실행될 수 록 더욱 핫해집니다. 이런이유로 JVM은 코드를 실행할 때 바로 코드 컴파일을 하지 않습니다. 여기에는 기본적인 이유가 두가지가 있습니다. 코드가 한번만 실행된다면 컴파일은 헛수고가 됩니다. 컴파일해서 컴파일된 코드를 한번만 실행하는 것 보다 자바 바이트 코드를 인터프리트하는 편이 더 빠를 것입니다. 최적화 때문입니다. JVM이 특정 메소드나 루프를 실행하는 시간이 길어질 수록 코드에대해 얻어지는 정보..

JAVA,객체지향 2023.09.06

java JIT 컴파일러

JIT 컴파일러란? JIT (just-in-time,JIT) 컴파일러는 JVM의 핵심입니다. JVM내에서 컴파일러보다 성능에 더 영향을 주는 요소는 없습니다. 대부분의 상황에서 티어드 컴파일(tiered compilation)을 사용하기만 해도 튜닝할 필요는 거의 없습니다. 컴파일과 인터프리트 CPU는 어셈블리나 바이너리 코드라고 불리는 특정 명령어만 실행시킬 수 있습니다. 그 말은 CPU가 실행하는 모든 프로그램은 이 명령어 들로 변환이 가능합니다. C++같은 언어들은 바이너리로 컴파일된 코드로 실행되어 컴파일형 언어라고 불립니다. 즉 프로그램이 작성되고 정적 컴파일러는 바이너리를 생성합니다. 그 바이너리 내의 어셈블리 코드는 특정 CPU만을 대상으로 합니다. 반면 PHP나 Perl과 같은 언어는 인터..

JAVA,객체지향 2023.09.06