JVM跨平台的原理
它就和其他软件一样,是操作系统中的一个进程
不管它里面运行的是啥程序,它本身只是一个软件
就和mac版本的QQ和windows版本的QQ不一样类似
字节码的作用
如果jvm的作用是直接解析Java代码的话,它就变成了类似于Python的解释器的工具
Java代码直接解析比较慢,因为Java是高级语言,是由C语言和C++编写的语言
所以将Java代码转换为字节码,比较耗时的这部分工作就变成了编译期间的工作
提高了运行时候的效率
JVM与字节码的关系
JVM整体结构
JIT编译器:负责把一些比较频繁的,已经解释过的字节码缓存起来,避免重复解释
本地方法栈:一般是一些jvm里面的,C语言或者C++编写的方法,带native关键字
堆:解释过程中将产生的对象放到堆里面
程序计数器:方便解释器找到下一条要执行的指令
类加载子系统
将符号引用解析为直接引用是指将实际上类的名字等信息转化为存在方法区里面的地址
类加载器的分类
ExtClassLoader是Java类库下的加载器
AppClassLoader是当前项目classpath下面的加载器
类加载器的双亲委派机制
当在Java中创建一个class后
jvm会去看appClassLoader中是否加载过这个类,
没有加载再去ExtClassLoader中找,还没有再去BootStrapClassLoader中找
都没有再创建一个新的
Tomcat为什么要自定义类加载器
运行时数据区的内容
蓝色是线程共享的
绿色是非线程共享的,每个线程都有一个
程序计数器
虚拟机栈
图解
虚拟机栈可能出现的问题
栈帧
操作数栈
上述代码中
局部变量表一直不断存储变化的值
通过字节码的指令变化,不断在操作数栈和局部变量表中存取数据,实现代码逻辑
本地方法栈
堆
堆的调整参数
新生代和老年代的调整参数
对象在堆中是如何流转的
Eden区域如果满了之后,会扫描哪些对象是已经没有在使用的对象
会把这些对象进行youngGC,标记数字,放到S0
如果eden再次发生youngGC时,会同步扫描S0区,并把对象转移到S1中,并同步更新数字
这次eden中的对象不是到S0了,而是S1,他俩区域会不断切换,不断更新数字
超过15次的,就会被放到老年代
特别大的对象也有可能不经过S0和S1直接放到老年代
也有可能Eden放不下,不经过Eden直接到老年代
GC的分类
为什么要进行GC
垃圾标记的方法
引用计数法
可达性分析法
GCroot包括什么
标记清除算法
STW是Stop-The-World的缩写,指的是在垃圾回收算法执行过程中,需要将JVM内存冻结的一种状态。在STW状态下,除了GC线程以外,其他所有线程都会停止执行。
STW是不可避免的,垃圾回收算法的执行一定会出现STW,而我们最好的解决办法就是减少停顿的时间。GC各种算法的优化重点就是为了减少STW,这也是JVM调优的重点。
复制算法
标记整理算法