gpt4 book ai didi

java - 使用 java 11 编译后的堆外泄漏

转载 作者:行者123 更新时间:2023-12-01 11:15:47 24 4
gpt4 key购买 nike

将我们的 Spring Web 应用程序 maven 版本升级到 Java 11 后,我们看到 Java 进程的内存消耗不断增加。

工作正常:使用 Java 8 JDK 构建 + 在使用 Java 11 的服务器上运行

有泄漏:使用 Java 11 构建 + 在使用 Java 11 的服务器上运行

在堆转储甚至 native 内存跟踪中都看不到泄漏,进程不断增加,直到物理内存 + 交换已满并且进程被系统杀死。什么样的问题甚至可能导致这种问题?

最佳答案

在 Java 11 中, ForkJoinPool 类的行为略有不同。

自上次使用以来,线程终止之前经过的默认时间为 60 秒。在 Java 8 中,这是没有记录的,但实际上硬编码了 2 秒。如果池过大,Java 8 实现会在创建池后两秒终止空闲线程。但是该类的 Java 9/11 版本可以让它们存活几分钟。

比较线程的数量和生命周期。由于在您的应用程序启动或创建 ForkJoinPools 对象时未使用的线程可能不再提前终止,因此延长的线程生命周期很容易导致内存问题。

有关类似问题,请参阅以下问题:
ForkJoinPool performance Java 8 vs 11

在 Java 9 中 new constructor被引入来配置值。要获得与 Java 8 编译相同的行为,您必须在编译为 Java 9 之前将 keepAliveTime 显式设置为 2 秒或减小 ForkJoinPool 对象的大小。

关于java - 使用 java 11 编译后的堆外泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61819165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com