JVM学习

JVM大头的东西

JVM的功能有三项:第一是解释执行字节码指令;第二是管理内存中对象的分配,完成自动的垃圾回收;第三是优化热点代码提升执行效率。
对象在堆中的布局

1.栈上的数据与堆上的数据进行转换的过程。
栈上的数据每个内存单元更大,堆上的每个内存单元更小。
存在补0和补1的问题。
2.关于并发缓存的问题
这个部分需要参照计算机组成原理的内容

3.比较难以理解的一点就是关于内存与内存之间插入内存对齐块的问题
4.关于offset的理解
在Java编程中,offset 函数是一个常用但又不总是被完全理解的概念。这个函数主要用于处理字符串或数组等数据结构中的位置偏移。简单来说,offset 指的是从某个参照点开始,到达目标位置所需要经过的步数或字节。本文将详细介绍Java中的offset函数的使用方法和一些常见场景。
5.父类偏移量和子类偏移量的关系以及问题

方法调用的过程与栈的关系

在JVM中,一共有五个字节码指令可以执行方法调用:
1、invokestatic:调用静态方法
2、invokespecial: 调用对象的private方法、构造方法,以及使用 super 关键字调用父类实例的方法、构造方法,以及所实现接口的默认方法。
3、invokevirtual:调用对象的非private方法。
4、invokeinterface:调用接口对象的方法。
5、invokedynamic:用于调用动态方法,主要应用于lambda表达式中,机制极为复杂了解即可
静态绑定适用于处理静态方法、私有方法、或者使用final修饰的方法,因为这些方法不能被继承之后重写。
invokestatic
invokespecial
final修饰的invokevirtual
需要操作的地方:
用HSDB查找到类中的方法
如何使用invokevirtual去调用东西:
产生invokevirtual调用时,先根据对象头中的类型指针找到方法区中InstanceClass对象,获得虚方法表。再根据虚方法表找到对应的对方,获得方法的地址,最后调用方法。

6.从底层看待异常捕获的东西
为了确保抛出异常也可以得到最后执行finally方法

7.垃圾回收器的原理
年轻代回收只扫描年轻代对象(Eden + Survivor),所以从GC Root到年轻代的对象或者年轻代对象引用了其他年轻代的对象都很容易扫描出来。
8.方法内联中C1和C2优化的地方不同
c1优化为什么会和C2优化出现如此大的不同差距?
C2优化效果:

c1仍然乖乖的按照这个循环一步一步算
C1仍然乖乖的算

JTwatch分析有没有被内联:绿色代表不被内联

自身使用的uppercase和非自身使用的uppercase

9.关于方法内联和标量替换

G1垃圾回收器的三色标记法问题:


ZGC垃圾回收器流程:

posted @ 2025-01-14 15:53  ruo_feng  阅读(27)  评论(0)    收藏  举报
-->