JavaEE初阶-jvm

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [1. jvm内存区域划分](#1. jvm内存区域划分)
  • [2. jvm类加载过程](#2. jvm类加载过程)
    • [2.1 加载](#2.1 加载)
    • [2.2 验证](#2.2 验证)
    • [2.3 准备](#2.3 准备)
    • [2.4 解析](#2.4 解析)
    • [2.5 初始化](#2.5 初始化)
    • [2.6 双亲委派模型](#2.6 双亲委派模型)
  • [3. 垃圾回收机制GC](#3. 垃圾回收机制GC)
  • 总结

前言

1. jvm内存区域划分

jvm就是面试八股文


就是模拟硬件上的计数器,用内存来

程序计数器保存的指令地址其实就是指向元数据区的



栈帧就是方法的调用




2. jvm类加载过程






2.1 加载

2.2 验证








这个是常量池


2.3 准备



2.4 解析


2.5 初始化


父类就是五个步骤再来一遍

2.6 双亲委派模型

这是类加载步骤中的第一个步骤中的一个环节:找到class文件位置



如果⼀个类加载器收到了类加载的请求,它⾸先不会⾃⼰去尝试加载这个类,⽽是把这个请求委派给⽗类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当⽗加载器反馈⾃⼰⽆ 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,⼦加载器才会尝试⾃⼰去完成加载。

• 启动类加载器:加载 JDK 中 lib ⽬录中 Java 的核⼼类库,即$JAVA_HOME/lib⽬录。 扩展类加载

器。加载 lib/ext ⽬录下的类。

• 应⽤程序类加载器:加载我们写的应⽤程序。

• ⾃定义类加载器:根据⾃⼰的需求定制类加载器。

双亲委派模型的优点

  1. 避免重复加载类:⽐如 A 类和 B 类都有⼀个⽗类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进⾏加载时就不需要在重复加载 C 类了。
  2. 安全性:使⽤双亲委派模型也可以保证了 Java 的核⼼ API 不被篡改,如果没有使⽤双亲委派模
    型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为 java.lang.Object
    类的话,那么程序运⾏的时候,系统就会出现多个不同的 Object 类,⽽有些 Object 类⼜是⽤⼾⾃
    ⼰提供的因此安全性就不能得到保证了。

maven

是一个管理第三方库的工具

3. 垃圾回收机制GC

C++如果申请了资源,不释放--》就会内存泄漏

java:放心new,jvm会自动识别哪些new的对象再也不用了---》可以自动释放掉--》垃圾回收

垃圾回收会有代价:消耗CPU,性能降低,所以没有引入垃圾回收


3.1 谁是垃圾

引⽤计数算法


这里的1就是引用计数







但是,在主流的JVM中没有选⽤引⽤计数法来管理内存,最主要的原因就是引⽤计数法⽆法解决对象的循环引⽤问题

可达性分析

Java并不采⽤引⽤计数法来判断对象是否已"死",⽽采⽤"可达性分析"来判断对象是否存活(同样采⽤此法的还有C#、Lisp-最早的⼀⻔采⽤动态内存分配的语⾔)。

此算法的核⼼思想为 : 通过⼀系列称为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索⾛过的路径称之为"引⽤链",当⼀个对象到GC Roots没有任何的引⽤链相连时(从GC Roots到这个对象不可达)时,证明此对象是不可⽤的。



那么这些对象都是可达的



3.2 回收垃圾

标记-清除算法

"标记-清除"算法的不⾜主要有两个 :

  1. 效率问题 : 标记和清除这两个过程的效率都不⾼
  2. 空间问题 : 标记清除后会产⽣⼤量不连续的内存碎⽚,空间碎⽚太多可能会导致以后在程序运⾏中需要分配较⼤对象时,⽆法找到⾜够连续内存⽽不得不提前触发另⼀次垃圾收集

复制算法

"复制"算法是为了解决"标记-清理"的效率问题。它将可⽤内存按容量划分为⼤⼩相等的两块,每次只

使⽤其中的⼀块。当这块内存需要进⾏垃圾回收时,会将此区域还存活着的对象复制到另⼀块上⾯,然后再把已经使⽤过的内存区域⼀次清理掉。这样做的好处是每次都是对整个半区进⾏内存回收,内存分配时也就不需要考虑内存碎⽚等复杂情况,只需要移动堆顶指针,按顺序分配即可


标记-整理算法

标记过程仍与"标记-清除"过程⼀致,但后续步骤不是直接对可回收对象进⾏清理,⽽是让所有存活对象都向⼀端移动,然后直接清理掉端边界以外的内存

但是搬运的开销也不小

分代算法

当前 JVM 垃圾收集都采⽤的是"分代收集(Generational Collection)"算法,这个算法并没有新思想,

只是根据对象存活周期的不同将内存划分为⼏块。⼀般是把Java堆分为新⽣代和⽼年代。在新⽣代

中,每次垃圾回收都有⼤批对象死去,只有少量存活,因此我们采⽤复制算法;⽽⽼年代中对象存活率⾼、没有额外空间对它进⾏分配担保,就必须采⽤"标记-清理"或者"标记-整理"算法。

哪些对象会进⼊新⽣代?哪些对象会进⼊⽼年代?

• 新⽣代:⼀般创建的对象都会进⼊新⽣代;

• ⽼年代:⼤对象和经历了 N 次(⼀般情况默认是 15 次)垃圾回收依然存活下来的对象会从新⽣代

移动到⽼年代。

新创建的对象放在伊甸区


⾯试题 : 请问了解Minor GC和Full GC么,这两种GC有什么不⼀样吗

  1. Minor GC⼜称为新⽣代GC : 指的是发⽣在新⽣代的垃圾收集。因为Java对象⼤多都具备朝⽣⼣灭的特性,因此Minor GC(采⽤复制算法)⾮常频繁,⼀般回收速度也⽐较快。
  2. Full GC ⼜称为 ⽼年代GC或者Major GC : 指发⽣在⽼年代的垃圾收集。出现了Major GC,经常会伴随⾄少⼀次的Minor GC(并⾮绝对,在Parallel Scavenge收集器中就有直接进⾏Full GC的策略选择过程)。Major GC的速度⼀般会⽐Minor GC慢10倍以上

3.3 垃圾收集器


重点关注CMS(java8),G1(现在)

(Stop The World,译为停⽌整个程序,简称 STW)。

总结

相关推荐
醇氧2 小时前
Idea防止工具栏自动隐藏
java·ide·intellij-idea
m0_639817152 小时前
基于springboot教学资料管理系统【带源码和文档】
java·spring boot·后端
靠沿3 小时前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
qq_12498707533 小时前
基于springboot的建筑业数据管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·毕业设计
一 乐3 小时前
宠物管理|宠物共享|基于Java+vue的宠物共享管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·springboot·宠物
a crazy day3 小时前
Spring相关知识点【详细版】
java·spring·rpc
白露与泡影3 小时前
MySQL中的12个良好SQL编写习惯
java·数据库·面试
foundbug9993 小时前
配置Spring框架以连接SQL Server数据库
java·数据库·spring
凯酱4 小时前
@JsonSerialize
java