初探jvm虚拟机之内存管理(一)

本篇记录一些概念性的东西,后续结合实例分析虚拟机的内存机制。

java虚拟机在程序运行时将内存划分为以下几个区域,每个区域作用,生命周期各不相同

程序计数器 
虚拟机栈 
本地方法栈 
方法区 

这里写图片描述

程序计数器 
线程执行的字节码行号指示器。 
多线程是通过时间片轮转法获取cpu时间,执行线程,因此当线程再次获得cpu时须确保定位到上次执行到哪里,由此可见程序计数器是线程私有的 
虚拟机栈 
虚拟机栈体现方法执行时的内存情况。 
每一个方法被执行时都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。 
每一个方法从开始执行到执行结束的过程实际上就是栈帧从虚拟机栈从入栈到出栈的过程 
虚拟机栈是线程私有的,生命周期与线程相同 
1)局部变量表存放了编译期可知的 
boolean,byte,char,short,int,long,float,double八种基础类型 
及renference 引用,引用并不是对象实例,根据不同的虚拟机,它可能是指向对象初始地址的引用指针,也可能是代表对象的一个句柄 
2)局部变量表的空间在编译期分配完成,当进入一个方法帧中分配多少空间是确定不变的。 
3)long和double占用2个局部变量空间,其余类型占用1个 
本地方法栈 
本地方法栈与虚拟机栈功能类似,本地方法栈是为虚拟机调用到的native方法提供内存服务。 
 
堆是虚拟机内存中较大的一块区域,用来存储对象实例,所有线程共享 
堆是虚拟机主要GC区 
方法区 
方法区用来存储被虚拟机加载的类信息,常量,静态变量,即时编译后的代码 
方法区是线程共享的 
该区一般不参与GC,即使参与也是只针对常量池和类型卸载 
运行时常量池 
1)方法区的一部分 
2)用于存放编译期生成的各种字面量和符号引用 
3)动态的,运行时常量池在运行时也可进入

猜你喜欢

转载自blog.csdn.net/weixin_42248137/article/details/80389095