java内存管理的分析

  java 中的内存分为四个部分:
  
  stack(栈):存放基本类型的数据和对象的引用,即存放局部变量。
  
  Note:
  
  如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中。
  
  如果存放的是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)。
  
  heap(堆)存放 new 出来的东西。
  
  data segment(数据区):分为静态区和常量区(常量池)
  
  静态区(static segment):
  
  存放在对象中用 static 定义的静态成员(即静态变量,如果该静态变量是基本类型变量,则将变量名和值都存入静态区中,如果是引用类型则指向 new 出来的对象。
  
  常量池(constant pool):
  
  存放在编译期被确定,并被保存在已编译的 .class 文件中的一些数据。如代码中基本类型和引用类型(String、Class、数组、Integer等包装类)的常量值(final)。此外,这里还存放一些以文本形式出现的符号引用(如:字段的名称和描述符、方法的名称和描述符、类和接口的全限定名)。
  
  code segment(代码区):存放代码。
  
  【图示】
  
  1:注意比较静态变量和非静态变量的变量名、变量值所存储位置的区别:
  
  2:对于值相同的 String 常量,在 constant pool 中只会创建一个。
  
  对于 String s3 = new String("s3");
  
  创建了两个 String 对象,一个是在编译期间通过""双引号创建的,另一个是在运行期间 new 出来的。

猜你喜欢

转载自www.cnblogs.com/whzhao2000/p/12769765.html