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
申请对象内存
成