JVM内存与垃圾回收
jvm特点:内存动态分配和垃圾自动收集技术
jvmDOC网址:https://docs.oracle.com/javase/specs/index.html
jvm书籍:
跨语言平台JVM:
Kotlin、Clojure、Groovy、Scala、Jython、JRuby、JavaScript可以编译为JVM可识别的字节码文件,运行在JVM平台上
JVM属于程序虚拟机,常见的虚拟机是系统虚拟机
JVM整体结构:
JVM的指令集架构:是基于栈的指令集架构(指令集架构还包括基于寄存器的),是零地址指令,因为基于栈可以跨平台,但是性能差。
JVM生命周期: 启动、执行、退出
常见java虚拟机:Classic VM(只有解释器)、Exact VM、Hotspot虚拟机(有方法区(永久代/元空间))、JRockit(服务端,只有JIT)、J9虚拟机 (后为三大商用虚拟机) apache harmony(android SDK)、Microsoft JVM、Taobao JVM、Dalvik VM(Android)、ART VM、Graal VM(可能替代Hotspot)
类加载子系统:
Loading: 获取二进制字节流-->方法区运行时数据结构-->内存中生成大的Class对象(作为类的数据的访问入口)
Linking:
Verify: 保证class文件符合JVM要求,主要做文件格式验证、元数据验证、字节码验证、符号引用验证
Prepare: 为类变量分配内存、赋初始值
Resolve: 将常量池的符号引用转换为直接引用
Initialization: 执行类构造器方法clinit,完成类变量和静态代码块中变量的赋值,该方法在多线程下是同步加锁的
类加载器:
分为引导类加载器(BootStrap ClassLoader)和自定义加载器(User-Defined ClassLoader)
ClassLoader派生的加载器都是自定义加载器
Extention ClassLoader(扩展类加载器)和Application ClassLoader(应用/系统类加载器)就是自定义加载器
AppClassLoader(系统类加载器)的上层是ExtClassLoader,ExtClassLoader的上层是BootStrap ClassLoader(用C/C++编写,获取不到,为null)
用户自定义类的加载器是AppClassLoader
Java的核心类库(包名为java、javax、sun)由BootStrap ClassLoader加载
双亲委派机制:收到类加载请求,优先由父类加载器加载,双亲委派机制可以做到沙箱安全机制
运行时数据区
PC寄存器(Program Counter Register):
用来存储指向下一条指令的地址,线程私有,既没有GC,也没有OOM。作用:线程切换后,记录下一指令开始位置
虚拟机栈(JVM Stacks):
线程私有,由一个一个栈帧组成,一个栈帧就是一个方法
设置栈的大小: -Xxs1m
栈帧结构:局部变量表(Local Variables)、操作数栈(Operand Stack)、帧数据区:【动态链接(Dynamic Linking)、方法返回地址(Return Address)、附加信息】
局部变量表:基本单位是槽,32位(by