内存溢出排查java.lang.OutOfMemoryError: Java heap space

内存溢出样例

public class App {
    public static void main(String[] args) {
        new Thread() {
            public void run() {
                while(true) {
                    Thread threadBigObject = new Thread(new Runnable() {
                        public void run() {
//                            while (true) {
                                BigObject bigObject = new BigObject();
                                String tt = new String(bigObject.getB());
                                System.out.println(tt);
                                /*try {
                                    TimeUnit.MILLISECONDS.sleep(800);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }*/
//                            }
                        }
                    });
                    try {
                        TimeUnit.MILLISECONDS.sleep(1);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    threadBigObject.start();
                }
            }
        }.start();

        /*while(true) {
            Thread threadSmallObject = new Thread(new Runnable() {
                public void run() {
                    SmallObject smallObject = new SmallObject();
                    String tt = new String(smallObject.getBytes());
                    System.out.println(tt);
                    try {
                        TimeUnit.MILLISECONDS.sleep(800);
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            threadSmallObject.start();
        }*/

    }
}



public class BigObject {

    private byte[] b = new byte[1024*1024];

    public byte[] getB() {
        return b;
    }

    public void setB(byte[] b) {
        this.b = b;
    }
}



public class SmallObject {
    private byte[] bytes = new byte[1024];

    public byte[] getBytes() {
        return bytes;
    }

    public void setBytes(byte[] bytes) {
        this.bytes = bytes;
    }
}

 ##idea配置ivm运行参数-Xmx48m -XX:+PrintGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/jvmgclog/heapdump/

 ##分析Java堆Dump工具下载

https://github.com/oracle/visualvm/releases/download/2.1.9/visualvm_219.zip

 ##GC-ROOT对象

1、虚拟机栈(栈帧中的本地变量表)中的引用对象:即各个线程当前执行的活动栈帧中引用的对象。
2、方法区中的类静态属性引用的对象:例如,public static修饰的变量。
3、方法区中的常量引用的对象:例如,字符串常量池(String Pool)中的字符串。
4、本地方法栈中JNI(Java Native Interface)引用的对象:通过JNI调用本地方法时,本地方法栈中引用的对象。
5、Java虚拟机内部的引用:如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointerException、OutOfMemoryError等),系统类加载器。
6、所有被同步锁(synchronized)持有的对象:持有锁的对象不会被回收。
7、活跃线程:线程本身也是对象,活跃线程自然不能被回收。
8、JVM内部的引用:比如指向JVM内部的类、方法、字段的引用。
9、其他:比如一些特殊的引用,如finalize队列中的对象、引用类型字段中的引用等。

##从图中看出GC-ROOT持有大对象 BigObject

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值