在Linux下运行的Java应用程序有问题。
当我使用默认的最大堆大小(64 MB)启动应用程序时,我看到使用tops应用程序为应用程序分配240 MB的虚拟内存。这就给计算机上的其他软件带来了一些问题,相对来说,资源是有限的。
据我所知,保留的虚拟内存无论如何都不会被使用,因为一旦达到堆限制,就会抛出OutOfMemoryError。我在windows下运行了相同的应用程序,我发现虚拟内存大小和堆大小是相似的。
我是否可以为Linux下的Java进程配置使用的虚拟内存?
编辑1:问题不是堆。问题是,如果我设置128 MB的堆,Linux仍然分配210 MB的虚拟内存,这是不需要的。**
编辑2:使用ulimit -v允许限制虚拟内存量。如果大小集低于204 MB,那么应用程序将无法运行,即使它不需要204 MB,也只需要64 MB。所以我想了解为什么Java需要这么多虚拟内存。这能改变吗?
编辑3:系统中还有其他几个应用程序正在运行,它是嵌入式的。该系统确实有一个虚拟内存限制(从注释,重要细节)。
发布于 2015-03-09 04:17:31
Java和glibc >= 2.10存在一个已知的问题(包括UbuntuRHEL10.04,RHEL >= 6)。
解决办法是设置这个env。变量:
export MALLOC_ARENA_MAX=4如果您正在运行Tomcat,可以将其添加到TOMCAT_HOME/bin/setenv.sh文件中。
对于Docker,将其添加到Dockerfile中
ENV MALLOC_ARENA_MAX=4有一篇关于设置MALLOC_ARENA_MAX usage?lang=en的IBM文章。
已知驻留内存以类似于内存泄漏或内存碎片的方式爬行。
还有一个打开的JDK bug JDK-8193521 "glibc浪费了默认配置的内存“。
搜索MALLOC_ARENA_MAX在谷歌或更多的参考资料。
您可能还需要调优其他malloc选项,以便为分配的内存的低碎片进行优化:
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536发布于 2009-02-18 16:21:52
分配给Java进程的内存量与我所期望的差不多。我在嵌入式/内存有限的系统上运行Java也遇到了类似的问题。运行任何具有任意VM限制的应用程序或在没有足够数量交换空间的系统上运行,都会导致中断。这似乎是许多现代应用程序的本质,这些应用程序不是为资源有限的系统而设计的。
您还有几个选项可以尝试限制JVM的内存占用。这可能会减少虚拟内存占用:
-XX:ReservedCodeCacheSize=32m保留代码缓存大小(以字节为单位)-最大代码缓存大小。Solaris 64位,amd64和-server x86: 48m;在1.5.0_06和更早版本中,Solaris 64位和and64: 1024m。 永久一代的-XX:MaxPermSize=64m大小。5.0及更新版本: 64位VM放大30%;1.4 amd64: 96m;1.3.1 -client: 32m。
此外,还应该将-Xmx (最大堆大小)设置为尽可能接近应用程序的实际峰值内存使用的值。我相信JVM的默认行为仍然是每次将堆大小扩展到最大值时都要加倍。如果你从3200万堆开始,你的应用程序达到6500万,那么这个堆最终会增长3200万-> 64M -> 128百万。
您还可以尝试这样做,以减少VM在堆增长方面的侵略性:
-XX:MinHeapFreeRatio=40最小百分比的堆空闲后,GC,以避免扩展。
而且,从我几年前尝试过的情况来看,加载的本地库数量对最小占用空间产生了巨大的影响。如果我没有记错的话,加载java.net.Socket就增加了超过15M (而且我可能没有)。
发布于 2009-03-03 17:14:16
Sun需要大量的HotSpot内存,并且它映射到共享内存中的运行时库中。
如果内存是一个问题,请考虑使用适合嵌入的另一个JVM。IBM有j9,还有开源的"jamvm“,它使用库。此外,Sun还在SunSPOTS上运行Squeak,因此有其他选择。
https://stackoverflow.com/questions/561245
复制相似问题