文档章节

Java虚拟机运行时数据区

ksfzhaohui
 ksfzhaohui
发布于 2014/08/09 14:15
字数 530
阅读 351
收藏 10
 java虚拟机运行时数据区总结了一张图片,方便记忆:

OutOfMemoryError异常:

1.java堆溢出
测试:java堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免自动扩展,然后不停的创建对象。
结果:java.lang.OutOfMemoryError:Java heap space...

2.运行时常量池溢出
测试:通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制了常量池的容量,然后通过String类的intern()方法来填充常量池。
结果:java.lang.OutOfMemoryError:PermGen space

3.方法区溢出
测试:同上通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,然后借助CGLib直接操作字节码运行时,生成大量的动态类。
结果:java.lang.OutOfMemoryError:PermGen space

4.虚拟机栈和本地方法栈溢出
测试:栈容量是由-Xss参数设定
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError
如果虚拟机在扩展栈时无法申请到足够的内存空间则抛出OutOfMemoryError

/**
 * VM Args:-Xss128k
 * 
 * @author ksfzhaohui
 * 
 */
public class JavaVMStackSOF {
	private static Log logger = LogFactory.getLog(JavaVMStackSOF.class);
	private int stackLength = 1;

	public void stackLeak() {
		stackLength++;
		stackLeak();
	}
	public static void main(String[] args) {
		JavaVMStackSOF oom = new JavaVMStackSOF();
		try {
			oom.stackLeak();
		} catch (Throwable e) {
			logger.info("stack length:" + oom.stackLength);
			logger.error(e);
		}
	}
}

在单个线程下,无论是由于栈帧太大,还是虚拟机栈容量太小,当内存无法分配是,虚拟机都抛出StackOverflowError。
如果测试不限于单线程,通过不断的建立线程的方式倒是可以产生OutOfMemoryError

/**
 * VM Args:-Xss2M
 * 
 * @author ksfzhaohui
 * 
 */
public class JavaVMStackOOM {

	private void dontStop() {
		while (true) {

		}
	}
	public void stackLeakByThread() {
		while (true) {
			Thread thread = new Thread(new Runnable() {

				@Override
				public void run() {
					dontStop();
				}
			});
			thread.start();
		}
	}

	public static void main(String[] args) throws Throwable {
		JavaVMStackOOM oom = new JavaVMStackOOM();
		oom.stackLeakByThread();
	}
}


5.本机直接内存溢出

测试:通过-XX:MaxDirectMemorySize直接内存,通过ByteBuffer.allocateDirect方法分配内存,查看DirectByteBuffer类,其实内部真正分配内存的是UnSafe类 

/**
 * -Xmx20m -Xms20m -XX:MaxDirectMemorySize=10m
 * 
 * @author ksfzhaohui
 * 
 */
public class DirectMemoryOOM {

	private static final int _1MB = 1024 * 1024;

	public static void main(String[] args) throws IllegalArgumentException,
			IllegalAccessException {
		Field unsafeField = Unsafe.class.getDeclaredFields()[0];
		unsafeField.setAccessible(true);
		Unsafe unsafe = (Unsafe) unsafeField.get(null);
		while (true) {
			unsafe.allocateMemory(_1MB);
		}
	}
}
结果: java.lang.OutOfMemoryError

参考:深入java虚拟机

© 著作权归作者所有

ksfzhaohui

ksfzhaohui

粉丝 396
博文 149
码字总数 213996
作品 3
南京
高级程序员
私信 提问
用Java实现JVM第四章《运行时数据区》

案例介绍 本案例初步实现运行时数据区里;线程、Java虚拟机栈、帧、操作数栈、局部变量表。 在运行Java程序时,Java虚拟机需要使用内存来存放各种各样的数据。Java虚拟机规范把这些内存区域叫...

付政委
04/27
0
0
JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体...

王磊的博客
01/14
165
0
经典面试题|讲一讲JVM的组成

JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成。 首先来说 JVM 的组成分为,整体组成部分和运行时...

程序猿院长
04/15
26
0
001. 深入JVM学习—Java运行流程

Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存到栈...

影狼
2018/06/22
101
0
Java虚拟机运行时数据区结构

本文部分参考自《Java虚拟机规范(Java SE 7版)》的中译本和周志明的《深入理解Java虚拟机》,另加个人理解。原书对Java虚拟机运行时数据区描述只有6页,同时参考其他网络网资料,个人能力所...

foodon
2014/12/09
367
4

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
13分钟前
1
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
22分钟前
1
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
23分钟前
1
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
28分钟前
1
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部