JVM和GC
本文参考文章:
标题:《【JVM系列1】JVM内存结构》 作者:楼仔 链接:https://mp.weixin.qq.com/s/nSwNZpObWLGteG-v7n5PSw
标题:《JVM内存模型详解(1.7与1.8的区别)》 作者:weihubeats 链接:https://blog.csdn.net/qq_42651904/article/details/88862994
标题:《深入理解JVM虚拟机10:JVM常用参数以及调优实践》 作者:黄小斜 链接:https://blog.csdn.net/a724888/article/details/78367780
一、对象的回收条件
1.引用计数法:为对象添加一个引用计数器,每当对象被引用时,引用计数器+1,引用失效时-1,当引用计数器为0时回收。解决不了对象两两互相引用的情况,造成内存泄漏。
2.可达性分析法(根搜索法):从GC roots根节点开始,沿引用链搜索,凡是引用链上的对象不会被回收。
二、垃圾回收算法
1.标记-清除:对已死对象进行标记,然后清除。会使内存碎片化,后续的大对象无法存入。如果对象存活率普遍偏低(5%-30%),效率也会较低。
2.标记-复制:对存活对象进行标记,然后复制到另一片内存区域。需要额外的内存空间,常用划分为两片内存空间,空间利用率50%。
3.标记-整理:是上述两种算法的一种结合,对存活对象进行标记,将零散的存活的对象整理到内存碎片中。进行GC时,会暂停所有用户线程,用户体验不好。
三、内存模型
JVM内存模型如下图(方法区又称永久代)
其中堆又分为老年代新生代如下图
当对象从Eden(年龄0)取经过一次GC存活后进入Survior from(年龄1),再每经过一次GC存活后年龄+1,直到某个年龄(默认15)进入老年代。老年代容量满时进行Full GC。
四、1.7与1.8的区别
元数据区取代了永久代(方法区)。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存
五、JVM调优常用参数
配置参数 | 功能 |
---|---|
-Xms | 初始堆大小。如:-Xms256m |
-Xmx | 最大堆大小。如:-Xmx512m |
-Xmn | 新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90% |
-Xss | JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。 |
-XX:NewRatio | 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3 |
-XX:SurvivorRatio | 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10 |
-XX:PermSize | 永久代(方法区)的初始大小 |
-XX:MaxPermSize | 永久代(方法区)的最大值 |
-XX:+PrintGCDetails | 打印 GC 信息 |
-XX:+HeapDumpOnOutOfMemoryError | 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~