Java内存机制

来源:互联网 发布:js统计按钮点击次数 编辑:程序博客网 时间:2024/05/16 15:07
笔记:Java内存管理  Java内存机制
所有的程序在运行的时候才进行内存的实际分配,在编译期间只是进行内存分配的规划。


1、程序计数器:当前进程所执行的字节码的行号指示器
2、Java栈/Java虚拟栈:Java中方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧。
3、本地方法栈
4、Java堆:存放对象实例和数组。存放类的引用数据类型,成员方法不会存放在该区域。
5、方法区(又叫静态区):用于存储已被虚拟机加载的信息(包括类的名称、方法信息、字段信息)、常量、静态变量、以及编译器编译后的代码等数据。
          运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用符号引用就是编码是用字符串表示某个变量、接口的位置,直接引用就是根据符号引用翻译出来的地址,将在类链接阶段完成翻译;运行时常量池除了存储编译期常量外,也可以存储在运行时间产生的常量(比如String类的intern()方法,作用是String维护了一个常量池,如果调用的字符“abc”已经在常量池中,则返回池中的字符串地址,否则,新建一个常量加入池中,并返回地址)。
6、直接内存:JVM以外的机器内存。
7、(1)局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储与堆中。
     (2)成员变量全部存储于堆中(包括基本类型,引用和引用的对象实体)
public class Sample {       int s1 = 0;       Sample mSample1 = new Sample();       public void method() {           int s2 = 1;           Sample mSample2 = new Sample();       }   }   Sample mSample3 = new Sample();

Sample 类的局部变量 s2 和引用变量 mSample2 都是存在于栈中,但 mSample2 指向的对象是存在于堆上的。 

mSample3 指向的对象实体存放在堆上,包括这个对象的所有成员变量 s1 和 mSample1,而它自己存在于栈中。

8、java内存可以分为四个区:

(1)堆区

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

(2)栈区

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

(3)方法区(静态区)

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

(4)代码区:存放代码


0 0
原创粉丝点击