限制ubuntu上的jvm进程内存

我知道有同样的问题,像这样一个被问及答复。 我对答案不满意,所以让我在这里提供更多的细节信息。

我尝试使用JVM OPT启动我的应用程序: -Xmx128m -Xms32m -XX:MaxPermSize=64m 。 当应用程序启动时,我通过键入cat /proc/10413/status来检查内存使用cat /proc/10413/status ,并且我发现vmsize大于600512 kB! 这比我的设置更大。 我想知道如何限制进程的jvm内存使用情况。

 Name: java State: S (sleeping) Tgid: 10413 Pid: 10413 PPid: 1 TracerPid: 0 Uid: 1001 1001 1001 1001 Gid: 1007 1007 1007 1007 FDSize: 128 Groups: 1001 1007 **VmPeak: 728472 kB** **VmSize: 600512 kB** VmLck: 0 kB VmHWM: 298300 kB VmRSS: 280912 kB VmData: 647804 kB VmStk: 140 kB VmExe: 36 kB VmLib: 13404 kB VmPTE: 808 kB VmSwap: 0 kB Threads: 33 SigQ: 0/31522 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 2000000181005ccf CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: f Cpus_allowed_list: 0-3 Mems_allowed: 00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 3 nonvoluntary_ctxt_switches: 2 

Solutions Collecting From Web of "限制ubuntu上的jvm进程内存"

您无法控制要控制的内容-Xmx仅控制Java堆,它不控制JVM对本地内存的使用,基于实现,JVM完全不同。

从以下文章感谢内存(了解JVM如何在Windows和Linux上使用本机内存)

维护堆和垃圾收集器使用您无法控制的本机内存。

需要更多的本地内存来维护内存管理系统维护Java堆的状态。 收集垃圾时必须分配数据结构来跟踪空闲存储并记录进度。 这些数据结构的确切大小和性质随实现而变化,但许多与堆的大小成正比。

JIT编译器就像javac一样使用本地内存

字节码编译使用本地内存(就像gcc这样的静态编译器需要内存运行),但JIT的输入(字节码)和输出(可执行代码)也必须存储在本机内存中。 包含许多JIT编译方法的Java应用程序使用比小应用程序更多的本机内存。

然后你有使用本机内存的类加载器

Java应用程序由定义对象结构和方法逻辑的类组成。 他们还使用Java运行时类库(如java.lang.String)中的类,并可能使用第三方库。 只要这些类被使用,就需要将这些类存储在内存中。 类的存储方式因实现而异。

我甚至不会开始引用线程部分,我想你会发现-Xmx不能控制你认为它所控制的东西,它控制着JVM堆,并不是所有东西都在JVM堆中,而堆占用方式更多的本地内存,你指定的管理和簿记。

像Linux上的其他进程一样,您可以限制JVM进程的内存使用量(比如4 GB):

 $ ulimit -v 4194304 $ java ... # execute your Java program 

(从技术上讲,这实际上是虚拟内存,这是实际内存使用的上限, 但ulimit显然不适用于实际的内存使用情况。 )

这将导致超出限制的内存分配失败,可能会导致OutOfMemoryError和您的应用程序退出。