java -XX:+PrintCommandLineFlags -version // or java -XX:+PrintCommandLineFlags -version
HeapSize
, PermSize
, ThreadStackSize
로 볼 수 있다. byte 단위.-verbose:class
: 어떠한 클래스를 적재하는지 확인해 볼 수 있다. NoSuchMethodError 참조java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
: 모든 JVM 플래그 기본 값 출력 Print All JVM FlagsUseCompressedOops
Flag 값이 true
이면 압축 포인터를 사용한다는 의미(메모리 절약, 32GB 미만)-XX:+CMSClassUnloadingEnabled와 -XX:+CMSPermGenSweepingEnabled
: PermGen을 대상으로 GC와 안 쓰는 클래스 정보를 지우는 작업을 수행-XX:-UseGCOverheadLimit
옵션주면 무시함.-XX:CompileThreshold
-XX:+TieredCompilation
-XshowSettings:vm
: vm 설정 출력-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
: Java 8u131이상에서 컨테이너(Docker 등) 의 메모리 한계에 맞춰서 Heap 메모리 할당하기 Running a JVM in a Container Without Getting Killed-XX:MaxRAMFraction=1
: 컨테이너 메모리 한계에 맞춰 Heap 할당시 사용가능한 최대값으로 설정The compiler in the server VM now provides correct stack backtraces for all “cold” built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
built-in 예외가 반복적으로 발생할 경우 메소드를 다시 컴파일 하여 성능을 높일 수 있다. 재컴파일 이후, 컴파일러는 미리 할당된 예외를 던지는데, 이 예외에는 stack trace가 없다.
원천적이로 이 기능을 끄려면 -XX:-OmitStackTraceInFastThrow
옵션을 사용한다. 하지만 굳이 이 옵션을 사용할 필요가 없다.
이 경우, 동일 JVM에서 비슷하게 발생한 다른 에러 로그를 찾아보면 과거에 발생했던 에러 로그에서 stacktrace를 찾을 수 있다. 혹은 JVM을 다시 실행해서 재현해봐도 전체 stacktrace를 얻을 수 있다.
재현해보기
public class NpeThief { public void callManyNPEInLoop() { for (int i = 0; i < 1000000; i++) { try { ((Object)null).getClass(); } catch (Exception e) { // stacktrace길이가 2 이다가 어느 순간 0으로 바뀐다. System.out.println(e.getStackTrace().length); } } } public static void main(String ... args) { NpeThief thief = new NpeThief(); thief.callManyNPEInLoop(); } }
-XX:+AlwaysPreTouch
Heap Size가 클 경우 JVM이 뜰 때 미리 Heap 공간을 0으로 채워 초기화 해 둔다. 부팅 속도는 느려지지만 실행시 속도는 빨라진다.