使用Java 11编译后出现堆泄漏 - java

将我们的Spring Web App Maven构建升级到Java 11之后,我们看到Java进程的内存消耗不断增加。

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

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

在堆转储甚至本机内存跟踪中都看不到该泄漏,该过程一直在增加,直到物理内存+交换已满并且该进程被系统杀死为止。什么样的问题甚至可能引起这种问题?

参考方案

在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 RMI调用Python方法 - java

我有一个通过Python web2py创建的远程方法。如何测试和调用Java中的方法?我能够测试该方法是否实现@service.xmlrpc,但是如何测试该方法是否实现@service.run? 参考方案 如果您能做到,我会感到惊讶。 Java RMI需要Java对等体。

获取远程机器的系统信息(使用Java) - java

正如问题的标题所言,我想使用Java获取远程系统的系统信息(例如OS名称,版本等)。但是,在任何人回答这个问题之前,我只想问一下这是否可能,如果可以,那么如何?还有一个问题是,这对于基于Unix和基于Windows的系统都应适用。我尝试搜索Internet,但是(几乎)空白。编辑:Java应用程序将是一个桌面应用程序,它必须具有凭据才能登录到远程系统,但不会…

使用Java 8流处理null属性,并使用lambda表达式进行排序 - java

让我们考虑一个仅包含一个Parent属性的Integer类。我创建了6个父类对象,属性值是100, 20, 300, 400, 500, null。现在,我将所有对象添加到列表中(列表名称为list)。然后,我想获取其属性值大于100的对象。为此,我使用了Java 8流。Predicate<Entity> predicate = e -> …

使用Java DocumentListener的更智能方法 - java

目前,我在每个文本字段上都使用DocumentListener来实时验证用户的输入,但是我认为必须有一种更聪明的方法,因为我要重复很多次自我。有更聪明的方法吗?nameJTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void inse…

使用java.util.properties存储ArrayList和HashMap - java

如何使用ArrayList存储HashMap和/或java.util.properties变量?如果不可能,可以使用其他什么类来存储应用程序配置? 参考方案 如果只需要将集合序列化为字符串,我强烈建议XStream。它使用反射将类序列化为XML。如果默认行为对您要序列化的类不起作用,则有文档,但是到目前为止,以下内容对我而言一直有效:XStream xstr…