深入了解JVM

堆的内存划分

堆分为新生代和老年代,新生代占三分之一,老年代占三分之二

新生代又分成Eden和两个Survivor两个区,比例为8:1:1

新对象优先在Eden区分配,满了就会触发Minor GC,存活的放到幸存区,两个幸存区轮流用

每熬过一次GC年龄加1,年龄到15,或者幸存区放不下了就晋升到老年代

老年代满了就触发FULL GC

为什么新生代默认用8:1:1的比例

因为根据统计新生代中的90%以上的对象活不过第一次GC,意味着每次Minor GC只需要预留10%给存活对象就够了,这个比例就是在空间利用率和晋升老年代的风险之间取得平衡,可以通过
-XX:SurvivorRatio 调整

为什么要熬过15次GC

不是必须15次,而是最多15次,jvm对象头中用于记录分代年龄的字段只有4个bit位,这个参数可以进行配置--XX:MaxTenuringThreshold

说说一下JVM类加载器分类与核心功能

类加载器是JVM用来把.Class文件加载到内存,转化成Class对象的组件

java里有如下几类加载器

  • 启动类加载器:负责加载<JAVA_HOME>/lib下的核心库如rt.jar
  • 扩展类加载器(JDK9之后改为平台类加载器):负责加载<JAVA_HOME>/lib/ext下的扩展库
  • 应用程序类加载器:负责加载ClassPath下的类库,包括业务代码和第三方JAR包
  • 自定义加载器:负责加载用户自定义路径下的类包,通过继承ClassLoader类并重写findClass方法可以自定义类加载器,典型场景比如Tomcat的WebAppClassLoader,OSGi的模块隔离

Java 中的强引用、软引用、弱引用和虚引用分别是什么?

  • 强引用: Object obj =new object()就是强引用,只要存在,GC永远不会回收,即使OOM
  • 软引用:通过SoftReference包装的引用,内存够用的时候不会受,内存吃紧快要OOM是才回收
  • 弱引用:通过WeakReference包装的引用,只要GC那么就会回收
  • 虚引用:唯一的用途是监控对象什么时候被回收

JVM的TLAB是什么?

TLAB是JVM给每个线程划分的一小块私有堆内存,专门用于加速对象分配,不用和别的线程枪锁,提高了分配效率。线程分配时优先从子的TLAB拿内存,不够的话从Eden区申请新的,如果对象太大就直接在Eden区装配,绕过TLAB。

存在内存碎片化问题

比如生了8字节,但下一个对象要16字节,这时候得申请新的TLAB,那老的TLAB里的8字节就浪费了

HotSpot的处理方式是用一个填充对象将此填满,不填的话堆在线性遍历时遇到此空洞就会断

相关推荐
2602_9599609210 小时前
Java大厂面试实录:Spring Boot、Redis、Kafka、Elasticsearch、分布式事务与云原生高并发系统
java·jvm·spring boot·redis·面试题
鱼鳞_11 小时前
热门八股-JVM
java·jvm
studyForMokey11 小时前
【Android 内存管理】JVM 内存模型与 GC 原理
android·jvm
城管不管20 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
金銀銅鐵1 天前
[Java] 一个方法最多可以有多少个入参?
java·jvm
哭哭啼1 天前
JAVA服务问题诊断
java·开发语言·jvm
2602_959960921 天前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
Javatutouhouduan2 天前
Java初学者如何高效学习JVM?
java·jvm·java虚拟机·java面试·后端开发·java程序员·java八股文
2602_959960922 天前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
wuminyu2 天前
JDK21中FFM api的upcall回调机制解析
java·linux·c语言·jvm·c++