====== JVM/Java Crash ======
===== JVM Crash hs_err 파일 분석 =====
* ''$HOME'' 디렉토리에 ''hs_err_pid[PID].log'' 파일을 분석한다.
* 상단 주석부의 ''Problematic frame: ...'' 관련 부분을 잘 살펴본다. 보통 여기에 에러 원인이 되는 코드가 나온다.
* [[https://weblogs.java.net/blog/kohsuke/archive/2009/02/crash%5Fcourse%5Fon.html|Crash course on JVM crash analysis]]
* [[http://www.oracle.com/technetwork/java/javase/index-137495.html|Troubleshooting Guide for Java SE 6 with HotSpot VM]]
===== JIT Compiler Loop optimization bug =====
* Java 7 예전버전 이하에서 Apache HttpClient와 Tomcat의 ''org.apache.http.client.protocol.RequestAddCookies.process(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)V''가 유발시킬 수 있다.
* 아래와 같은 오류가 발생할 수 있다.
Caused by: java.util.NoSuchElementException: null
at java.util.ArrayList$Itr.next(ArrayList.java:757) ~[na:1.6.0_18]
at org.apache.http.impl.cookie.BestMatchSpec.formatCookies(BestMatchSpec.java:189) ~[httpclient-4.1.3.jar:4.1.3]
at org.apache.http.client.protocol.RequestAddCookies.process(RequestAddCookies.java:196) ~[httpclient-4.1.3.jar:4.1.3]
at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:108) ~[httpcore-4.1.4.jar:4.1.4]
at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:174) ~[httpcore-4.1.4.jar:4.1.4]
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:462) ~[httpclient-4.1.3.jar:4.1.3]
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) ~[httpclient-4.1.3.jar:4.1.3]
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) ~[httpclient-4.1.3.jar:4.1.3]
* 이는 JVM의 Loop 최적화 관련 버그이며 **Java 8**과 Java **7u60**이상 버전에서는 발생하지 않는다. 그 이하 버전에서는 JVM 시작시 다음과 옵션을 줘야 한다. 성능 저하를 유발한다.
-XX:-LoopUnswitching
* [[https://issues.apache.org/jira/browse/HTTPCLIENT-1173|[HTTPCLIENT-1173] NoSuchElementException in org.apache.http.impl.cookie.BestMatchSpec.formatCookies]]
* [[http://bugs.java.com/view_bug.do?bug_id=8021898|Bug ID: JDK-8021898 Broken JIT compiler optimization for loop unswitching]]
* [[https://bugs.openjdk.java.net/browse/JDK-8021898|Broken JIT compiler optimization for loop unswitching]]
* [[https://github.com/rholder/jvm-loop-unswitching-bug|JVM Loop unswitching bug 재현]]