深入理解Java虚拟机笔记1: OOM实战

本文深入探讨了Java虚拟机的内存溢出问题,包括Java堆、虚拟机栈和本地方法栈、方法区与运行时常量池以及本机直接内存的溢出现象。通过代码示例模拟各种场景,分析了不同区域溢出的原因和解决方案,帮助读者理解Java内存管理。
摘要由CSDN通过智能技术生成

通过代码模拟Java虚拟机规范中描述的各个运行时区域内存溢出的场景。

1. Java堆溢出

首先,虚拟机启动参数配置如下:

-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

其中,-verbose:gc表示输出虚拟机中GC的详细情况。-Xms20M -Xmx20M最小堆内存20M,最大堆内存20M。-Xmn10M设置新生代的容量10M。-XX:+PrintGCDetails打印GC详细信息,-XX:SurvivorRatio=8年轻代中Eden区与Survivor区的大小比值。

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 
 * VM Args:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 * @author 作者 zhuyiquan90
 * @created 2017-9-1 上午11:46:34
 * @version 1.0.0
 * @date 2017-9-1 上午11:46:34
 */
public class HeapOOM {
   

    static class OOMObject {

    }

    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<OOMObject>();

        while (true) {
            list.add(new OOMObject());            
        }
    }

}

输出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2245)
    at java.util.Arrays.copyOf(Arrays.java:2219)
    at java.util.ArrayList.grow(ArrayList.java:213)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
    at java.util.ArrayList.add(ArrayList.java:411)
    at HeapOOM.main(HeapOOM.java:15)
Heap
 def new generation   total 9216K, used 8920K [0x32570000, 0x32f70000, 0x32f70000)
  eden space 8192K, 100% used [0x32570000, 0x32d70000, 0x32d70000)
  from space 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值