JVM内存分布

一、简介

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)以栈帧的形式压如栈中,一个方法的结束通常伴随着栈帧的弹出,而堆中的数据则需要进行清理

下楼吃饭~