前言
本笔记作为jvm学习系列的第一篇,对jvm的内存区域的划分做一个简单介绍。
以前总想着用一篇大文章大面积的总结jvm的笔记,但是这样却使得后面的笔记难以下笔,并且对之前大篇的笔记也不好维护。所以,现在想把原本大的jvm笔记拆分成很多篇小章节,也方便以后对文章的重新修正与维护。
java内存区域
example
每次重看笔记,我总喜欢来一段简单的 java
代码片段,以此,来唤起因为上班拧螺丝而忘记了许久的,初学 java
时的记忆。
//运行时, jvm把TestObjectCreate的信息都放入方法区
public class TestObjectCreate {
//main方法本身放入方法区
public static void main(String[] args) {
Sample test1 = new Sample("测试1");
//test1是引用,所以放到栈区里,Sample是自定义对象应该放到堆里面
Sample test2 = new Sample("测试2");
test1.printName();
test2.printName();
}
}
//运行时, jvm把Sample的信息都放入方法区
class Sample {
//new Sample实例后,name引用放入栈区里,name对象放入堆里
private String name;
public Sample(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
在创建对象过程中, 栈 、 堆 、 方法区 的交互图如下,
java 内存区域划分
java
的内存划分成两大区域: 线程独占区和线程共享区 。
线程独占区:虚拟机栈、本地方法栈、程序计数器
线程共享区:堆、方法区