package com.xiaoysec.test;

import java.util.ArrayList;
import java.util.List; /**
*VM Args:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
* @author xiaoysec
*
*/
public class HeapOOM {
static class OOMObject{
//定义一个静态内部类
}
public static void main(String[] args){
List<OOMObject> list = new ArrayList<HeapOOM.OOMObject>();
//int i=0;
while(true){
list.add(new OOMObject());
//System.out.println(i);
//i++;
}
}
}

代码是相当简单的,就是一个HeapOOM类进行HeapOutofMemory测试,在该类里面有一个静态内部类OOMObject

主要的思想就是在main方法里面用一个死循环不停地创建对象我们知道java对象是在java堆里面的当堆内存不足的时候虚拟机会进行垃圾回收,但是当虚拟机发现这些对象还是有用的不能被回收时,就扩展堆空间,但在本例当中有一个while(true)也就是说即使扩展了空间也是没用的!

值得一提的是我们需要在VM arguments中设置 -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8也就是把堆的最大最小值设置为相同的20M以避免堆进行自动扩展

下面就是运行结果:

[GC (Allocation Failure) [PSYoungGen: 7882K->1000K(9216K)] 7882K->5433K(19456K), 0.0100414 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) --[PSYoungGen: 9192K->9192K(9216K)] 13625K->19424K(19456K), 0.0155543 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 
[Full GC (Ergonomics) [PSYoungGen: 9192K->0K(9216K)] [ParOldGen: 10232K->10051K(10240K)] 19424K->10051K(19456K), [Metaspace: 2756K->2756K(1056768K)], 0.2144901 secs] [Times: user=0.36 sys=0.00, real=0.21 secs] 
[Full GC (Ergonomics) [PSYoungGen: 7635K->8076K(9216K)] [ParOldGen: 10051K->7940K(10240K)] 17687K->16017K(19456K), [Metaspace: 2756K->2756K(1056768K)], 0.1848934 secs] [Times: user=0.37 sys=0.00, real=0.18 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 8076K->8076K(9216K)] [ParOldGen: 7940K->7940K(10240K)] 16017K->16017K(19456K), [Metaspace: 2756K->2756K(1056768K)], 0.1011278 secs] [Times: user=0.33 sys=0.00, real=0.10 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at com.xiaoysec.test.HeapOOM.main(HeapOOM.java:20)
[Full GC (Ergonomics) [PSYoungGen: 8192K->0K(9216K)] [ParOldGen: 7940K->656K(10240K)] 16132K->656K(19456K), [Metaspace: 2781K->2781K(1056768K)], 0.0056287 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 9216K, used 82K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 8192K, 1% used [0x00000000ff600000,0x00000000ff614938,0x00000000ffe00000)
  from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
  to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
 ParOldGen       total 10240K, used 656K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  object space 10240K, 6% used [0x00000000fec00000,0x00000000feca4310,0x00000000ff600000)
 Metaspace       used 2787K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 307K, capacity 386K, committed 512K, reserved 1048576K

java堆溢出的小栗子的更多相关文章

  1. java网络爬虫爬虫小栗子

    简要介绍: 使用java开发的爬虫小栗子,存储到由zookeeper协调的hbase中 主要过程是模拟Post请求和get请求,html解析,hbase存储 源码:https://github.com ...

  2. java堆溢出

    java堆是用来存储对象实例的:只要不断创建对象,GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,当对象数量达到最大堆的容量限制的时候就会产生内存溢出异常.异常对战信息为OutOf ...

  3. OutOfMemoryError异常——Java堆溢出。

    https://blog.csdn.net/en_joker/article/details/79726975 (将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数- ...

  4. File Space——一个java structs2.0的小栗子(DIY)

    1 概述 File Space系统适用于团体,主要提供的是团队文件分享以及个人文件的存储管理服务.分为个人文件存储管理平台和团队文件共享平台. 个人文件存储平台主要为个人提供相关的文件分类存储服务:该 ...

  5. (转)《深入理解java虚拟机》学习笔记2——Java内存溢出实例

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

  6. Java内存溢出示例

    按照java内存的结构,发生内存溢出的地方常在于堆.栈.方法区.直接内存. 一.堆溢出 堆溢出原因莫过于对象太多导致,看代码: /** * java 堆溢出 * VM Args:-Xms20m -Xm ...

  7. Java内存溢出分析方法(Eclipse Memory Analyzer 使用简单入门)

    转载至:http://outofmemory.cn/java/jvm/OutOfMemoryError-analysis 工具 安装Memory Analyse Tools(MAT) 工具, 可以直接 ...

  8. Java内存溢出异常(上)

    上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域 ...

  9. Java 内存溢出分析

    原文地址:Java 内存溢出分析 博客地址:http://www.moonxy.com 一.前言 Java 的 JVM 的内存一般可分为 3 个区:堆(heap).栈(stack)和方法区(metho ...

随机推荐

  1. 一,入门基础—— 2. 第一个project项目

    1. 欢迎界面的右边是一个项目列表,显示全部近期打开的项目,双击⭕️打开之前创建的项目. 2.右击⭕️处,选择"Add Files to DemoApp..."加入一张图片. 3. ...

  2. Effective C++ 条款18

    让接口easy被正确使用,不easy被误用 如题目,我们自己的程序接口是面向用户的,程序的目的不可是解决这个问题,并且要让用户easy使用.所以.必须保证我们的程序接口具有非常强的鲁棒性. 怎么保证接 ...

  3. json具体解释

    <span style="font-size:12px;">function testJson() { var jsonData = { "firstName ...

  4. 通过自定义注解反射生成SQL语句

    ----------------------------------------Program.cs---------------------------------------- using Sys ...

  5. CDH(cdh5.7) 上集成 kafka

    CDH 可以在线下载: 离线安装

  6. poj2891--扩展欧几里德算法

    /* 该题使用的是扩展欧几里德算法,求模线性同余方程: 分析题目:以题目输出结果为例 ,要求得到一个整数X可以满足 X % a = r,a,r,为数组名: 设数组元素为两个时, 列出方程:X % a1 ...

  7. 浅谈树链剖分(C++、算法、树结构)

    关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013 ...

  8. Notes里OK,CANCEL按钮的设定

    message并不能达到想要的目的: If Not udoc Is Nothing Then        'MessageBox "既にデータがあります.先月のデータを削除してください.& ...

  9. tr删除替换详解

    tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换. 语法:tr  [–c/d/s/t] [SET1] [SET2]    #SET1: 字符集1: SET2:字符集2 -c: ...

  10. 【Chromium中文文档】Chromium多进程架构

    多进程架构 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//Start_Here_Background_Readin ...