在Flink当程序Direct buffer memory 时,线程死锁。导致程序HANG死,这是BUG吗?log4j-core to the classpath. Using SimpleLogger to log to the console...
Exception in thread "I/O dispatcher 92" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:693)
at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:241)
at sun.nio.ch.IOUtil.write(IOUtil.java:58)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.apache.http.impl.nio.codecs.AbstractContentEncoder.doWriteChunk(AbstractContentEncoder.java:173)
at org.apache.http.impl.nio.codecs.AbstractContentEncoder.doWriteChunk(AbstractContentEncoder.java:166)
"Reference Handler" Id=2 WAITING on java.lang.ref.Reference$Lock@2fc6422f
at java.lang.Object.wait(Native Method)
这不一定是一个Flink中的bug,而更多的是您的程序分配和使用直接缓冲区内存的方式出现问题。
错误消息 java.lang.OutOfMemoryError: Direct buffer memory
表示您的程序已经耗尽了其可用的直接缓冲区内存,该内存用于堆外内存分配,并且对高性能I/O操作(如网络通信或磁盘访问)非常有用。
此问题有几种可能的原因:
这段日志记录了一个 OutOfMemoryError 错误,原因是 Direct buffer memory 已经耗尽。这种问题通常是由于应用程序试图申请过多的直接缓冲区内存而导致的。
在这种情况下,出现线程死锁并不是由 OutOfMemoryError 引起的,而是由于程序中的其他逻辑问题导致的。在这个问题中,“I/O dispatcher 92” 线程正在等待获取某个对象(java.lang.ref.Reference$Lock@2fc6422f)的锁,而另一个名为“Reference Handler”的守护线程则正在等待释放这个锁。
为了避免这种情况发生,应该确保程序中的所有同步块都遵循一定的规则,例如:尽量避免长时间持有锁;尽量不要在一个同步块中调用可能会阻塞的方法;尽量避免死循环等。
此外,还可以通过配置 JVM 参数来限制直接缓冲区内存的最大使用量。例如,可以通过设置 -XX:MaxDirectMemorySize
参数来限制直接缓冲区的最大大小。如果超过此限制,JVM 就会抛出 OutOfMemoryError 错误,从而及时发现和处理这个问题。
从日志中可以看出,程序在尝试分配Direct buffer memory时出现了OutOfMemoryError。这可能是由于程序的内存限制导致的。为了解决这个问题,你可以尝试增加JVM的堆内存大小。你可以在启动Flink程序时设置-Xmx
和-Xms
参数来调整堆内存的大小。例如:
./bin/flink run -Xmx4g -Xms4g your_job.jar
这将把堆内存大小设置为4GB。你可以根据你的需求和系统资源来调整这个值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。