JVM 的学习内容:
1.java代码的执行
java源码通过编译器生成 .class 文件,也就是字节码文件,字节码文件通过jvm解释器,编译成特定机器上的机器码,每一种平台的解释器是不同的,但是虚拟机的实现是相同的(这也是java可以跨平台执行的原因)
2.内存的管理
jvm内存:
线程私有:
程序计数器:用于存储虚拟机字节码指令地址
虚拟机栈:java方法执行过程中,都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息
本地方法栈:为native方法服务
线程共享:
方法区(永久代):
用于存储被jvm加载的类信息,常量,静态变量信息
运行时常量池也是方法区的一部分:用于存储编译期生成的各种字面量和符号引用
堆(对象和数组):
新生代: eden:新对象出生地
from survivor:上一次gc幸存者,下一次gc被扫描者
to survivor: 保留了上一次MinorGC过程的幸存者
老年代:
直接内存:不受gc管理
java8和元数据:在java8当中,永久代被移除,被元数据区取代,元空间不在虚拟机中,而是使用本地内存,类的元数据放入native memory,字符串池和类的静态变量放入堆内存当中
jvm gc:
如何确定垃圾:引用计数法,可达性分析
分代收集:根据各个区的特点进行回收
新生代:大批对象可回收,采用复制算法
老年代:少量对象可回收,采用标记整理算法
gc垃圾收集器:
serial: 单线程,复制算法,垃圾收集的过程中,必须暂停其他的工作线程
parNew: 多线程,复制算法 ,垃圾收集的过程中,必须暂停其他的工作线程
parallel Scavenge:多线程,复制算法,高效,高效的表现在于高吞吐量,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))
serial old(老代垃圾收集器): 单线程,标记整理算法
GMS(老代垃圾收集器):多线程,标记清除算法,最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验
G1:与CMS相比,采用标记整理算法
补充知识点:
java的四种引用:
1.强引用:Object a=new 对象,赋值给一个变量a,a这个变量引用就是强引用,如果被强引用变量引用的时候,它处于可达状态,是不能被gc回收的
2.软引用 :软引用需要用 SoftReference 类来实现,当系统内存不足时,会被回收
3.弱引用:弱引用需要用WeakReference 类来实现,只要垃圾机制运行,他就会被回收
4.虚引用:虚引用需要PhantomReference类来实现,它不能单独使用,必须和引用队列联合使用。虚 引用的主要作用是跟踪对象被垃圾回收的状态。
类加载的过程:
1.加载:生成这个类的对象在内存中,作为方法区这个类的各种数据的入口
2.验证:确保class文件信息符合jvm要求
3.准备:为类变量分配内存并设初始值
4.解析:将常量池的符号引用替换为直接引用
5.初始化:执行类的构造器的client方法
类的构造器:
1.启动类加载器(bootstrap classloader):负责加载JAVA_HOME\lib 目录中,通过-xbootclasspath 参数指定路径中的
2.扩展类加载器(extension classloader): JAVA_HOME\lib\ext 目录中的,通过java.ext.dirs 系统变量指定路径类的
3.应用程序类加载器(Application ClassLoader):用于加载classpath的类库
3.线程资源同步和交互机制
jvm后台运行的线程:
虚拟机线程:等到jvm到达安全点操作出现(当前堆的修改无法进行),如线程暂停,线程偏向锁解除
周期性线程:负责定时器事件
gc线程
编译器线程:运行时将字节码动态的编译成平台运行的机器码
信号分发器线程