Java 内存分区

Java 内存分区主要分5个方面

1.程序计数器  又叫程序寄存器 线程私有 

JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)。如果线程正在执行的是一个Java方法(非native),那么PC寄存器的值将总是指向下一条将被执行的指令,如果方法是 native的,程序计数器寄存器的值不会被定义。 JVM的程序计数器寄存器的宽度足够保证可以持有一个返回地址或者native的指针。

 

2.Java栈   线程私有  

JVM为每个新创建的线程都分配一个栈。也就是说,对于一个Java程序来说,它的运行就是通过对栈的操作来完成的。栈以帧为单位保存线程的状态。JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。我们知道,某个线程正在执行的方法称为此线程的当前方法。我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧,这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数、局部变量、中间计算过程和其他数据。从Java的这种分配机制来看,堆栈又可以这样理解;局部变量和对象引用都是放在栈区,代码运行完就会被自动回收。

 

3.Java堆  线程共享

成员变量 是属于对象所有的 所以是放在堆区  对象本身也是放在堆区  这是是JavaGC的核心 不会自动回收 

jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,对象在这里被分配内存.

 

4. 方法区  线程共享

当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把这些类型信息(包括类信息、常量、静态变量等)放到方法区中,该内存区域被所有线程共享。虽然JVM规范把方法区描述为堆得一个逻辑部分,但是他有一个别名叫Non-heap(非堆),目的应该是与Java堆区分开。主要有string常量 final常量  static修饰的 都是在方法区

 

5.本地方法栈

主要是存放Native的方法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章