JVM--堆内存-实例溢出练习

1.JVM–堆内存OOM_实例溢出

练习内容:java.lang.OutOfMemoryError: Java heap space

代码:代码出自《深入理解java虚拟机》

/*
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
 */
public class HeapOOM {
	static class OOMObject{
	}
	public static void main(String[] args) {
		List<OOMObject> oomlist=new ArrayList<>();
		while(true) {
			if(	oomlist.size() %1000 == 0) {
				System.out.println(oomlist.size());
			}
			oomlist.add(new OOMObject());
		}
	}

}

内存设置:eclipse:run as—>run configurations–>Arguments
用注释的即可。
在这里插入图片描述
日志情况:
1822000
1823000
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid3644.hprof …
Heap dump file created [61455147 bytes in 0.180 secs]
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at jvm.HeapOOM.main(HeapOOM.java:18)

异常后,由于设置 -XX:+HeapDumpOnOutOfMemoryError,会产生dump文件
dump文件:默认在项目主目录下
F:\EB-Worker\test\My\java_pid9660.hprof
dump分析:可以使用 VisualVM.exe,jdk自带工具,选择dump文件即可分析

基础信息
在这里插入图片描述
实例情况:
在这里插入图片描述
根据代码,new 了很多 oomobject 。此外用arraylist存储,是object[]

2.常量池溢出
代码:代码出自《深入理解jvm虚拟机》
书中代码针对的是jdk 1.6版。当时 常量存放于永久代。故而可以试验出来。
但是现在实验是 1.8版,取消了永久代的概念。我们不加参数,开始跑。结果如下:

/*
 * VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M
 */
public class RuntimeConstantPoolOOM {
   public static void main(String[] args) {
	   //保持引用
	   List<String> list = new ArrayList<>();
	   int i=0;
	   while(true) {
		   //intern方法:native,如果常量池存在则返回,否则新增
		   list.add(String.valueOf(i++).intern());
		   if(i%1000==0) {
			   System.out.println(i);
		   }
	   }
   }
}

在这里插入图片描述说明常量 存放于 堆中。因此
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

异常如下:

316000
317000
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid13464.hprof ...
Heap dump file created [25236182 bytes in 0.143 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

补充:
1.8版,取消了永久代的概念,增加了mataspace,不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。

 通过 -XX:MetaspaceSize=40M ,-XX:MaxMetaspaceSize来控制大小(如果初始化时类加载很多,可以初始化下。否则会出现多次GC,然后该区域内存扩充)

推荐:https://www.cnblogs.com/duanxz/p/3520829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值