开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

在Flink当程序Direct buffer memory时,导致程序HANG死,这是BUG吗?

在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)

  • waiting on java.lang.ref.Reference$Lock@2fc6422f
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

展开
收起
三分钟热度的鱼 2023-11-08 21:22:22 76 0
3 条回答
写回答
取消 提交回答
  • 这不一定是一个Flink中的bug,而更多的是您的程序分配和使用直接缓冲区内存的方式出现问题。
    错误消息 java.lang.OutOfMemoryError: Direct buffer memory 表示您的程序已经耗尽了其可用的直接缓冲区内存,该内存用于堆外内存分配,并且对高性能I/O操作(如网络通信或磁盘访问)非常有用。
    此问题有几种可能的原因:

    • 您的程序可能会分配过多的直接缓冲区内存,超过了JVM可用的最大内存。
    • 在您的程序中可能存在泄露或无效使用的直接缓冲区,随着时间的推移会积累并最终耗尽可用内存。
    • 默认大小的直接缓冲池可能不足以满足您的工作负载需求,导致过度波动和碎片化。
    2023-11-09 21:58:12
    赞同 1 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    这段日志记录了一个 OutOfMemoryError 错误,原因是 Direct buffer memory 已经耗尽。这种问题通常是由于应用程序试图申请过多的直接缓冲区内存而导致的。
    在这种情况下,出现线程死锁并不是由 OutOfMemoryError 引起的,而是由于程序中的其他逻辑问题导致的。在这个问题中,“I/O dispatcher 92” 线程正在等待获取某个对象(java.lang.ref.Reference$Lock@2fc6422f)的锁,而另一个名为“Reference Handler”的守护线程则正在等待释放这个锁。
    为了避免这种情况发生,应该确保程序中的所有同步块都遵循一定的规则,例如:尽量避免长时间持有锁;尽量不要在一个同步块中调用可能会阻塞的方法;尽量避免死循环等。
    此外,还可以通过配置 JVM 参数来限制直接缓冲区内存的最大使用量。例如,可以通过设置 -XX:MaxDirectMemorySize 参数来限制直接缓冲区的最大大小。如果超过此限制,JVM 就会抛出 OutOfMemoryError 错误,从而及时发现和处理这个问题。

    2023-11-09 13:17:01
    赞同 展开评论 打赏
  • 从日志中可以看出,程序在尝试分配Direct buffer memory时出现了OutOfMemoryError。这可能是由于程序的内存限制导致的。为了解决这个问题,你可以尝试增加JVM的堆内存大小。你可以在启动Flink程序时设置-Xmx-Xms参数来调整堆内存的大小。例如:

    ./bin/flink run -Xmx4g -Xms4g your_job.jar
    

    这将把堆内存大小设置为4GB。你可以根据你的需求和系统资源来调整这个值。

    2023-11-09 10:04:11
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载