堆内存的溢出案例分析

简介: 堆内存的溢出案例分析

为了针对性研究堆内存溢出问题,专门准备了一段程序:

import java.util.ArrayList;
import java.util.List;
public class Jvm1_5 {
    public static void main(String[] args) {
        int i=0;
        try{
            List<String> list=new ArrayList<>();
            String a="hello";
            while (true){
                list.add(a);
                a=a+a;
                i++;
            }
        }catch (Throwable e){
            System.out.println(i);
            e.printStackTrace();
        }
    }
}

得到如下结果:

26
java.lang.OutOfMemoryError: Java heap space
  at java.util.Arrays.copyOf(Arrays.java:3332)
  at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
  at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
  at java.lang.StringBuilder.append(StringBuilder.java:136)
  at Jvm1_5.main(Jvm1_5.java:13)

Process finished with exit code 0

首先对内存溢出的提示是Java heap space,我们的程序在每一次循环中不段进行拼接,并且添加到我们的list中,内存并不会被释放,导致了堆内存溢出。

我们添加jvm参数-Xmx7m再运行:

17
java.lang.OutOfMemoryError: Java heap space
  at java.util.Arrays.copyOf(Arrays.java:3332)
  at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
  at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
  at java.lang.StringBuilder.append(StringBuilder.java:136)
  at Jvm1_5.main(Jvm1_5.java:13)

这次发现循环了17次,堆空间就不够了,这也引起我们的思考,有时候我们内存设置比较大,所以运行一段时间空间也还是发现不了。我们可以把内存设置小一点,就可以尽早暴露堆内存的问题。

目录
相关文章
|
1月前
|
存储 程序员 C++
C++堆内存分配
C++堆内存分配
27 2
|
24天前
|
Java Linux
JVM堆内存诊断
JVM堆内存诊断
21 0
|
1月前
|
存储 安全 Java
synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor
本文分析的问题: 1. synchronized 字节码文件分析之 monitorenter、monitorexit 指令 2. 为什么任何一个Java对象都可以成为一把锁? 3. 对象的内存结构 4. 锁升级过程 (无锁、偏向锁、轻量级锁、重量级锁) 5. Monitor 是什么、源码查看(hotspot虚拟机源码) 6. JOL工具使用
|
8天前
|
程序员 C语言 C++
【C语言基础】:动态内存管理(含经典笔试题分析)-2
【C语言基础】:动态内存管理(含经典笔试题分析)
|
8天前
|
程序员 编译器 C语言
【C语言基础】:动态内存管理(含经典笔试题分析)-1
【C语言基础】:动态内存管理(含经典笔试题分析)
|
1天前
|
缓存 Java Linux
Android 匿名内存深入分析
Android 匿名内存深入分析
6 0
|
25天前
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
15天前
|
Java
JDK8中JVM堆内存划分
JDK8中JVM堆内存划分
14 0
|
1月前
|
存储 程序员 数据处理
指针与堆内存
指针与堆内存
24 0
|
1月前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
22 0

热门文章

最新文章