12.JVM

一.JVM类加载机制:把类从硬盘文件加载到内存中

1.java文件,编写时是一个.java文件,编译后现成一个.class的字节码文件,运行的时候,JVM就会读取.class文件,放到内存中,并且构造类对象.

2.类加载流程:

a.加载:找到.class文件,打开文件,读取内容,尝试解析文件内容.

b.验证:检查.class文件的内容格式,是否符合要求.

c.准备:给类对象分配内存.

d.解析:初始化类对象中涉及到的一些字符串常量,把常量池内的符号引用替换成直接引用(把相对地址(偏移量)替换成真实的内存地址).

e.初始化:对类对象进行更具体的初始化,例如静态成员,静态代码块,父类等等.

3.双亲委派模型:

a.类加载器:JVM加载.class文件的时候,需要用到类加载器的模块,JVM自带三个类加载器(程序员可以自己写),分别如下.

1)Bootstrap ClassLoader 加载标准库中的类.

2)Extension ClassLoader 加载JVM扩展的类(各个厂商实现的JVM不同).

3)Application ClassLoader 加载第三方库的类,如jdbc driver,servlet,jackson等.

注意:这三个类加载器,从上往下依次是父子关系(不是继承,而是对象中有指向父类的引用).

b.类加载流程:从第三个开始(Application ClassLoader),往上传到最顶层,然后开始寻找,如果找不到,依次往下丢.

c.目的:明确优先级,标准库最优,扩展库其次,三方库最低,如果有同包同名的类,只加载优先级最高的.

4.类的加载和卸载时机

a.加载:采用懒汉模式:

1)构造类的实例.

2)用到类的静态方法或属性.

3)子类的加载会触发父类.

b.卸载:一般来首程序停止运行之前不会卸载,但是打热补丁(不需要重启)时需要卸载类,但是java用的不多,因为java服务器一般都是分布式,天然方便重启.

二.垃圾回收(GC机制)

1.判断对象是否为垃圾:如果一个对象,在后续代码中不会被使用到(没有引用指向它),那么就认为是垃圾.具体的实现方法如下:

a.(Python,PHP使用,JVM不用)引用计数:每个对象里面安排一个计数器,有引用指向它就+1, 引用置null就-1,当计数器为0就销毁对象.

引用计数缺陷:

1)空间利用率比较低.

2)可能会存在循环引用问题,导致既无法访问,又无法销毁,类似于死锁.

b.(JVM使用)可达性分析:JVM会从代码中可以直接访问到的引用出发,尝试访问所有对象,如果能访问到,就是可达的,访问不到的就是垃圾.

注意:会有好几个扫描线程,周期性地进行扫描.

比较:引用计数消耗的是空间,可达性分析消耗的是时间.

2.释放对象内存

a.(不用)标记清除(直接释放).

缺点:内存都是连续申请的,这样做会破坏内存的连续性,造成许多的内存碎片,会导致有内存却无法申请的情况.

b.复制算法:把内存空间一分为二,每次扫描过后,将有效的对象复制到另一侧.

优点:解决内存碎片问题.

缺点:内存浪费了一半,而且复制的开销可能会很大.

c.标记整理:类似于顺序表删除元素,将有效对象往前搬运.

优点:避免了内存利用率低的问题.

缺点:搬运的开销还是很大.

d.(JVM使用)分代回收:将类分成两种,既生命周期很短的,和生命周期很长的(扫描线程每扫描一次,年龄增加1).

注意:如果一个对象特别大,会直接进入老年代.

相关推荐
超级种码16 分钟前
Java:JavaAgent技术(java.instrument和java.attach)
java·开发语言·python
甜鲸鱼24 分钟前
【Spring AOP】操作日志的完整实现与原理剖析
java·spring boot·spring
狗头大军之江苏分军28 分钟前
年底科技大考:2025 中国前端工程师的 AI 辅助工具实战盘点
java·前端·后端
一 乐1 小时前
酒店客房预订|基于springboot + vue酒店客房预订系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
计算机毕设指导61 小时前
基于Spring Boot的防诈骗管理系统【源码文末联系】
java·spring boot·后端·spring·tomcat·maven·intellij-idea
a程序小傲1 小时前
饿了吗Java面试被问:Redis的持久化策略对比(RDBVS AOF)
java·redis·面试
我家领养了个白胖胖1 小时前
MCP模型上下文协议 Model Context Protocol & 百度地图MCP开发
java·后端·ai编程
Coder_Boy_1 小时前
基于DDD+Spring Boot 3.2+LangChain4j构建企业级智能客服系统
java·人工智能·spring boot·后端
黄俊懿1 小时前
【深入理解SpringCloud微服务】Spring-Security作用与原理解析
java·后端·安全·spring·spring cloud·微服务·架构师
塔能物联运维1 小时前
设备自适应采样率忽视能耗致续航降 后来结合功耗模型动态调优
java·后端·struts