限制ubuntu上的jvm进程内存

我想开始我与JVM OPTS应用:-Xmx128m-Xms32m-XX:MaxPermSize=64m。当应用程序启动时,我通过键入来检查内存使用情况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

回答:

-Xmx只能控制Java Heap,它不能控制JVM 对 本机内存 的使用,JVM的使用根据实现而完全不同。

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

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

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

和JIT编译器使用本机内存一样javac

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

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

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

我什至不会开始引用“线程”部分,我想您会得到一个想法,即

-Xmx它无法控制您认为它控制的内容,它控制着JVM堆,并不是所有东西都在JVM堆中,并且堆占了更多空间。您为管理和簿记指定的本机内存。

以上是 限制ubuntu上的jvm进程内存 的全部内容, 来源链接: utcz.com/qa/417106.html

回到顶部