【发布时间】:2021-10-13 00:36:15
【问题描述】:
从 linux 日志文件中,记录了“java.lang.OutOfMemoryError: Direct buffer memory”异常。如何捕获异常,以便创建 Java 进程的堆转储?我还需要知道发生异常时如何重新启动 java 程序。但是,我将为此发布另一个问题。顺便说一下,Java 工具选项“-XX:+HeapDumpOnOutOfMemoryError”不会在直接内存异常上创建堆转储。
9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128819]:2021-09-20 23:02:55.266 [] [INFO] [com.emc.bedrock.http.HttpVerticle|vert.x-eventloop-thread -3] 请求 ID:2c7633a4-db9c-4ec5-b4ca-c93c47512384 在 4 毫秒内完成。 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:线程“iothread-2”中的异常 java.lang.OutOfMemoryError:直接缓冲内存 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 java.nio.Bits.reserveMemory(Bits.java:695) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 java.nio.DirectByteBuffer.(DirectByteBuffer.java:123) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.DecoderBase.(DecoderBase.java:35) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.V1Decoder.(V1Decoder.java:21) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.StreamEngine.newDecoder(StreamEngine.java:102) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.StreamEngine.handshake(StreamEngine.java:549) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.StreamEngine.inEvent(StreamEngine.java:278) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.IOObject.inEvent(IOObject.java:86) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 zmq.Poller.run(Poller.java:228) 9 月 20 日 23:02:55 CKM01204505062-A 控制路径 [128199]:在 java.lang.Thread.run(Thread.java:748)【问题讨论】:
-
您没有捕获异常,或者在您的应用程序中执行类似操作,因为无法从 JVM 中的应用程序代码触发转储创建。相反,您可以在命令行上设置 JVM 选项。真正的答案在 duplink 中(你找到了!)。
-
stackoverflow.com/questions/2787976/… 没有回答这个问题。虽然 OOM 与直接缓冲内存有关,但 VM 标志并没有捕捉到它。我已经在 JDK 11 中检查过了