#java #garbage-collection #out-of-memory #thread-dump
Вопрос:
У меня есть это регулярное исключение, которое случается 5-6 раз в неделю :
2021-08-03 09:46:24,692 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/borneIntranet]] Exception while dispatching incoming RPC call
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:215)
at java.lang.StringBuffer.toString(StringBuffer.java:585)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$LengthConstrainedArray.toString(ServerSerializationStreamWriter.java:96)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.toString(ServerSerializationStreamWriter.java:561)
at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:619)
at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
Это GWT, так что я ничего не могу отладить.
Я не могу каждый раз делать свалку из-за нехватки места на диске (только несколько гигабайт свободны).
Поэтому я хочу сделать threadDump на каждом ООМЕ.
Я добавляю эту опцию при запуске :
-XX:OnOutOfMemoryError=/opt/jboss/bin/oom.sh
В ум.ш у меня есть :
#!/bin/bash
pid=`pgrep java`
kill -3 $pid
В выводе, когда происходит ООМ, у меня есть :
#Startup
...
[Unloading class report2_1627976465405_761808]
[Unloading class sun.reflect.GeneratedMethodAccessor3910]
[Unloading class sun.reflect.GeneratedMethodAccessor3890]
[Unloading class sun.reflect.GeneratedMethodAccessor3883]
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor430]
[Unloading class sun.reflect.GeneratedMethodAccessor3960]
...
#OOM Happens :
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="/opt/jboss/bin/oom.sh"
# Executing /bin/sh -c "/opt/jboss/bin/oom.sh"...
[Unloading class sun.reflect.GeneratedMethodAccessor2241]
[Unloading class sun.reflect.GeneratedMethodAccessor4233]
[Unloading class sun.reflect.GeneratedMethodAccessor1649]
[Unloading class sun.reflect.GeneratedMethodAccessor3847]
[Unloading class sun.reflect.GeneratedMethodAccessor4944]
[Unloading class sun.reflect.GeneratedMethodAccessor1516]
...
У меня есть только эти «Разгрузочные» сообщения после звонка oom.sh, и никакой информации о потоках.
Если я сейчас вызову сценарий :
/bin/sh -c "/opt/jboss/bin/oom.sh"
In the output file I have successfully the thread dump :
[Unloading class PRIX32FOND32DE32RAYON32PORTRAIT_1627977230640_443552]
[Unloading class PRIX32FOND32DE32RAYON32PORTRAIT_1627977230640_443552$initVars]
[Unloading class clientSavComplet_1623169393241_78227]
[Unloading class ficheSav_1623169359150_32752]
[Unloading class sun.reflect.GeneratedMethodAccessor3308]
...
2021-08-03 15:15:06
Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.1-b02 mixed mode):
"ActiveMQ VMTransport: vm://bridgedBroker#3-65" daemon prio=10 tid=0x00007f946ac33800 nid=0x234f waiting on condition [0x000000004e45d000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
...
When I tried on another server (outside production) and provoque an OOM on purpose, the thread Dump is generated with success.
I tried to use Jstack, but if the GC is working hard in the same time of the OOM, nothing is generated either, so I prefer to use kill -3 option.
Thank you.