• 使用JPofiler工具分析OOM原因


    在一个项目中,突然出现了OOM故障,那么该如何排除~

    • 能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler

    • Dubug,一行行代码分析!

    MAT,Jprofiler作用:

    • 分析Dump内存文件,快速定位内存泄露

    • 获得堆中的数据

    • 获得大的对象

    • ...

    查看虚拟机内存

            虚拟机试图使用的最大内存和虚拟机的初始化总内存

    1. public class Test {
    2. public static void main(String[] args) {
    3. // 获取虚拟机试图使用的最大内存
    4. long max = Runtime.getRuntime().maxMemory();
    5. // 获取jvm初始化总内存
    6. long total = Runtime.getRuntime().totalMemory();
    7. System.out.println("max="+max+"字节\t"+(max/(double)1021/1024)+"MB\t"+(max/(double)1021/1024/1024)+"GB");
    8. System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB\t"+(total/(double)1021/1024/1024)+"GB");
    9. // 默认情况下:分配的最大内存是电脑内存的1/4;初始化的内存是电脑内存的1/64
    10. // 分析OOM:
    11. // 1.尝试扩大堆内存,看结果
    12. // 2.分析内存,看一下哪个地方出现了问题(专业工具)JProfiler
    13. // -Xms1024m -Xmx1024m -XX:+PrintGCDetails
    14. // 305664K+699392K = 1005056K 981.5M
    15. }
    16. }

            设置VM options之前

     

            设置VM options之前(-Xms1024m -Xmx1024m -XX:+PrintGCDetails)

     

            idea设置JVM堆内存大小

     

    idea的VM options设置

       -Xms1m -Xmx1m -XX:+PrintGCDetails

            -Xms 设置初始化内存分配大小,默认1/64

            -Xmx 设置最大分配内存大小,默认1/4

            -XX:+PrintGCDetails --- 打印GC垃圾回收信息

            -XX:+HeapDumpOnOutOfMemoryError --- OOM DUMP

    制造OOM错误

    1. package com.yuan;
    2. import java.util.ArrayList;
    3. //dump -Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError OOM dump
    4. //默认情况下,分配的最大内存是电脑内存的1/4 而初始化的内存是 1/64
    5. //-Xms 设置初始化内存分配大小 默认初始化的内存电脑内存的1/164
    6. //-Xmx 设置最大分配内存,最大内存是电脑内存的1/4
    7. //-XX:+PrintGCDetails 打印GC垃圾回收信息
    8. public class demo01 {
    9. byte[] array = new byte[1 * 1024 * 1024];
    10. public static void main(String[] args) {
    11. ArrayList list = new ArrayList<>();
    12. int count = 0;
    13. try {
    14. while (true) {
    15. list.add(new demo01());
    16. count++;
    17. }
    18. } catch (Error e) {
    19. System.out.println("count:" + count);
    20. e.printStackTrace();
    21. }
    22. }
    23. }

     

            idea的VM options设置        -XX:+PrintGCDetails --- 打印GC垃圾回收信息

     

            然后再次运行,idea的VM options设置 -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError

     

            在当前项目路径下有一个hprof文件

      

            双击打开

     

            下面可以看出ArrayList存放对象太大了

     

            下面可以看出具体哪一行报的错误

     

  • 相关阅读:
    Spring IOC和Spring AOP的实现原理
    java中的注解
    瓦片地图 从下载到使用
    buu web部分wp
    【转】大数据安全--敏感数据识别和分级打标
    java8使用stream流将list转map
    Varnish讲解文章、缓存代理配置、核心功能、优势、Varnish在什么情况下会选择缓存哪些类型的内容、Varnish如何实现负载均衡功能?
    如何使用ArcGIS Pro创建最低成本路径
    疑惑与解答
    Java开发规范记录
  • 原文地址:https://blog.csdn.net/weixin_48426115/article/details/127339910