深入JVM-JVM

最近在看深入JAVA虚拟机这本书,JAVA虚拟机这章讲得很细致,粗略看了并整理一下,都是理论性的东东,不过收获很大。

 

1、java虚拟机可能指的三种不同的东西:抽象规范、一个具体的实现、一个运行中的虚拟机实例。

2、java虚拟机的生命周期
    java虚拟机内部有两种线程:守护线程和非守护线程。守护线程是由java虚拟机自己使用,比如执行垃圾收集任务的线程;java程序也可以把创建的任何线程标记为守护线程,java程序中的初始线程是非守护线程。只要有任何非守护线程在运行,java程序也继续运行,虚拟机仍然存活;当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。

3、java虚拟机体系结构
    java虚拟机体系结构图:一个类装载器子系统,装载类或接口;一个执行引擎,负责执行那些包含在被装载类中方法的指令; 一个运行时数据区,存储字节码、创建的对象、传递的参数、返回值、局部变量等。
    java虚拟机体系结构
I、类装载器子系统:
    java虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是java虚拟机实现的一部分;后者则是java程序的一部分。

II、运行时数据区:某些运行时数据区是由程序中所有的线程共享 如图1;还有一些则只能有一个线程拥有。

线程共享的运行时数据区 图1

 


方法区&堆:
    每个java虚拟机实例都有一个方法区以及一个堆,由该虚拟机实例的所有线程共享。当虚拟机装载一个class文件时,会从这个class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区中。
    程序运行时,虚拟机把所有程序运行时创建的对象放到堆中。

PC寄存器&java栈&本地方法栈:
    每个新线程被创建时,都将得到自己的PC寄存器以及一个java栈。若线程正在执行一个java方法,PC寄存器的值总是指示下一条被执行的指令;
    java栈存储该线程中java方法调用的状态--包括局部变量、被调用时传进的参数、返回值以及运算的中间结果;
    本地方法调用的状态,以某种依赖于具体实现的方式存储在本地方法栈中,也可能是寄存器或其他特定内存区。java栈是由许多栈帧组成,一个栈帧包含一个java方法调用的状态,当线程调用一个java方法时,虚拟机压入一个新的栈帧到该线程的java栈中,当该方法返回时,这个栈帧从java栈中弹出并抛弃。

a、方法区
    类型信息,对每个装载的类型,虚拟机都会在方法区中存储以下类型信息:
这个类型的全限定名
直接超类的全限定名
这个类型是类类型还是接口类型
这个类型的访问修饰符
任何直接超接口的全限定名的有序列表
该类型的常量池
字段信息
方法信息
除常量外的所有类变量
一个到类ClassLoader的引用
一个到Class类的引用

b、堆
    每个java程序都有自己的堆空间,该程序中的所有线程共享堆。
    java虚拟机规范并没有规定java对象在堆中是如何表示的,对象的内部表示影响着整个堆和垃圾收集器的设计。

-一种可能的堆空间设计:把堆分为两部分,一是句柄池,一是对象池。句柄池有两部分,指向对象实例变量的指针和指向方法区类型数据的指针。
-另一种设计方式:使对象指针直接指向一组数据,该数据包括对象实例数据以及指向方法区中类数据的指针。

ps:垃圾收集器主要负责自动回收不再被运行的程序引用的对象所占用的内存。

c、java栈
    java栈以帧为单位保存线程的运行状态,虚拟机对java栈执行压栈和出栈操作。
    当线程调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧,在执行这个方法时,使用这个帧来存储参数、局部变量、中间运算结果等。

d、栈帧
    栈帧由三部分组成:局部变量区、操作数栈和帧数据区。
-局部变量区是一个以字长为单位,从0开始计数的数组,通过索引来访问。局部变量区包含对象方法的参数和局部变量。
-操作数栈也和局部变量区一样,不同的是不通过索引访问,而是标准的栈操作。 java虚拟机没有寄存器,java虚拟机指令是从操作数栈中取得操作数的。
-帧数据区保存java栈帧所需要的支持常量池解析、正常方法返回和异常派发机制的数据。

e、本地方法栈
    任何本地方法接口都会使用本地方法栈,当线程调用的是本地方法时,虚拟机会保持java栈不变,不再在线程的java栈中压入新的帧,虚拟机只是简单的动态连接并直接调用指定的本地方法。

    若虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈;可能本地方法接口需要回调java虚拟机中的java方法,该线程保存本地方法栈的状态并进入另一个java栈。

III、执行引擎
    java虚拟机实现的核心都是它的执行引擎,java虚拟机规范中,执行引擎的行为使用指令集来定义,对于每条指令,规范都详细规定了当实现执行到该指令时应该做什么处理。

f、本地方法接口
    sun的java本地接口,称作JNI。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值