JVMjvm

JVM体系架构

2018-07-18  本文已影响9人  茶还是咖啡
JVM体系架构

程序计数器

Java虚拟机栈

用来运行方法使用,线程私有的,生命周期和线程相同,方法执行时,会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等。

本地方法栈

和虚拟机栈功能类似,为本地方法服务。

Java堆是被线程共享的一块内存,是jvm中占用空间最大的区域,细分可分为新生代老年代,新生代又可细分为eden区和survivor 区(默认比例为8:1),在虚拟机启动时创建,用来存放对象的实例。

方法区(永久代)

用于存放已被虚拟机加载的类信息(类的字节码),常量,静态变量,编译后的代码等,线程共享的区域。

类加载流程

当一个classLoder启动的时候,classLoader的生存地点在jvm中的堆,然后它会去主机硬盘上将A.class装载到jvm的方法区,方法区中的这个字节文件会被虚拟机拿来new A字节码(),然后在堆内存生成了一个A字节码的对象,然后A字节码这个内存文件有两个引用一个指向A的class对象,一个指向加载自己的classLoader。

A字节码内存块

1.类型信息
2.字段信息
3.方法信息
4.常量池
5.静态常量
6.一个到类class类的引用
7.一个到classloder的引用
8.方法表

字节码内存块中的内容对应的就是该类的相关信息

package test;

import java.io.Serializable;

 //1.类信息  
 public final class ClassStruct extends Object implements Serializable {

   //2.对象字段信息  

   private String name;  

   private int id;  

   //4.常量池  

    public final int CONST_INT=0;  

    public final String CONST_STR="CONST_STR";  

    //5.类变量区  

    public static String static_str="static_str";  

   //3.方法信息  

   public static final String getStatic_str ()throws Exception{  

      return ClassStruct.static_str;  

   }
}  

创建对象的过程

JVM遇到一条new指令的时候,会先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载解析初始化,如果没有,必须要进行加载解析初始化,之后为对象在堆中分配内存。对象分配空间的大小在类加载完就可以确定,如果内存是规整的采用“指针碰撞”的方式,如果内存是不规整的,JVM会维护一个列表,记录那块内存是可用的,这种方式成为“空闲列表”,内存是否规整取决于垃圾收集算法。在高并发下创建对对象时,可以采用CAS机制,或者预先为每个线程在java堆中分配一块内存。

对象的内存布局

对象在内存中的布局可以分为3部分,对象头,实例数据,对其填充。

对象的访问定位

java程序通过栈上的reference数据来操作堆上的具体数据类型


上一篇下一篇

猜你喜欢

热点阅读