前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java垃圾回收之jconsole分析

Java垃圾回收之jconsole分析

作者头像
用户5546570
发布2020-10-27 17:16:26
7280
发布2020-10-27 17:16:26
举报
文章被收录于专栏:以Java架构赢天下

环境:jdk1.8+Mac+Idea

为了便于观察我们设置了虚拟机的参数 VM oprions , -Xms10m -Xmx10m

代码案例1: 新建了一个数组,向里面添加100个 OutOfMemory

代码语言:javascript
复制
package com.rumenz;

import java.util.ArrayList;
import java.util.List;

public class OutOfMemory {
    
    public byte []one=new byte[128*1024];
    
    public static void main(String[] args) throws InterruptedException {
            Thread.sleep(5000); //延时5秒,方便我们打开`jconsole`
            append(100);
    }
    private static void append(int n) throws InterruptedException {
        List<OutOfMemory> list=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Thread.sleep(3000); //拖慢添加速度,方便我们观察
            list.add(new OutOfMemory());
        }

    }
}

运行程序后迅速打开 jconsole ,并找到自己编写的类,点击进入,选择不安全链接

代码语言:javascript
复制
> jconsole

由于我们使用的是成员变量,所以垃圾回收器一致不能回收内存,所以整个堆的内存趋势是一路上涨.

代码案例2:

代码语言:javascript
复制
package com.rumenz;
import java.util.ArrayList;
import java.util.List;

public class OutOfMemory {


    public OutOfMemory() {
            byte []one=new byte[128*1024];
    }
    public static void main(String[] args) throws InterruptedException {

            Thread.sleep(5000);
            append(100);
    }

    private static void append(int n) throws InterruptedException {
        List<OutOfMemory> list=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Thread.sleep(3000);
            list.add(new OutOfMemory());
        }

    }
}

与上面代码的区别我们 one 变量有成员变量变成了局部变量. 局部变量在栈上分配内存,当方法结束,栈空间消失,栈上的变量或者引用地址将失效,本案例中 one 对象是分配在堆内存上,栈空间的消失导致 one 对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.

来源:https://www.tuicool.com/articles/ne2YraB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档