Gel*_*Luo 11 java linux memory jvm
我知道有同样的问题,像这样一个被提问和回答.我对答案不满意,所以让我在这里详细介绍一下这些消息.
我尝试使用JVM OPT启动我的应用程序:-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
Run Code Online (Sandbox Code Playgroud)
小智 10
您无法控制要控制的内容,-Xmx
只控制Java堆,它不控制JVM 对本机内存的消耗,而JVM根据实现完全不同地使用.
从以下文章感谢内存(了解JVM如何在Windows和Linux上使用本机内存)
维护堆和垃圾收集器使用您无法控制的本机内存.
需要更多的本机内存来维护维护Java堆的内存管理系统的状态.必须分配数据结构以跟踪免费存储并记录收集垃圾时的进度.这些数据结构的确切大小和性质随实现而变化,但许多数据结构与堆的大小成正比.
和JIT编译器使用本机内存一样javac
会
字节码编译使用本机内存(与gcc等静态编译器需要运行内存的方式相同),但JIT的输入(字节码)和输出(可执行代码)也必须存储在本机内存中.包含许多JIT编译方法的Java应用程序比较小的应用程序使用更多的本机内存.
然后你有使用本机内存的类加载器
Java应用程序由定义对象结构和方法逻辑的类组成.它们还使用Java运行时类库(例如java.lang.String)中的类,并且可以使用第三方库.只要它们被使用,这些类就需要存储在内存中.如何存储类因实现而异.
我甚至不会开始引用关于Threads的部分,我认为你得到的想法是
-Xmx
不控制你认为它控制的东西,它控制JVM堆,而不是JVM堆中的所有内容,并且堆占用更多本机记忆,指定用于管理和簿记的内容.
归档时间: |
|
查看次数: |
7417 次 |
最近记录: |