19.jvm内存结构部分——堆_内存诊断_jmap

接下来我们给大家介绍一下堆内存的一个诊断
这里主要先介绍一些堆内存诊断相关的一些工具


我们接下来会掌握这样几个工具啊,

第一个叫 jps 的工具,它是查看当前系统中有哪些java 进程,并且把它们的进程编号显示出来。(注意不是jsp,是jps)

jps 拿到了这个java 进程的id 以后
我们就可以通过一个叫jmap 这个工具去查看你这个java进程,它的堆内存的一个使用情况

但是注意jmap它只能查询某一个时刻,它堆内存的一个占用情况

如果你想去做一个连续的监测啊,去查看这个随着时间的流逝,那么堆内存它的一个占用情况的话,那我们就得用一个功能更复杂的一个叫做这些jconsole工具啊来进行监测了。

它功能比较全一些,首先它是图形界面的。那么前两种工具都是命令行的方式的,jconsole是图形界面的。另外它是一个多功能的检测工具,
它不光是可以监测我们的堆内存的占用,还可以监测你的线程,包括cpu啊,这些部分都可以通过jconsole来监测。而且它也能实现这种连续的监测。

好,那下面呢我们就通过一些案例来具体来看看这几个工具他们的一个使用啊。

啊,我这儿准备了这样一个案例。
这个案例呢是首先打印了一个"1..."啊
在"1..."这个时间点上呢,我们等待了三十秒。
最主要是为了让我留给我一段时间啊,去敲一些命令。好,那三十秒之后我们分配了一块内存。
这块内存呢我们看一下啊,是一个byte数组啊,因为byte数组一个byte是一个字节。那后面1024个byte 那就是1k,再乘以1024呢就是1m,最后乘以个10,那就是10兆啊,10mb。

好,那这个对象分配好了以后,那大家想它是用new 关键词创建的,所以它占用的应该是堆空间啊。
所以我们待会去监测的话,应该结论应该是我的堆空间会多出十兆的内存占用来。

接下来啊这个对象呈现好了以后,打印了个"2..."啊,又等了一会儿啊,等了三十秒。
三十秒之后呢,这个对象的这个引用设为了"null"也就意味着这个变量不会,再引用刚才的byte 数组对象了。
也就是你的byte 数组数据对象可以被垃圾回收了。

我们显示的调用了gc方法进行了一次垃圾回收。
垃圾回收之后打印"3...",这个时候我再监测一下,看看堆内存的一个变化情况啊。
就是通过这个案例呢,我们在不同的几个时间点上去,通过刚才提到的一个jmap工具来查看它的堆内存的占用啊。

好,这个程序我们把它运行起来。


运行好了,我们开始打开一个命令行窗口
用jps先查看有哪些进程。


哎,我们看到有一个叫18756这个进程。 

啊,那我们就开始jmap,给它带一个参数,叫heap参数,然后后面跟上这个进程id18756。

(jmap -heap 18786)


好,我们来看一下这边啊已经执行到"1..."了,执行到"2..."我们再来检测一遍。(jmap -heap 18786)


我待会儿再看结果。
等到它啊执行到"3..."的时候,也就是执行了这个垃圾回收以后,我们再检测一遍。

打印"3..."了啊,我们再回过头来监测一遍。(jmap -heap 18786)

 


我们在这三个时间点上分别监测一下。
也就是我们在三个时间点上抓取了它的内存快照信息啊,我们回到最上方来看啊。

 


我先来解释一下这个命令啊,刚才我们说的jmap -heap 18786,它就是查看我们的堆内存的占用。
后面这个参数就是我们的这个进程id(pid),它就是检查这个java进程,它的一个堆内存占用。


好,我们往下看一看。这是它的一个堆的配置信息(Heap Configuration),这里呢我们可以看到一些堆的一些设置啊,比如说其中这个maxHeapSize 就是它的一个最大的堆内存。
可以看到它是四个g


然后嗯还有什么呢?

这些因为我们还没有讲那个垃圾回收时的那个内存划分啊,所以大家可能还看不明白这是它的什么最大新生代的内存(MaxNewSize)还有老年代的内存(OldSize)等等。

 


  那具体的内存占用在下面,它有一个heap usage,就是一个堆内存的占用。

堆内存占用提前说一下,就是这个新创建的一个对象,它都会使用一个叫eden Space区。

但是我们刚才这个第1个这个jmap 命令是在我创建对象之前执行的。
所以这时候这个byte数组对象还没有创建。所以我们看它的eden Space这个区域,它的used 使用了多少呢?使用了6MB。



它的总容量(capacity)是64MB,其中6MB被使用了。
好,这是我们第一个时间点啊,它的一个信息啊。


好,那我们继续往下看这些我们先不关心啊。


第二个jmap命令是我们在打印了"2..."以后,也就是这个新数组被创建在堆空间上分配了以后啊,我们又执行了一个jmap命令。


在这个jmap命令里,我们再找到Heap usage,再看一下它的eden区域啊。eden区域里面可以看到它的内存占用(used)已经到了16MB,16.4MB是不是比刚才的6.4MB多出来了大约10M的内存呀,这就是我们新创建的这个byte数组所占用的一个内存。
好,这是我们时间点"2..."打印出来的这个堆空间的内存占用的信息,我们再继续往下看。


好,等到垃圾回收执行完了以后,我们又打印了1个"3..."以后又执行了一个啊同样的jmap命令。我们这会儿再看垃圾回收之后,它的内存占用啊。


好,可以看到eden区域的内存占用已经变成了1.2MB左右啊,刚才那16MB,其中一些不用的信息啊都被回收掉了。
就包括我们刚才这10MB的这个对象啊,这个对象因为它的引用被设为了null,没人用它了,它就可以当成垃圾被回收掉。


好,从这个例子呢,我们就大概看出来了一个jmap这个工具的使用,它要查看堆内存的一个占用情况,就是给它加一个heap 参数加上这个进程id即可。


好,关于这个jmap 的工具使用我们先了解到这里。


Microsoft Windows [版本 10.0.19044.1766]
(c) Microsoft Corporation。保留所有权利。

C:\Users\89296\IdeaProjects\studyjava>jps
12080 Launcher
27792 KotlinCompileDaemon
11060 Launcher
24964 XzsApplication
28612 Client
6404 Jps
11928 Launcher
13656 MainApplication
27192

C:\Users\89296\IdeaProjects\studyjava>jmap -heap 28612
Attaching to process ID 28612, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.91-b15

using thread-local object allocation.
Parallel GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4253024256 (4056.0MB)
   NewSize                  = 88604672 (84.5MB)
   MaxNewSize               = 1417674752 (1352.0MB)
   OldSize                  = 177733632 (169.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 66584576 (63.5MB)
   used     = 8010312 (7.639228820800781MB)
   free     = 58574264 (55.86077117919922MB)
   12.030281607560285% used
From Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
To Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation
   capacity = 177733632 (169.5MB)
   used     = 0 (0.0MB)
   free     = 177733632 (169.5MB)
   0.0% used

3169 interned Strings occupying 259744 bytes.

C:\Users\89296\IdeaProjects\studyjava>jmap -heap 28612
Attaching to process ID 28612, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.91-b15

using thread-local object allocation.
Parallel GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4253024256 (4056.0MB)
   NewSize                  = 88604672 (84.5MB)
   MaxNewSize               = 1417674752 (1352.0MB)
   OldSize                  = 177733632 (169.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 66584576 (63.5MB)
   used     = 18496088 (17.639244079589844MB)
   free     = 48088488 (45.860755920410156MB)
   27.778337133212354% used
From Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
To Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation
   capacity = 177733632 (169.5MB)
   used     = 0 (0.0MB)
   free     = 177733632 (169.5MB)
   0.0% used

3170 interned Strings occupying 259792 bytes.

C:\Users\89296\IdeaProjects\studyjava>jmap -heap 28612
Attaching to process ID 28612, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.91-b15

using thread-local object allocation.
Parallel GC with 10 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4253024256 (4056.0MB)
   NewSize                  = 88604672 (84.5MB)
   MaxNewSize               = 1417674752 (1352.0MB)
   OldSize                  = 177733632 (169.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 66584576 (63.5MB)
   used     = 1331712 (1.27001953125MB)
   free     = 65252864 (62.22998046875MB)
   2.0000307578740157% used
From Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
To Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation
   capacity = 177733632 (169.5MB)
   used     = 1640624 (1.5646209716796875MB)
   free     = 176093008 (167.9353790283203MB)
   0.9230802192800516% used

3156 interned Strings occupying 258800 bytes.
 

上一篇:18.jvm内存结构部分——堆_内存溢出_tgbyhn31的博客-CSDN博客

下一篇:20.jvm内存结构部分——堆_内存诊断_jconsole_tgbyhn31的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值