我想监视Linux Centos系统上的java 8进程并且能够 看看他们使用了多少内存。我更愿意使用shell实用程序,因为我希望最终将输出提供给我们的中央监控系统
我也对java8中的-Xmx选项感到困惑,这些选项似乎对使用的内存量没有影响
这是一个获取java程序ps
信息的脚本
for jvm in `sudo -u services jps|awk '/.jar/ {print $1}'`; do ps up $jvm;done
输出
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
services 1409 0.0 10.8 4672536 872440 ? Tl Jun03 3:53 /usr/java/lates
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
services 1574 0.0 11.4 4743036 925536 ? Sl Jun03 3:13 /usr/java/lates
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
services 19839 0.7 10.9 4735664 881420 ? Sl 09:43 0:15 /usr/java/lates
以下是程序中的一些设置
sudo -u services jps -lvm
1409 /usr/local/content-adapters/pmc-adapter/pmc-adapter.jar -Xmx1024m -Xms512m
1574 /usr/local/content-adapters/tools-adapter/tools-adapter.jar -Xmx512m
20685 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/java/jdk1.8.0_65 -Xms8m
19839 /usr/local/content-adapters/cas-adapter/cas-adapter.jar
服务器上的一些信息默认
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 130023424 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2063597568 {product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
如果我使用jstat,我就无法使用各种"使用"数字加起来为4.5GiB VSZ数字高于或800-900MiB RSS
我的问题是
答案 0 :(得分:2)
除非设置vm.overcommit_memory = 2,否则不应过分关注虚拟内存。保留但未分配的地址空间和内存映射文件计入该值,因此该度量几乎无用,因为java预先保留整个堆以使连续区域可用。
RSS通常更有趣,假设没有发生分页应该比当前分配的java堆稍大,后者又可能小于最大java堆(-Xmx)
假设没有使用最大堆容量,并且只发生少量的内存映射或直接字节缓冲区分配,并且没有发生分页,则关系是这样的:
非垃圾对象< Java Heap使用<分配的Java堆< RSS< Java堆保留(Xmx)< VSZ
答案 1 :(得分:0)
此外,Java将使用内存用于元空间。此外,根据您的代码,java可能会使用额外的内存用于字节缓冲区,直接内存。