前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM 学习笔记(三)

JVM 学习笔记(三)

作者头像
会说话的丶猫
发布2020-08-06 14:55:39
4300
发布2020-08-06 14:55:39
举报

一:使用jvisualvm工具查看堆内存

visualgc插件下载链接 :

https://visualvm.github.io/pluginscenters.html --->选择对应版本链接--->Tools--->Visual GC

首先我们启动本地工程,不停地往内存中添加对象,代码如下:

代码语言:javascript
复制
@RestController
public class HeapController {
    List<Person> list=new ArrayList<Person>();
    @GetMapping("/heap")
    public String heap() throws Exception{
        while(true){
            list.add(new Person());
            Thread.sleep(1);
        }
    }
}

使用的是springBoot的工程,启动后访问:localhost:8080/heap

这样是程序不停地往内存中添加对象

我们在jvisualvm工具中找到当前进程,如图:

双击进入如下界面:

这边可以非常直观地看出jvm中堆的内存分布情况,正好验证了我之前在(二)中的文章所写的那样:

Survivor区详解:

  由图解可以看出,Survivor区分为两块S0和S1,也可以叫做From和To。在同一个时间点上,S0和S1只能有一个区有数据,另外一个是空的。

  接着上面的GC来说,比如一开始只有Eden区和From中有对象,To中是空的。此时进行一次GC操作,From区中对象的年龄就会+1,我们知道Eden区中所有存活的对象会被复制到To区,From区中还能存活的对象会有两个去处。若对象年龄达到之前设置好的年龄阈值,此时对象会被移动到Old区,如果Eden区和From区没有达到阈值的

对象会被复制到To区。 此时Eden区和From区已经被清空(被GC的对象肯定没了,没有被GC的对象都有了各自的去处)。这时候From和To交换角色,之前的From变成了To,之前的To变成了From。也就是说无论如何都要保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,知道To区被填满,然后会将所有对象复制到老年代中。

二:堆内存溢出情况

  我们可以适当调节内存的大小,来展示jvm内存溢出的现象,如图,可以在idea中设置jvm堆内存的最大和最小参数:

运行后访问localhost:9090/heap,等待内存溢出的现象:

在该工具中可以很明显看出jvm的堆内存已经满了,果然在idea也报了OOM:

小结

  通过jvisualvm工具,我们可以很直观地看出项目在运行时jvm中堆内存的变化,这个工具还是比较强大的,大家有时间可以试试,今天就分享到这里,还有方法区内存

和虚拟机栈内存的变化会在下个文章中分析

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:使用jvisualvm工具查看堆内存
    • Survivor区详解:
    • 二:堆内存溢出情况
    • 小结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档