Java栈,PC寄存器,本地方法栈,堆,方法区(静态区)和运行常量池

详情参考:https://my.oschina.net/wangsifangyuan/blog/711329

前言:当要判断一个变量存在什么空间上哪儿时,先分析它是哪一种(是实例变量还是局部变量),实例变量存在于所属的对象中,因此在创建对象后才存在,存在于堆上

   如果为局部变量,局部变量是被声明在方法中的,它是暂时的,且生命周期只限于方法被放于栈上的这段期间(方法调用至执行完毕),因此存在于上;

堆区: 

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


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


方法区: 
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

 注意容易入坑的地方:

    1、栈上只保存基础数据类型的对象和自定义对象的引用(对的),但是不是说基础数据类型的对象和自定义对象的引用只保存在栈上(这是错的)

1 public class Student{
2     private int age;
3}
1  public void go(){
2      Student students[] = new Student[3];
3      students[0] = new Student();
4      students[0].age = 20;
5      students[1] = new Student();
6      students[1].age = 20;
7      students[2] = new Student();
8      students[2].age = 20;
9    int a = 10;
10 }

 

 

 

      

posted on 2017-10-15 00:37  琼biu~~  阅读(5631)  评论(0编辑  收藏  举报