java查看非堆内存_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的界面

e54f99f846494ddcb59addda55859023.png

其中内存分区如下说明,

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的运行状态

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值