一、简介
JVM是一个老生常谈的问题了,所以篇中的内容,更多的是为了复习总结。
二、JVM内存分布
整理了一张脑图,这里只是对jvm的描述,在不同的jvm中也可能会有变动
三、部分数据流转
代码如下:
public class MyClass { public static void main(String agrs[]){ int first_num = 0; TestStackAndHeap testStackAndHeap = new TestStackAndHeap(); testStackAndHeap.test = 1; testStackAndHeap.tests[100]++; } }
public class TestStackAndHeap { public int []tests; public int test; public TestStackAndHeap(){ tests = new int[1000]; for(int i = 0;i<tests.length;i++) { tests[i] = i; } } }
内存图:
1、在主方法中进行声明的first_num自然是保存在stack中
2、图中忽略了创建时,调用TestStackAndHeap的构造方法,本质是在int数据指向的为位于java heap中testStackAndHeap实例中的数据部分。数据计算完成后最终会放置在位于堆中的实例数据中。
3、当堆tests[100]进行运算时,首先需要做的是将数据从堆中copy一份入栈,运算完毕在进行出栈刷新至堆中对应区域,由于这个过程并非原子操作,所以线程同步时需要加锁。
4、这里没有提到字符串,字符串位于常量池中,jvm1.7以上常量池位于heap中
5、栈和堆以及方法区都会出现溢出,前者对应的stackoverflow,后两者对应的是oom
6、方法(method)以栈帧的形式压如栈中,一个方法的结束通常伴随着栈帧的弹出,而堆中的数据则需要进行清理
下楼吃饭~