一,class加载过程
1.1,在java代码被编译成.class文件之后,我们通过类加载器加载class文件,加载的过程主要分为三个步骤,loading,linking,resolution三个步骤,将我们的class文件加载到我们的元空间中(jdk版本为1.8)。
如下图所示:
linking分为三大步:
verification是校验装载class文件是不是合法的,加入不是CAFE BA BE。这一步就无法通过,或者我们常见的version 52的错误,jdk版本不对问题,就是在这一步检验的。
preparation是把class文件静态变量赋默认值
resolution是把class文件常量池里面用到的符号引用,要给它转换为直接内存地址,直接可以访问到内容。
1,2基于双亲委派的类加载机制。
首先我们看一下源码,classloader类的loadclass方法
类加载的过程如上图所示。
检测热点代码设置阈值:XX:CompileThreshod=10000 -Xmixed混合模式, -Xint执行很慢,启动很快
解释模式 -Xcomp纯编译模式,执行很快,启动很慢
二,java内存模型
2.1内存布局,对象的内存布局如下图
PC,全称是programcount程序计数器,记录的是我们下一条指令是什么,jvm线程的指令是存放在栈帧中,想象一下当多线程执行的时候,jvm线程失去cpu占用,我们会将现场保护好,就是将要执行的指令放pc中,等待下次线程占据cpu线程可以继续执行。
jvmstack,保存的是线程独有的变量。可以是基础类型的变量,也可以是对象(基于逃逸分析,标量替换)
Metaspace,保存class文件,静态变量。
heap堆区,对象变量主要分配在heap上,垃圾回收主要也是发生在heap。下面我们对heap详细讲解。
三,垃圾回收算法
3.1,根可达算法Root Searching。
首先我们解释什么是Root? 废话不多说 直接上图
3.2,GC Algorithms(常见的垃圾回收算法)
1,Mark-Sweep标记清除
2,copying拷贝
3,Mark-Compact标记压缩
3.3,堆内存逻辑分区
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。