监视java 8进程以查看实际内存使用情况

时间:2016-06-07 10:40:11

标签: java linux java-8 centos6

我想监视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

我的问题是

  1. 如何将-Xmx和其他设置与实际使用的内存量相关联?
  2. 如何使用jstat显示正在使用的内存量?
  3. 可能是VSZ和RSS的差异是由于所有java程序使用的某种共享资源。如何估算或找到此指标?

2 个答案:

答案 0 :(得分:2)

除非设置vm.overcommit_memory = 2,否则不应过分关注虚拟内存。保留但未分配的地址空间和内存映射文件计入该值,因此该度量几乎无用,因为java预先保留整个堆以使连续区域可用。

RSS通常更有趣,假设没有发生分页应该比当前分配的java堆稍大,后者又可能小于最大java堆(-Xmx)

假设没有使用最大堆容量,并且只发生少量的内存映射或直接字节缓冲区分配,并且没有发生分页,则关系是这样的:

非垃圾对象< Java Heap使用<分配的Java堆< RSS< Java堆保留(Xmx)< VSZ

答案 1 :(得分:0)

此外,Java将使用内存用于元空间。此外,根据您的代码,java可能会使用额外的内存用于字节缓冲区,直接内存。