执行jar文件时出错 - 无法分配文件描述符表

6

在尝试在本地Linux机器上使用jar文件时,我遇到了以下错误:

库初始化失败-无法分配文件描述符表-内存不足

该机器有32G的RAM

如果需要,我可以提供额外的信息。

任何帮助将不胜感激。


您可以尝试在调用JVM时使用-Xmx标志来增加JVM堆内存大小。请参考https://dev59.com/UWUq5IYBdhLWcg3wJM9A#14763095。 - Jos
我已经尝试过这样做了,不幸的是,它没有帮助。 - user680111
尝试使用jVisualVM检查应用程序,您将更好地了解内存如何增长。此外,您可以使用名为VisualGC的插件查看GC活动,这将使您更好地了解JVM中各个内存区域的行为。 - Jos
1
我刚遇到了同样的错误。你可以尝试启用内存超额提交,将/proc/sys/vm/overcommit_memory设置为1。这对我有用。 - Dario Seidl
3个回答

8

最近版本的Linux默认开放文件数量的限制已经大幅增加。Java 8尝试预先为此文件描述符数量分配内存,这是错误的(参见https://bugs.openjdk.java.net/browse/JDK-8150460)。以前这可以工作,当默认限制要低得多时,但现在它尝试分配太多并失败了。解决方法是设置较低的开放文件数量限制(或使用更新的Java):

$ mvn
library initialization failed - unable to allocate file descriptor table - out of memoryAborted
$ ulimit -n 10000
$ mvn
[INFO] Scanning for projects...
...

对我来说有用,为此苦苦挣扎了好几个小时......只需像这样执行echo "ulimit -n 10000 >> /root/.bashrc"即可。 - thi gg

1

我在升级Manjaro Linux约一周后,发现我的一些Java应用程序和所有基于Electron的应用程序(如Spotify)出现了这种情况。以下命令(作为root用户,sudo无法解决问题)解决了这个问题:

echo >/etc/security/limits.d/systemd.conf "* hard nofile 1048576"

然后重新启动 希望这能帮助到某些人。

1

我在网上找到的其他解决方法都没用,但是我注意到导致这个缺陷的错误在Java 9中,并且已经被解决了。

我使用的是ArchLinux,当我尝试启动elasticsearch.service时,在journalctl -xe中显示由于某种原因JRE8在运行它,而archlinux-java status确实显示Java 8是默认值。将其设置为Java 11后问题得到解决:

 # archlinux-java set java-11-openjdk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接