亲宝软件园·资讯

展开

JVM组成结构 分析JVM的组成结构

IT王小二 人气:0
想了解分析JVM的组成结构的相关内容吗,IT王小二在本文为您仔细讲解JVM组成结构的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:JVM,组成结构,下面大家一起来学习吧。

一、JavaSE体系

二、运行时数据区

三、程序计数器

3.1、什么是程序计数器

程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 -- 摘自《深入理解Java虚拟机》

3.2、程序计数器有什么特点

3.3、用个例子来说明

请无视我文章中取得类名,为了方便实验演示,命名怎么快怎么来。

public class Jvm1 {

    public int test(){
        int a = 100;
        int b = 200;
        return a + b;
    }
}

这样一个类, javac Jvm1.java,编译成Jvm1.class文件。

再使用 javap 反汇编工具javap -c Jvm1.class看下.class文件中数据格式。

这个就是前面提到的 当前线程执行的字节码的行号,而程序计数器则记录的这个数字。

四、虚拟机栈

一个例子来看看执行 每个方法入栈出栈 的过程。

public class Jvm2 {

    public static void main(String[] args) {
        A();
    }

    public static void A() {
        System.out.println("A开始");
        // 此处省略100行代码
        B(); // 调用B方法
        System.out.println("A结束");
    }

    public static void B() {
        System.out.println("B开始");
        // 此处省略100行代码
        C(); // 调用B方法
        System.out.println("B结束");
    }

    public static void C() {
        System.out.println("C开始");
        // 此处省略100行代码
        System.out.println("C结束");
    }
}

输出:

A开始

B开始

C开始

C结束

B结束

A结束

4.1、局部变量表

4.2、操作数据栈

数据重叠优化

虚拟机概念模型中每二个栈帧都是相互独立的,但在实际应用是我们知道一个方法调用另一个方法时,往往存在参数传递,这种做法在虚拟机实现过程中会做一些优化,具体做法如下:令两个栈帧出现一部分重叠。让下面栈帧的一部分操作数栈与上面栈帧的部分局部变量表重叠在一起,进行方法调用时就可以共用一部分数据,无须进行额外的参数复制传递。

4.3、动态链接

需要类加载、运行时才能确定具体的方法。

栈帧中会持有一个引用(符号引用),该引用指向某个具体方法。

符号引用是一个地址位置的代号,在编译的时候我们是不知道某个方法在运行的时候是放到哪里的,这时我用代号 com/enjoy/pojo/User.Say:()V 指代某个类的方法,将来可以把符号引用转换成直接引用进行真实的调用。用符号引用转化成直接引用的解析时机,把解析分为两大类:

4.4、方法出口

1、正常返回(调用程序计数器中的地址作为返回)三步曲

2、异常返回

指方法执行过程中遇到异常,并且这个异常在方法体内部没有得到处理,导致方法退出

4.5、栈溢出

五、本地方法栈

六、方法区

主要存储类信息、常量池、静态变量、即时编译期编译后的代码等数据。

永久代和元空间:

方法区在 jdk1.7 及其之前又背称为永久代,jdk1.8 又被称为元空间,怎么理解呢?

1.jdk1.8移除了永久代,新增了元空间。

2.可以理解为方法区是一个规范,但是具体怎么实现要看具体的jvm怎么实现。

3.就类似于提供了一个接口方法(规范),只要实现了这个接口的类,那么就要去实现里面接口方法(具体实现就是各种版本jvm之间和版本之间的差异了)。

4.各种版本jvm 。

5.版本差异(jdk1.7, jdk1.8) 。

参数设置:

七、堆

参数设置:

-Xms:堆的最小值

-Xmx:堆的最大值

-Xmn:新生代的大小

-XX:NewSize;新生代最小值

-XX:MaxNewSize:新生代最大值

八、运行时常量池

8.1、符号引用

8.2、字面量

8.3、jvm各版本运行时常量池变化

8.4、直接内存

内存对象分配在JVM中堆以外的内存,也可以称为直接内存,这些内存直接受操作系统管理(而不是JVM),这样做的好处是能够在一定程度上减少垃圾回收对应用程序造成的影响。

加载全部内容

相关教程
猜你喜欢
用户评论