美文网首页程序员
Java垃圾回收之jconsole分析

Java垃圾回收之jconsole分析

作者: 若丨寒 | 来源:发表于2020-10-17 09:52 被阅读0次

    环境:jdk1.8+Mac+Idea

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

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

    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 ,并找到自己编写的类,点击进入,选择不安全链接

    > jconsole
    
    image.png

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

    image.png

    代码案例2:

    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 对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.

    image.png

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

    相关文章

      网友评论

        本文标题:Java垃圾回收之jconsole分析

        本文链接:https://www.haomeiwen.com/subject/riyxmktx.html