Jvm内存结构
Jvm的内存结构:
程序计数器:是JVM中一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过这个计数器的值来
选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理等(线程私有)
虚拟机栈:虚拟机栈是指方法执行的内存模型,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口信息,
每一个方法从调用到执行完成的过程,就对应的栈帧的入栈和出栈
局部变量表:存放了编译期的各种基本数据类型(boolean,byte,char,shor,int,float,double,long)、对象引用(可以是一个指向对象起始地址的引用指针,也可以是指向一个代表对象的句柄)
本地方法栈:本地方法栈与虚拟机栈作用类心,只是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务
堆:堆是垃圾收集管理的主要区域,堆可以分为:新生代(Eden空间、From区、To区)和老年代(线程共享)
方法区:存储虚拟机加载的类信息、常量、静态变量等
运行时常量沲(属于方法区):用于存放编译期生成的各种字面量和符号引用,这部份内容将在类加载后进方法区的运行时常量沲
对象的创建过程:
1、虚拟机遇到new指令,判断常量沲中是否有对应的符号引用,检查这个符号引用代表的类是否被加载、链接、初始化,如果没有就必须进行类的加载过程
2、类加载检查后,需要进行对象的内存分配,内存分配有两种方式:
指针碰撞(新生代,复制算法 serial、ParNew)
空闲列表(老年代,CMS ,serial old)