作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将我们的 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/
我是一名优秀的程序员,十分优秀!