深入理解JVM之JVM内存区域与内存分配

深入理解JVM之JVM内存区域与内存分配

JVM初始运行的时候都会分配好Method Area(方法区)Heap(堆),而JVM 每遇到一个线程,就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

jvm分为五个区域:java堆、方法区、虚拟机栈、本地方法,程序计时数器

1.java堆

heap(堆)是存放new的对象和数组(jvm不定时查看这个对象,如果没有引用指向这个对象就回收)实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等 而对象实例在Heap 中分配好以后,需要在Stack中保存一个4字节的Heap 内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例,是垃圾回收的主要场所。java堆处于物理不连续的内存空间中,只要逻辑上连续即可。

2.方法区

方法区-(也叫:共享数据区,静态区)—— 存放全局变量,静态变量和字符串常量,和方法,不释放。类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,

3.虚拟机栈(jvm栈)

存放函数的参数值,局部变量的值等,方法执行结束后自动回收。存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象

4.本地方法

和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。

5.程序计时数器

指令计数器是线程私有的,每个线程都有独立的指令计数器,计数器记录着虚拟机正在执行的字节码指令的地址,分支、循环、跳转、异常处理和线程恢复等操作都依赖这个计数器完成。如果线程执行的是native方法,这个计数器则为