JVM自学手记2021-05-12

JVM自学手记

class加载过程

class cucle : class -> loading -> linking(verification -> preparation -> resolution)(class ->静态变量赋默认值) -> initializong(静态变量赋值为初始值) -> GC

1.loading :

自定义类加载器
Classloader.class – loadCass – findClass
自定义classload CustomClass (模板设计)
1.extend ClassLoad 重写
2.findClass() -> defineClass(byte[] -> Class clazz)
3.加密

- 双亲委派机制
如何打破?
1.jdk1.2之前,自定义ClassLoad都必须重写loadClass()
2.ThreadContentClassLoader可以实现基础类调用实现类代码,通过thread.setContentClassLoader指定
3.热启动,热部署
1.osgi tomcat都有自己的木块指定classloader(可以加载同一类库的不同版本)

- LazyLoading五种情况
1.-new getstatic putstatic invokestatic指令,访问final变量除外
-java.lang.reflect对类进行反射调用时
-初始化子类的时候,父类首先初始化
-虚拟机启动时,被执行的主类必须初始化
-动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic
REF_invokestatic的方法句柄时,该类必须初始化
----ClassLoader的源码
1.findCache -> parent.loadClass -> findClass()

2.Linking

1.verificaion
	1.验证文件是否符合JVM规定
2.Preparation
	1.静态成员变量赋默认值
3.Resolution
	1.将类、方法、属性等符号引用接卸为直接引用
	常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用

3.initializong
1.调用类初始化代码

JMM
硬件层数据一致性
intel用MESI
https://www.cnblogs.com/z00377750/p/9180644.html
MESI CPU一致性协议
现代CPU的数据一致性实现= 缓存锁(MESI…)+总线锁
读取缓存以cache line为基本单位,目前64bytes
位于同一缓存星的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题
伪共享问题:JUC/c_028_FlaseSharing
使用缓存行的对齐能够提高效率

注意:disruptor框架

乱序问题 volatile
CPU为了提高指令执行效率,会在一条指令执行过程中(比如去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系
https://www.cnblogs.com/liushaodong/p/4777308.html
写操作也可以合并写 4个字节(CPU只有4个字节高速写)
https://www.cnblogs.com/liushaodong/p/4777308.html
Disorder

如何保证特定情况下不乱序
有序性保障
CPU内存屏障

硬件内存屏障 X86
	sfence 写(store)
	lfence 读(load)
	mfence 读写 (modify/mix)

	原子指定,如x86上得lock Full Barrier
JVM级别如何规范(JSR133)
	LoaddLoad屏障:
	StoreStore
	LoadStore
	StoreLoad
	
-- intel  lock

volatile的实现细节
1.字节码层面
ACC_VOLATILE
2.JVM层面
volatile内存区的读写 都加屏障
storestoreb loadstoreb
volatile 写操作 volatile 读操作
storeloadb loadloadb
3.OS和硬件层面
链接: https://blog.csdn.net/qq_26222859/article/details/52235930.
hdis-HotSpot Dis Assember
window lock指令实现

synchronized的实现细节
1.字节码层面
monitorentor monitorexit
2.JVM层面
c c++ 调用了操作系统提供的同步机制
3.OS和硬件层面
X86:lock comxchg xxx

排序规范(了解)
happens-before原则
as if serial

观察虚拟机配置
java -XX:PromtCommandLineFlags -version

1.对象创建过程
loading linking initializing
申请对象内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值