JVM相关复习(无图)
一、JVM、JRE和JDK之间的关系
JVM:java虚拟机
JRE:java运行环境
JDK:java开发工具包
JDK中就包含了JRE,JRE中就包含了JVM,因此三者之间的关系就是包含关系。JDK包含JRE包含JVM
java为什么能跨品台运行,最核心的就是JVM,不同的操作系统的API 是不同的,如果要调用系统设备,那么就需要针对不同系统API写出不同代码,java跨平台是Java中引入了字节码,JVM只认识字节码,并将他们解释到系统API调用。
JVM相关内容
JVM又名java虚拟机,是通过仿真模拟各种计算机功能来实现,其中包含字节码指令、寄存器、栈、垃圾回收堆、存储方法域等,JVM是伴随java程序的开始而开始,程序的终结而终结的。
JVM 线程主要分两种:守护线程和普通线程
守护线程:JVM中自己使用的线程,例如垃圾回收
普通线程:JVM程序线程,只要有普通线程在执行JVM就不会停止。
二、JVM的内存模型:方法区、堆、虚拟机栈、本地方法栈、程序计数器
分为5个部分,依据线程共有和私有分为两类
线程共有的有:方法区、堆
线程私有的有:虚拟机栈、本地方法栈、程序计数器
堆内存:分为新生代、老年代、永久代,在JDK1.8后永久代就在堆中被移除了
方法区:用于存储被虚拟机加载的类信息、常量、静态变量
由于方法区中是线程共享的,所以必须考虑线程的安全性。程序在运行时,方法区的大小可以改变可以扩展,方法区中的对象可以被GC回收,但是条件相对严苛,必须是对象未被引用。
程序计数器:字节码解释器在运行时通过改变计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能。
程序计数器是用来记录正在执行的JVM字节码指令的地址,如果执行的是本地方法,那么计数器值为空。
java虚拟机栈:描述的是java方法执行的内存模型;每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
栈:主要用于存储本地方法的局部变量表、本地方法的操作数栈等信息。当栈内数据超出其作用域后会被自动释放,本地方法栈在程序调用或者JVM调用本地方法接口时候启用。
三、粗略介绍类加载
类加载:装载、链接、初始化
装载:通过类限定名获取二进制字节流,将字节流代表的静态存储结构转化为方法区运行时的数据结构,在堆中生成该类的class对象,作为方法区的数据访问入口
链接:验证、准备、解析
初始化:为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,对类变量进行初始化。
初始化的两种方式:声明类变量是指定初始值。使用静态代码块为类变量指定初始值。