JVM运行时数据区详解-Heap堆(优化配置、代码样例)
来源:互联网 发布:淘宝假货店铺名单2017 编辑:程序博客网 时间:2024/05/21 09:43
在Java虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
方法区是被所有线程共享,该区域保存所有字段和方法字节码,以及一些特殊方法如构造函数,
接口代码也在此定义。
PC Register 程序计数器
每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取
下一条指令。
Native Method Stack 本地方法栈
Java虚拟机实现应当提供给程序员或者最终用户调节Java堆初始容量的手段,对于可以动态扩展和收缩Java堆来说,则应当提供调节其最大、最小容量的手段。
Java堆可能发生如下异常情况:
如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常。
同样通过代码来理解一下
/**
* 循环创建新对象,构造<p>java.lang.OutOfMemoryError: Java heap space</p>异常
*
* @author lihzh
* @alia OneCoder
* @blog http://www.coderli.com
*/
private
static
void
getHeapOutOfMemoryError() {
int
count =
0
;
List list =
new
LinkedList<>();
for
(;;) {
System.out.println(count++);
list.add(
new
Object());
}
}
不停的创建新的对象,来使堆内存溢出。启动参数设置:-Xmx2m
运行结果:
178702
178703
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
大概17w左右开始内存溢出。增大参数看看效果,-Xmx10m
305677
305678
305679
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
由此可见,通过设置-Xmx参数,可以调整JVM中堆的大小,从而可以在内存中保存更多的对象。
再看看另一种OutOfMemoryError: java.lang.OutOfMemoryError: PermGen space。
同样是,通过代码构造一个PermGen space的异常。(OneCoder认为,你会构造出异常,自然就会慢慢理解这个异常是怎么产生的,什么参数会对这个有影响。)
由于PermGen space一般发生在预加载类的过程中,所以OneCoder这里利用tomcat启动来进行测试。设置Tomcat 启动参数为:-server -XX:MaxPermSize=2m -XX:PermSize=2m
java.lang.OutOfMemoryError: PermGen space
at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:608)
果然发生PermGen space异常。如果你逐渐放大该配置,会发现报错的时机逐渐推后,也就是可以加载更多的类。OneCoder给tomcat指定一个合理的值比如: -server -XX:MaxPermSize=64m -XX:PermSize=64m
程序即可重新启动了。
你也可以多做一些试验,验证你的想法,所谓实践出真知。
概念参考:Java虚拟机规范
慢慢琢磨JVM
如非特别注明,本站内容均为OneCoder原创,转载请务必注明作者和原始出处。
本文地址:http://www.coderli.com/jvm-heap-code-overflow
- JVM运行时数据区详解-Heap堆(优化配置、代码样例)
- JVM Heap堆
- Jvm 运行时数据区域详解
- JVM学习04:运行时数据区域-JAVA堆
- java--jvm--jvm运行时数据区
- JVM运行时数据区
- JVM 运行时数据区
- JVM运行时数据区
- JVM运行时数据区
- JVM-运行时数据区
- JVM运行时数据区
- JVM 运行时数据区
- jvm运行时数据区
- jvm运行时数据区
- JVM运行时数据区
- JVM运行时数据区
- JVM运行时数据区
- JVM运行时数据区
- 25个增强iOS应用程序性能的提示和技巧--中级篇
- Nginx下防御HTTP GET FLOOD(CC)攻击
- 商店管理系统源代码(九)
- Oracle数据块原理深入剖析-入门基础
- 海量数据处理 算法总结
- JVM运行时数据区详解-Heap堆(优化配置、代码样例)
- 25个增强iOS应用程序性能的提示和技巧--高级篇
- 湖南工业大学个人选拔赛第一场 解题报告
- 2013-04-12
- Linux C内存泄露检测工具
- 商店管理系统源代码(十)
- .net导出excel
- 如何保证上传文件的安全性
- 静态函数,静态数据成员运用