复习JVM

JVM的三个主要主题:

1.java内存区域划分:

a. 堆 b. 栈 c. 元数据区 d. 程序计数器

2. 类加载

a. 加载: 打开.class文件, 读取内容

b. 验证: 验证.class文件的格式是否符合要求.

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

d. 解析: 初始化字符串常量

e. 初始化: 对类对象中的各个部分初始化,比如 静态代码块, 静态成员的初始化等

经典面试题: 双亲委派模型

他出现在 " 加载" 环节,根据"全限定名称" 寻找对应的.class文件, JVM中内置了三个类加载器:

  1. BootstrapClassLoader 2. ExtensionClassLoader 3. ApplicationClassLoader

未找到: ClassNotFoundException.

3. 垃圾回收机制 GC

两个步骤:

1.找到垃圾 (判断是否有引用指向它)

a. 引用计数 : 在对象中维护一个计数器, 如果计数器不为0,则有引用,否则无引用,标记为垃圾

缺点: 消耗额外内存

循环引用: 两个对象互相引用,计数器就永远不为0,

b. 可达性分析(JVM采用的方式) :

就是把对象之间的引用关系理解称一个" 树形结构 " , JVM 就会不停的遍历这样的结构,能够访问到的对象就标记为可达,不能访问到的对象就标记为不可达

2.释放对应的内存

a. 标记-清除 :

将标记为垃圾的对象对应的内存释放掉

b. 复制算法:

将分配的内存划分为两块, 将不是垃圾的对象拷贝到另外一块空间中,将之前的空间直接全部释放掉

缺点: 空间浪费太多

c. 标记-整理:

就像"顺序表删除中间元素" , 将非垃圾的对象覆盖掉标记为垃圾的对象

JVM 的实际方案是, 分代回收

堆中的内存分为 : 新生代和老年代

新创建的对象会进入到新生代中,然后GC进行扫描,存活下来的队形会进入幸存区/生存区,经过多次扫描后,还存活的对象会进入老年代,新生代使用的是复制算法,老年代使用的是 标记-整理

相关推荐
light blue bird2 小时前
主从执行端动机模块工序协同组件
jvm·数据库·.net·桌面端
xcjbqd03 小时前
Python中Pandas如何将DataFrame写入MySQL_使用to_sql函数
jvm·数据库·python
呆呆在发呆.3 小时前
JavaEE初阶
java·jvm·网络协议·学习·udp·java-ee·tcp
xhuiting4 小时前
JVM专题(一)
jvm
A_QXBlms6 小时前
企微工具对比:群发自动化脚本与定时任务集成
jvm·自动化·企业微信
Y40900116 小时前
【多线程】线程安全(1)
java·开发语言·jvm
Lyyaoo.1 天前
【JAVA基础面经】进程安全问题(synchronized and volatile)
java·开发语言·jvm
wgzrmlrm741 天前
mysql如何配置全文索引停用词_mysql ft_stopword_file设置
jvm·数据库·python
heimeiyingwang1 天前
【架构实战】JVM调优:GC日志分析与参数调优
jvm·架构
xcjbqd01 天前
如何修改Oracle服务器默认的日期格式_NLS_DATE_FORMAT全局配置
jvm·数据库·python