Java基础之堆内存溢出的解决

 更新时间:2021年05月10日 10:37:11   作者:eddie_k2  
这篇文章主要介绍了Java基础之堆内存溢出的解决,文中有非常详细的图文示例及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下

一、实战-内存溢出

  • 堆内存溢出
  • 栈内存溢出
  • 方法区溢出
  • 直接内存溢出

二、实战-堆内存溢出

  • 演示堆内存溢出代码,并且定位问题
  • 总结堆内存溢出的场景与解决方案
  • 分析商城项目中可能存在堆内存溢出的代码并且解决

三、堆内存溢出演示代码

public class HeapOOMTest {
    private List<String> oomList = new ArrayList<>();

    public static void main(String[] args) {
        HeapOOMTest oomTest = new HeapOOMTest();
        while (true) {
            oomTest.oomList.add(UUID.randomUUID().toString());
        }
    }
}

VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

运行该代码的Main方法

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid18940.hprof ...
Heap dump file created [23854536 bytes in 0.061 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.base/java.lang.Long.fastUUID(Long.java:441)
	at java.base/java.lang.System$2.fastUUID(System.java:2136)
	at java.base/java.util.UUID.toString(UUID.java:395)
	at com.imooc.jvminaction.HeapOOMTest.main(HeapOOMTest.java:16)

在项目的根目录会自动创建 java_pid18940.hprof 的文件

Mac系统:mat.app

Win系统:Eclipse Memory Analyzer

四、Eclipse Memory Analyzer 分析流程

  • File -> Open Heap Dump,加载刚才产生的hprof文件,选择Leak Suspects Report
  • 在Overview, 鼠标移动到拼图,可以看出
  • java.lang.Thread @ 0xff1dbc28 main
  • Shallow Size: 120 B RetainedSize: 10.9 MB (明显不正常的)
  • 点击 ++Leak Suspects:++ includes leak suspects and a system overview.
  • Problem Suspect 1 会提示方法占用空间的百分比
  • 点击 Details » Accumulated Objects in Dominator Tree
  • 点击 java.lang.Object[160065] @ 0xffe00000
  • List objects --> with incoming references (别人调用自己)

Leak Suspects » Leaks » Problem Suspect 1 » Description » See stacktrace 也是可以看出问题的

图片.png

jvisualvm.exe 分析堆内存溢出

图片.png

图片.png

图片.png

五、堆内存溢出的场景

  • 内存泄露

借助工具定位问题

  • 非内存泄露

-Xms -Xmx 分配不合理

六、商城项目可能存在堆内存溢出的方法

1.通过控制pageSize判断

if (pageSize > 100) {
    pageSize = 100;
}

2.SpringMVC方式

类头加注解

@Validated

pageSize的入参加注解

@Max(100)

图片.png

到此这篇关于Java基础之堆内存溢出的解决的文章就介绍到这了,更多相关Java解决堆内存溢出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Eureka源码阅读解析Server服务端启动流程实例

    Eureka源码阅读解析Server服务端启动流程实例

    这篇文章主要为大家介绍了Eureka源码阅读解析Server服务端启动流程实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 详解java之redis篇(spring-data-redis整合)

    详解java之redis篇(spring-data-redis整合)

    本篇文章主要介绍了java之redis篇,主要详细的介绍了spring-data-redis整合,有兴趣的可以了解一下。
    2017-01-01
  • JavaWeb servlet实现下载与上传功能的方法详解

    JavaWeb servlet实现下载与上传功能的方法详解

    这篇文章主要介绍了JavaWeb servlet实现下载与上传功能的方法,结合实例形式详细分析了JavaWeb servlet实现下载与上传功能的原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-04-04
  • springboot /tmp 临时目录的具体实现

    springboot /tmp 临时目录的具体实现

    springboot应用服务再启动的时候,会在操作系统的/tmp目录,本文主要介绍了springboot /tmp 临时目录的具体实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Gson如何序列化内部类

    Gson如何序列化内部类

    本文介绍如何使用Gson对成员内部类及静态内部类进行序列化/反序列化,帮助大家更好的理解和使用gson库,感兴趣的朋友可以了解下
    2020-11-11
  • Java处理多API请求的方法详解

    Java处理多API请求的方法详解

    Java 中的并发是指语言并行运行多个线程的能力,允许同时执行多个任务,
    2023-10-10
  • 基于zipoutputStream的简单使用

    基于zipoutputStream的简单使用

    这篇文章主要介绍了基于zipoutputStream的简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 浅谈java的接口和C++虚类的相同和不同之处

    浅谈java的接口和C++虚类的相同和不同之处

    下面小编就为大家带来一篇浅谈java的接口和C++虚类的相同和不同之处。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
    2016-12-12
  • SpringBoot如何实现starter原理详解

    SpringBoot如何实现starter原理详解

    这篇文章主要介绍了SpringBoot如何实现starter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中遍历ConcurrentHashMap的四种方式详解

    Java中遍历ConcurrentHashMap的四种方式详解

    这篇文章主要介绍了Java中遍历ConcurrentHashMap的四种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论