深入理解JVM学习分享

一、Java代码的执行流程

简单版:
深入理解JVM学习分享_第1张图片复杂版:
深入理解JVM学习分享_第2张图片

二、JVM架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构

具体来说这两种架构的区别:

基于栈式架构的特点:
1、设计和实现更简单,适用于资源受限的系统
2、避开了寄存器的分配难题,使用零地址指令方式分配
3、指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现
4、不需要硬件支持,可移植性更好,更好实现跨平台

基于寄存器架构的特点:
1、典型的应用是x86的二进制指令集,不如传统的PC以及Android的Davlik虚拟机
2、指令集架构则完全依赖硬件,可移植性差
3、性能优秀和执行更高效
4、花费更少的指令去完成一项操作
5、在大部分情况下,基于寄存器架构的指令往往都以一地址指令、二地址指令、三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主

三、JVM的生命周期

虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成,这个类是由虚拟机的具体实现指定的。

虚拟机的执行
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
程序开始执行时,它才开始运行,程序结束时它就停止了。
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。

虚拟机的退出
有如下的几种情况:
1、程序正常运行结束
2、程序在执行过程中遇到了异常或错误而异常终止
3、由于操作系统出现错误而导致Java虚拟机的进程终止
4、某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作

四、内存结构概述

简图:
深入理解JVM学习分享_第3张图片
详细图:
深入理解JVM学习分享_第4张图片

五、类的加载器和类的加载过程

深入理解JVM学习分享_第5张图片类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。

ClassLoader只是负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。

加载的类信息存放于一块称为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。

举个例子:
深入理解JVM学习分享_第6张图片类的加载过程:
深入理解JVM学习分享_第7张图片
加载:
1、通过一个类的全类名获取此类的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

链接:
深入理解JVM学习分享_第8张图片初始化:
深入理解JVM学习分享_第9张图片

你可能感兴趣的:(java学习)