1.JVM运行时数据区域
以下区域都拥有各自的用途,创建以及销毁的时间,有的区域会随着虚拟机启动而一直存在,有的是依赖用户线程的启动和结束而建立和销毁。
2. 程序计数器
程序计数器根据字面意思觉得类似于java中的++运算,其实不是。jvm虚拟机中的程序计数器是所执行字节码的行号指示器。字节码解释器就是根据这个计数器的值来取下一条需要执行的字节码质量,来控制程序的流程,分之,循环,跳转,异常处理等基础功能。
切记程序计数器是线程私有的,每一条线程都有独立的程序计数器他们互不干扰。当执行本地(Native)的方法时程序计数器值则应当为空(Undefined)。
3.Java虚拟机栈
栈与程序计数器一样也是私有的,生命周期与线程同步。每个方法被执行的时候,java虚拟机都会同步创建一个栈帧,用来存储局部变量,操作数,方法出口等信息。每个方法被调用直至执行完毕的过程就对应栈帧在虚拟机中入栈出栈的操作。
局部变量存放的就是八大基本类型(int,char,double,long,boolean,byte,short,float)。这些局部变量的存储空间都是以局部变量槽进行存储,其中64位的long与double需要占用两个变量槽。
4.本地方法栈
本地方法栈与java虚拟机栈作用是相似的,java虚拟机栈位虚拟机执行的java方法,而本地方法栈执行的是本地(Native)方法。
5.堆
每次面试都会聊到jvm调优,但是调休调的是那个部分呢?
对没错java虚拟机中涉及到调优的就是堆,堆是虚拟机中管理最大的一块内存。堆是被线程共享的一块内存区域(并发问题),在java虚拟机启动的时候创建。此内存中存放的就是new出来的实例对象。
堆是垃圾收集器管理的内存区域,所以堆中经常会出现新生代、老年代、永久代、Eden空间,From Survivor空间、ToSurvivor空间(涉及到垃圾回收机制以及堆中垃圾回收操作本文章暂时不描述)。
6.方法区
方法区与堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息,常亮,静态变量,即时编译器编译后的代码缓存等数据。
7.运行时常量池
运行时常量池是方法区的一部分。用于存放编译器生产的各种字面量与符号引用,这部分内容是在类加载后存放到方法取得运行时常量池中。
以上就是jvm自动内存管理的一部分知识。。。。。。。。。。我只是一个会吹比的选手。欢迎留言补充。