java查看堆内存的命令及方法

最近一个项目总发出堆内存过大报警,dump出了内存也一直没时间研究,今天正好整理下相关用到的命令和代码

这里有几个主要的命令和工具

jinfo:可以输出并修改运行时的java 进程的opts。 
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 
jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。 
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。 

这里就来一一使用一下:

1 JPS命令

C:\Users\Administrator>jps
3148 Bootstrap
8920 Jps
6264

JPS可以查到3148是我当前服务器启动的进程号

2 JSTAT命令

C:\Users\Administrator>jstat -class 3148
Loaded  Bytes  Unloaded  Bytes     Time
  8988 10830.6        0     0.0       9.20
这个命令可以用来查看加载class的数量级占用的空间
C:\Users\Administrator>jstat -compiler 3148
Compiled Failed Invalid   Time   FailedType FailedMethod
    2930      3       0     1.56          1 org/springframework/beans/factory/support/DefaultListableBeanFactory getBeanNamesForType
这个命令可以用来产看jvn编译的数量信息


C:\Users\Administrator>jstat -gc 3148
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
3968.0 3968.0 2388.4  0.0   31936.0   333.3    79588.0    49166.1   38144.0 38125.1     82    0.489   7      0.620    1.109
这个命令可以用来查看GC的信息和GC的次数
C:\Users\Administrator>jstat -gccapacity 3148
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC
  5440.0  87360.0  39872.0 3968.0 3968.0  31936.0    10944.0   174784.0    79588.0    79588.0  12288.0  65536.0  38144.0  38144.0     82     7
这个命令可以用来产看young,old和perm区的对象和使用大小
C:\Users\Administrator>jstat -printcompilation 3148
Compiled  Size  Type Method
    2949    188    1 java/util/concurrent/ConcurrentLinkedQueue poll
这个命令可以用来查看当前VM执行信息

3 jinfo 可以用来查看和更改java进程运行的参数

4 jmap命令可以输出所有内存中的对象


C:\Users\Administrator>jmap -histo:live 3148



这个命令可以用来查看堆中的活动对象及大小



C:\Users\Administrator>jmap -heap 3148
Attaching to process ID 3148, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 23.7-b01

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 268435456 (256.0MB)
   NewSize          = 1048576 (1.0MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 12582912 (12.0MB)
   MaxPermSize      = 67108864 (64.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 36700160 (35.0MB)
   used     = 4734920 (4.515571594238281MB)
   free     = 31965240 (30.48442840576172MB)
   12.901633126395089% used
Eden Space:
   capacity = 32636928 (31.125MB)
   used     = 4734920 (4.515571594238281MB)
   free     = 27902008 (26.60942840576172MB)
   14.50786054373745% used
From Space:
   capacity = 4063232 (3.875MB)
   used     = 0 (0.0MB)
   free     = 4063232 (3.875MB)
   0.0% used
To Space:
   capacity = 4063232 (3.875MB)
   used     = 0 (0.0MB)
   free     = 4063232 (3.875MB)
   0.0% used
tenured generation:
   capacity = 81498112 (77.72265625MB)
   used     = 30978160 (29.543075561523438MB)
   free     = 50519952 (48.17958068847656MB)
   38.0108928167563% used
Perm Generation:
   capacity = 39059456 (37.25MB)
   used     = 38951352 (37.14690399169922MB)
   free     = 108104 (0.10309600830078125MB)
   99.72323219248112% used

22804 interned Strings occupying 2668488 bytes.

这个命令可以用来查看堆的使用状况信息



C:\Users\Administrator>jmap -dump:format=b,file=heap1.bin 3148
Dumping heap to C:\Users\Administrator\heap1.bin ...
Heap dump file created
这个命令用来保存内存中的对象到指定的文件中


5 jconsole工具

输入jconsole后可以出现jconsole的界面

其中内存分区如下说明,

Eden Space (heap): 内存最初从这个线程池分配给大部分对象。 
Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。 
Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。 
Permanent Generation (non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的, 
Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache) 

6 jstack命令


C:\Users\Administrator>jstack 3148
这个命令用来查看进程下jvm的运行状态


参考文档:http://boendev.iteye.com/blog/882479

总结一下,这里没有具体的线上的实现例子,等遇到线上问题的时候可以结合jmap分析下线上的具体问题,另外还有个MemoryAnalyzer可用来查看dump文件。这个明晚好好研究一下

转载于:https://my.oschina.net/zimingforever/blog/181206

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值