JVM 学习笔记(4):内存分配与回收策略
2023-06-13 09:12:58 时间
1、对象优先在 Eden 区分配
一般情况下,对象都优先在新生代的 Eden 区中分配,当 Eden 内存不足时将会发起一次 Minor GC。
2、大对象直接进入老年代
大对象指的是占用大量连续内存的 Java对象,例如长字符串、长数组等,这些大对象的内存分配可能会遭遇总空间充足但连续空间不足而无法分配的情况,或者在复制对象时产生高昂的成本,因此在 Serial 或者 ParNew 虚拟机中可以使用参数 -XX:PretenureSizeThreshold
来设置大对象的阈值,超过此值会直接进入老年代。
3、长期存活对象进入老年代
对于分代收集来说,判断对象进入老年代的依凭是对象的年龄,在对象头中会有标记对象年龄的计数器,对象每在 Survivor 区中熬过一次垃圾收集则年龄加一,当年龄达到阈值时会晋升如老年代中,可以通过参数 -XX:MaxTenuringThreshold
来设置年龄阈值。
4、动态对象年龄判定
为了适应内存实际情况,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 的一半,则大于或等于该年龄的对象可以直接进入老年代,无需达到阈值要求。
5、空间分配担保
在发生 Minor GC 之前,如果老年代连续空间大于新生代对象总大小 或者 历次新晋老的平均大小 时则会正常进行,否则会进行一次 Full GC。在这里老年代空间就是用来做 Survivor 的超额担保。
•参考资料:•《深入理解Java虚拟机(第三版)》——周志明[1]
相关链接
[1]
《深入理解Java虚拟机(第三版)》——周志明: https://book.douban.com/subject/34907497/
相关文章
- JVM初探(一):jvm内存结构[通俗易懂]
- tomcat8 JVM 优化
- JVM内存模型详解「建议收藏」
- JVM之内存模型与线程
- Tomcat 调优及 JVM 参数优化
- 深入理解jvm和jvm基本调优参数
- jvm字符串常量池_java 常量池
- JVM 学习笔记(1):Java内存区域
- byte[]做缓存key导致JVM异常
- JDK 17 之 JVM调优 史诗级 教程
- 一文读懂JVM虚拟机
- java虚拟机内存大小_jvm内存分布
- JVM 面试基础准备篇(一)
- JVM 一张图带你了解内存分配过程 搞懂逃逸分析|标量替换|指针碰撞|空闲列表|TLAB
- JVM实操篇-线上CPU占用飙升99%,系统响应延时飙升访问偶发白屏
- 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
- BlockingQueue接口 – JVM阻塞队列
- JVM 内存分代、垃圾回收漫谈详解编程语言
- Hbase JVM优化详解大数据
- JVM原理讲解和调优详解编程语言
- 一个可以参考的JVM内存分配详解编程语言
- 参数调整Linux系统下JVM参数的步骤(linux设置jvm)
- Linux下调整JVM参数的步骤(linux设置jvm参数)
- 使用JVM在Linux系统中执行多线程操作(jvm线程linux)
- 如何在Linux系统上安装JVM?-教你简单易懂的方法(linux安装jvm)
- Linux查看JVM内存使用情况指南(linux查看jvm内存)
- 如何在Linux下修改JVM参数配置(linux修改jvm参数)
- Oracle JVM大路在何方(jvm路径 oracle)
- 基于JVM调优的技巧总结分析
- jvm内存溢出解决方法(jvm内存溢出怎么解决)