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. jquery实现文字选择器

     $( "div:contains('John')" ).css( "text-decoration", "underline" ); 

  2. 自动添加注释—VS2010宏的使用

    在敲代码的过程中类和函数都需要进行注释,但总是一遍一遍的复制粘贴觉得很是麻烦,终于找到了一个不错的解决方法:使用宏. 所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务.在日常的办公环境 ...

  3. C# 数据库dataGridView刷新数据和主外键判断

    本文主要讲诉在使用VS2012+SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改.删除.插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会 ...

  4. MPAndroidChart绘制图形表

    最近一个项目需要用到表格进行统计显示,本来用的是的achartengine,后来发现一个更加强大的开源框架MPAndroidChart. 下面简单介绍下MPAndroidChart,MPAndroid ...

  5. PHP+jQuery实现翻板抽奖

    翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息.看似简单的一个操作过程,却包含着WEB技术的很多知识面 ...

  6. Spring-----Assert断言工具类

    转载自:http://blog.csdn.net/hekewangzi/article/details/51956577

  7. Linux学习之查找命令汇总

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  8. Linux学习之nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  9. Javascript 字符串浏览器兼容问题

    先看下不兼容的写法,若我想获取某个字符串的第几位 var str='aavvvcc'; console.info(str[0]); 这种写法 在IE 7以下的浏览器都不兼容,以下提供浏览器全兼容的方式 ...

  10. Nodejs学习笔记——Assert(断言)

    Assert - a:actual e:expected m:message o:operator v:value b:block assert.fail(a, e, m, o) assert(v, ...