zoukankan      html  css  js  c++  java
  • java内存溢出定位

    一、内存溢出问题分类

    • 瞬时流量过大造成的创建大量对象
    • 内存泄漏导致的内存溢出,一般就是程序编码的BUG引起的

    二、内存泄漏问题分析

    • step1: 收集内存泄漏的堆内存异常日志

           > 添加HeapDumpOnOutOfMemoryError 和 HeapDumpPath两个参数开启堆内存异常日志:java -jar  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xms4g -Xmx4g -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/tmp/heapTest.log  sinaif-XX .jar

    • step2: 采用系统Linux命令top 查看Java进程内存使用情况;看下这个内存占用情况;举例:系统内存为8G,启动堆内存分配4G, 通过top命令看下Java进程内存占用是否超过50%
    • step3:再通过 top -Hp pid 查看具体线程占用系统资源
    • step4: 通过jstack pid 查看具体线程的堆栈信息,排除是否有死锁或者I/O阻塞的问题(检查CPU的使用率和负载情况)
    • step5:通过 jmap -heap pid  查看堆内存的使用情况,看下老年代的内存是否没有可分配空间
    • step6: 基本定位出内存泄漏后,具体分析看是什么对象引起的;
    • step7:jmap -histo:live pid 查看存活对象数量,找出最大的5个对象进行分析
    • step8: 把step1 设置的堆内存异常文件:heapdump.hprof  下载本地导入到Eclipse MAT 进行分析
    • step9:导入MAT一般会有提示的:

    点击进入到 Histogram 页面,可以查看到对象数量排序,我们可以看到 Byte[] 数组排在了第一位,选中对象后右击选择 with incomming reference 功能,可以查看到具体哪个对象引用了这个对象;

    • step10:找到代码引用的地方,进行优化
  • 相关阅读:
    CCF201612-2 工资计算(100分)
    CCF201612-2 工资计算(100分)
    CCF201609-2 火车购票(100分)
    CCF201609-2 火车购票(100分)
    CCF201604-2 俄罗斯方块(100分)
    CCF201604-2 俄罗斯方块(100分)
    CCF201312-2 ISBN号码(100分)
    CCF201312-2 ISBN号码(100分)
    JSP---Sql Jdbc和MySql Jdbc
    JS---正则表达式验证
  • 原文地址:https://www.cnblogs.com/a393060727/p/11507908.html
Copyright © 2011-2022 走看看