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 出当前的内存堆转储快照,以便分析用

   

 

posted @   小皮睡不醒  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示