
JVM原理篇
文章平均质量分 85
埃泽漫笔
OceanBase开源项目ODC(OceanBase Developer Center)的核心贡献者,Github地址:https://github.com/oceanbase/odc,希望大家能赏脸支持下我们OceanBase公司的开源项目,点亮一颗小星星就行。
Maven中央仓库OceanBase开源组件 https://central.sonatype.com/artifact/com.oceanbase/db-browser 和 https://central.sonatype.com/artifact/com.oceanbase/ob-sql-parser 的核心贡献者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
栈上的数据存储
将a保存在堆上(使用static),使用ASM框架修改字节码指令,将iconst1指令修改为iconst2和iconst3,并测试验证结果。a = true;if(a){System.out.println("a为true");}else{System.out.println("a为false");System.out.println("a为true");}else{System.out.println("a为false");原创 2024-11-04 00:55:01 · 619 阅读 · 0 评论 -
对象在堆上是如何存储的?
在64位的Java虚拟机中,Klass Pointer以及对象数据中的对象引用都需要占用8个字节,为了减少这部分的内存使用量,64 位 Java 虚拟机使用指针压缩技术,将堆中原本 8个字节的 指针压缩成 4个字节 ,此功能默认开启,可以使用-XX:-UseCompressedOops关闭。在不同的对象状态(有无锁、是否处于垃圾回收的标记中)下存放的内容是不同的,同时在64位(又分为是否开启指针压缩)、32位虚拟机中的布局都不同。1、需要进行内存对齐,指的是将对象的内存占用填充至8字节的倍数。原创 2024-11-04 23:39:20 · 893 阅读 · 0 评论 -
方法调用的原理
在JVM中,一共有五个字节码指令可以执行方法调用:1、invokestatic:调用静态方法。静态绑定2、invokespecial: 调用对象的private方法、构造方法,以及使用 super 关键字调用父类实例的方法、构造方法,以及所实现接口的默认方法。静态绑定3、invokevirtual:调用对象的非private方法。非final方法使用动态绑定,使用虚方法表找到方法的地址,子类会复制父类的虚方法表,如果子类重写了方法,会替换成重写后方法的地址。原创 2024-11-05 00:01:15 · 973 阅读 · 0 评论 -
异常捕获的原理
当触发异常的字节码的索引值在某个异常表条目的监控范围内,Java 虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。在位置2到4字节码指令执行范围内,如果出现了Exception对象的异常或者子类对象异常,直接跳转到位置7的指令。2、如果遍历完都不能匹配,说明异常无法在当前方法执行时被捕获,此方法栈帧直接弹出,在上一层的栈帧中进行异常捕获的查询。生成,存放的是代码中异常的处理信息,包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置。异常捕获机制的实现,需要借助于编译时生成的异常表。原创 2024-11-05 00:24:23 · 427 阅读 · 0 评论 -
JIT即时编译器
根据JIT即时编器优化代码的特性,在编写代码时注意以下几个事项,可以让代码执行时拥有更好的性能:1、尽量编写比较小的方法,让方法内联可以生效。2、高频使用的代码,特别是第三方依赖库甚至是JDK中的,如果内容过度复杂是无法内联的,可以自行实现一个特定的优化版本。3、注意下接口的实现数量,尽量不要超过2个,否则会影响内联的处理。4、高频调用的方法中创建对象临时使用,尽量不要让对象逃逸。原创 2024-11-05 00:45:51 · 929 阅读 · 0 评论 -
G1垃圾回收器原理
三色标记中的黑色和白色是使用位图(bitmap)来实现的,比如8个字节使用1个bit来标识标记的内容,黑色为1,白色为0,灰色不会体现在位图中,会单独放入一个队列中。标记B关联的A和C对象,由于A和C对象并未引用其他对象,可以直接标记成黑色,而B也完成了所有引用对象的标记,也标记为黑色。这里就存在一个问题,年轻代回收只扫描年轻代对象(Eden + Survivor),如果有老年代中的对象引用了年轻代中的对象,我们又如何知道呢?(这里可以看做年轻代的对象)的这些关系的数据结构。添加了A到C的引用。原创 2024-11-06 22:15:13 · 1416 阅读 · 0 评论 -
ZGC原理
1、着色指针(Colored Pointers)着色指针将原来的8字节保存地址的指针拆分成了三部分,不仅能保存对象的地址,还可以保存当前对象所属的状态。不支持32位系统、不支持指针压缩2、读屏障(Load Barrier)在获取对象引用判断对象所属状态,如果所属状态和当前GC阶段的颜色状态不一致,由用户线程完成本阶段的工作。会损失一部分的性能,大约在5%~10%之间。原创 2024-11-06 22:23:42 · 771 阅读 · 0 评论 -
ShenandoahGC原理
写入数据时会使用写前屏障,判断Mark Word中的GC状态,如果GC状态为0证明没有处于GC过程中,直接写入,如果不为0则根据GC状态值确认当前处于垃圾回收的哪个阶段,让用户线程执行垃圾回收相关的任务。如果用户线程在帮忙转移时,ShenandoahGC线程也发现这个对象需要复制,那么就会去尝试写入前向指针,使用了类似CAS的方式来实现,只有一个线程能成功修改,其他线程会放弃转移的操作。3、ShenandoahGC有两个版本,1.0版本存在于JDK8和JDK11中,后续的JDK版本中均使用2.0版本。原创 2024-11-06 22:25:11 · 307 阅读 · 0 评论