【后端秘籍】【JVM篇】第一章

过去一年,工作忙碌,博客成了被遗忘的角落。时间飞逝,我决定重拾这段旅程,重新在这里记录我的思考与成长。

还是那句话,学起来:基础不牢,地动山摇。
写博客不仅是分享,更是与大家的连接。我希望通过这条渠道,找回那份灵感与激情。未来的日子,我会用心去记录,期待与每一位读者共同成长。关注我吧!

1.JVM的垃圾收集器有哪几种

JVM 主要有以下几种垃圾收集器:

Serial 收集器:单线程收集器,适用于单核处理器,简单且效率高。

ParNew 收集器:Serial的多线程版本,提升了新生代垃圾收集的效率。

Parallel 收集器:重视系统吞吐量,通过多线程并行处理垃圾收集,适合需要高吞吐量的场景。

CMS 收集器:旨在减少回收停顿时间,适合对延迟敏感的应用,使用并发收集方式。

G1 收集器:适用于大内存环境,能高效管理内存并优化回收停顿时间,逐步替代CMS。

2.类加载器的双亲委派模型

双亲委派模型确保类的加载顺序。加载时,类加载器会首先请求其父类加载器加载,如果父类加载器无法加载,再由子类加载器进行加载。这种机制可以避免类的重复加载和冲突。

3.JVM内存模型

JVM内存模型将堆内存分为新生代(Eden 区和Survivor 区)和老年代:

  • Eden 区:存放新生成的对象。
  • Survivor 区:包括 From 和 To 两个区域,存活对象在新生代中进行转移。
  • Tenured 区:老年代,存放长生命周期的对象。

4.新生代与老年代的垃圾收集策略

新生代:通常采用复制算法,因对象存活率低,回收速度快。

老年代:多采用标记-整理或标记-清除策略,因对象存活率高,减少内存碎片化。

5.方法区的作用

方法区用于存储类信息、常量、静态变量等,是各线程共享的数据区域。其设计目的是保证类数据唯一,节省内存,并确保数据的安全访问。

6.Full GC的触发条件

Full GC可能在以下情况下触发:

  • 老年代或方法区空间不足
  • 显式调用 System.gc()
  • JNI引用的情况下调用 System.gc()

7.Minor GC与Full GC的区别

Minor GC:发生在新生代,回收速度快,频繁触发。

Full GC:清理整个 Java 堆和方法区,速度较慢,影响较大。

8.栈内存溢出的情况

栈内存溢出主要发生在以下情况:

线程请求的栈深度超过 JVM 限制,抛出 StackOverflowError。

虚拟机栈动态扩展时无法分配足够内存,抛出 OutOfMemoryError。

9.Java内存模型(JMM)

Java 内存模型定义了共享内存中变量的访问规则,确保在多线程环境下,线程之间的互斥和可见性。它保证了一个线程对变量的修改对其他线程是可见的,避免数据不一致问题。

10.对象的finalize()方法

finalize() 方法在对象被垃圾回收器标记准备回收之前调用,用于资源释放。然而,因其调用时机不确定且在 JDK 9 中已被废弃,不推荐使用。

相关推荐
金銀銅鐵2 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
jyOverQ3 小时前
从零学 JVM(五):垃圾回收机制——对象存活判断与 GC Roots
jvm
金銀銅鐵7 小时前
一个 4 个常量的枚举,Kotlin 在字节码里生成了什么
jvm·kotlin
2301_808414389 小时前
Linux线程的同步与互斥
jvm
曲径海盗1 天前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
寂寞的船4 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
金銀銅鐵6 天前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
yeccheng7 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
On The Road :9 天前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Yves..9 天前
JVM 学习笔记:内存区域、类加载机制与垃圾回收
jvm