JVM的内存 堆(heap)、栈(stack)和方法区(method)

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 

堆区: 
1.存储的所有是对象,每一个对象都包含一个与之对应的class的信息。(class的目的是获得操做指令) 
2.jvm只有一个堆区(heap)被全部线程共享,堆中不存放基本类型和对象引用,只存放对象自己 
jvm


栈区: 
1.每一个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 
2.每一个栈中的数据(原始类型和对象引用)都是私有的,其余栈不能访问。 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操做指令区(存放操做指令)。 
spa


方法区: 
1.又叫静态区,跟堆同样,被全部的线程共享。方法区包含全部的class和static变量。 
2.方法区中包含的都是在整个程序中永远惟一的元素,如class,static变量。 
线程

 

对于局部变量,若是是基本类型,会把值直接存储在栈;若是是引用类型,好比String s = new String("william");会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。
再如
String s1 = new String(“william”);
String s2 = s1;
s1和s2同为这个字符串对象的实例,可是对象只有一个,存储在堆,而这两个引用存储在栈中。

类的成员变量在不一样对象中各不相同,都有本身的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,做为一个总体存储在堆。而类的方法倒是该类的全部对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。
相关文章
相关标签/搜索