自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 G1 RSet 管理

注意:jdk14中G1代码有极大不同RSet中遍历分区bool ScanRSClosure::doHeapRegion(HeapRegion* r) { HeapRegionRemSet* hrrs = r->rem_set(); if (hrrs->iter_is_complete()) return false; if (!_try_claimed && hrrs->claim_iter()) return false; _g1h->.

2020-05-29 23:08:25 372

原创 mac catalina 编译openjdk14

下载源码在github或者gitee上搜openjdk就行了推荐gitee上,毕竟网速挺快的开始准备环境编译openjdk需要预先安装一个jdk我系统环境为Xcode最新clang带着jdk8推荐可以看一看doc/build.html编译先mkdir buildcd build建个新目录把编译的都放进去接着bash ../configure好像是这个,编译jdk只支持bash一般缺少什么库直接brew install 就可以了接着直接make一般没什么问

2020-05-29 10:58:22 244

原创 G1 YGC 理论

G1垃圾回收器从根集合(线程栈等)开始出发寻找垃圾选择CSetCSet即是 Collection set,即需要被回收的集合,一般来说是所有的新生代分区均会被加入到CSet中根处理从根(线程栈等)出发, 把存活对象复制到新的分区,同时把对象的每一个field都加入到待处理栈,把旧对象的对象头更新为指向[新复制的对象]且对象头的最后两位设置为11表示已经被标记(64位机中指针48位可用).处理RSet因为新生代的对象发生复制移动,RSet中所表示的对象的字段需要更新至新对象的地址.新一轮复制可

2020-05-28 22:37:58 755

原创 G1 中的内存分区引用 RSet

G1 中的内存分区引用 RSet在G1回收对象时,会根据分区之间的引用关系快速定位到引用者比如一个老生代分区有一个新生区的对象引用了,即young.field = old;则old对象对应的Rset中会标记young所在分区的位置找到分区后再寻找分区内引用old对象的young对象管理引用通过add_reference函数void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) { uint cur_h

2020-05-20 00:24:36 513

原创 Hotspot JVM 底层C/C++ 源码 Thread类start0源码

总所周知java里面开线程主要是通过native方法start0()来运行,先在源码搜一下static JNINativeMethod methods[] = { {"start0", "()V", (void *)&JVM_StartThread}, //...};明显是调用一个JVM_StartThread方法JVM_...

2020-05-04 18:24:55 1642

原创 Hotspot JVM 底层C/C++ 源码 入门12执行引擎 解释器

执行引擎就是一个运算器,识别指令并运算最终返回结果汇编执行流程大概先取指令,执行指令,PC+1(取下一条指令)一直循环,最终完成程序逻辑但是Java的汇编执行流程有极大不同.取指令,执行指令,跳转至下一条指令,注意,是跳转!(当然C1,C2可以优化,但模版解释器呵呵)JVM首先调用CallStub例程和zerolocals例程,为函数创建栈帧,创建完栈帧后会调用以下逻辑addre...

2020-05-03 23:36:24 416

原创 Hotspot JVM 底层C/C++ 源码 入门11 vtable invokevirtual miranda

JVM 调用callStub例程开始调用java程序的主函数main(),callstub调用了zero_locals,zero_locals例程中最终跳转到java程序的main()主函数的第一条字节码指令并开始执行java程序那么在java程序内部,当一个java方法调用另一个java方法是,如何实现?java字节码invokevirtual 包含virtual dispatch...

2020-05-03 20:50:27 302

原创 Hotspot JVM 底层C/C++ 源码 入门10 类方法解析 methodOop

类变量解析其实跟常量池解析没什么不同,方法也差不多看看代码Array<Method*>* ClassFileParser::parse_methods(bool is_interface, AccessFlags* promoted_flags, ...

2020-05-03 15:01:41 350

原创 Hotspot JVM 底层C/C++ 源码 入门9栈帧 slot

我觉得跟汇编call原理没有区别.局部变量存放引用,操作数栈来运算void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { // initialize fixed part of activation frame __ push(rax); ...

2020-05-03 12:40:44 389

原创 Hotspot JVM 底层C/C++ 源码 入门8 解释器 entry_point method

本应该是类变量解析的,但我寻思字节对齐不是C++基础吗?对Java主函数而言,在CallStub例程里会调用entry_point例程, 在entry_point例程里完成主函数的栈帧创建,找到Java主函数所对应的第一个字节码指令并进入执行.在entry_point例程中会涉及method对象JVM内部可以调用各种不同的方法类型,JNI,Java的静态方法,成员方法.调用不同种类的方法,...

2020-05-03 11:01:14 566

原创 Hotspot JVM 底层C/C++ 源码 入门7constantPoolOop字段初始化

在创建constantPoolOop中会为_tags域申请内存空间constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS){ //... typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NU...

2020-05-02 20:55:54 273

原创 Hotspot JVM 底层C/C++ 源码 入门6klassKlass构建constantPoolKlass

JVM为constantPoolOop分配完内存后内存区域还是空的,没有数据.但是在ClassFileParser::parse_constant_pool()中已经为constantPoolOop初始化了_metadataconstantPoolOop oopFactory::new_constantPool(int length. bool is_conc_safe, TRAPS){ ...

2020-05-02 20:26:42 437

原创 Hotspot JVM 底层C/C++ 源码 入门5常量池解析

JVM使用一个constantPoolOop来保存常量池的信息,而该类保存数据的是属于typeArrayOop类型的_tags对象在ClassFileParser::parse_constant_pool()中,通过下面这行代码实现常量池分配(第一个参数length在javac编译计算出.)constantPoolOop constant_pool = oopFactory::new_c...

2020-05-02 15:53:43 737

原创 Hotspot JVM 底层C/C++ 源码 入门4--oop-klass模型

Hotspot虚拟机在内部使用两组类来表示Java的类和对象oop(ordinary object pointer),描述对象的实例信息 klass,描述java类,是虚拟机内部Java类型结构typedef class oopDesc* oop;typedef class instanceOopDesc* ...

2020-05-02 11:15:31 481

原创 Hotspot JVM 底层C/C++ 源码 入门--3 _call_stub_entry

回顾之前static CallStub call_stub(){ return (CallStub)(castable_address(_call_stub_entry));}JVM 通过call_stub()函数返回一个CallStub类型函数指针,即_call_stub_entry,再通过_call_stub_entry指向某个函数地址从而调用函数StubRoutines...

2020-05-02 10:15:13 444

原创 Hotspot JVM 底层C/C++ 源码 入门--2方法调用

先看一段代码public class first{ public static void main(String[] args){ add(5,8); } public static int add(int a, int b){ int c = a + b; int d = c + 9; return d...

2020-05-01 13:02:33 491

原创 Hotspot JVM 底层C/C++ 源码 入门--1介绍

本系列参考书籍 : 《揭秘Java 虚拟机-JVM设计原理与实现》推荐预备技能: 掌握C++函数指针,汇编call调用即可~0 -从Java字节码走向汇编先看一段代码#include<stdio.h>const unsigned char code[] = "\x55\x89\xe5\x8b\x45\x0c\x8b\x55\x08\x01\xd0...

2020-04-30 23:39:29 990

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除