JVM学习-堆空间(二)

embedded/2024/10/22 14:27:31/
年轻代与老年代
  • 存储在JVM中的Java对象被划分为两类
    • 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速
    • 一类对象的生命周期很长,在某些极端情况下还能够与JVM的生命周期保持一致
  • Java堆区进一步细分的话,分为年轻代(YoungGen)和老年代(OldGen)
  • 其中年轻代可以划分为Eden空间、Survior0空间和Survior1空间(或from区和to区)
    在这里插入图片描述
  • 配置新生代和老年代在堆结构的占比
    • 默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3
    • 可以修改-XX:NewRatio=4,表示新生代1,老年代占4,新生代占整个堆的1/5
  • 新生代当中,默认Eden和Survivor的比例为8:1:1,但使用时比例为6:1:1,运行时需要关闭自适应策略,可能不起作用(-XX:-UseAdaptiveSizePolicy)
    • 显示指定-XX:SurvivorRatio=8可以将比例调整为8:1:1
  • 几乎所有的Java对象是在Eden区被new出来的
  • 绝大多数的Java对象的销毁都在新生代进行
    • IBM公司研究表明,新生代中80%对象都是朝生夕死的
  • 可以通过-Xmn设置新生代最大内存大小
    • 这个参数一般使用默认即可
java">C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter05>jinfo -flag SurvivorRatio 8112
-XX:SurvivorRatio=8

设置-XX:NewRatio=2 -Xms512m -Xmx512m,如生命周期比较长的对象多时,建议调大老年代对象比例
在这里插入图片描述

java">//先通过jps查看当前进程PID,通过jinfo命令查看进程的NewRation的设置比例
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter05>jinfo -flag NewRatio 10332
-XX:NewRatio=2
对象分配过程

为新对象分配内存是一件非常严谨和复杂的任务,JVM设计者不仅需要考虑内存如何分配,在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需考虑GC执行完内存回收后是否会在内存空间产生内部碎片。

  1. new对象先放伊甸园区。此区有大小限制
  2. 当伊甸园空间满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁,再加载新的对象放到伊甸园区
  3. 然后将伊甸园中的剩余对象移动到幸存者0区(Survivor0)
  4. 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,放到幸存者1区
  5. 如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区
  6. 啥时候去养老区呢,可以设置次数,默认15次
    • 设置参数:-XX:MaxTenuringThreshold=进行设置
  7. 在养老区,相对悠闲,当养老区内存不足时,再次触发GC:Major GC,进行养老区的内存清理
  8. 若养老区执行了Major GC之后发现依然无法进行对象的保存,就会产生OOM异常
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to
    关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集

    在这里插入图片描述
java">public class HeapInstanceTest {byte[] buffer = new byte[new Random().nextInt(1024*1024)];public static void main(String[] args) {List<HeapInstanceTest> list = new ArrayList<>();while (true) {list.add(new HeapInstanceTest());try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
}
//执行结果
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat com.chapter06.HeapInstanceTest.<init>(HeapInstanceTest.java:12)at com.chapter06.HeapInstanceTest.main(HeapInstanceTest.java:16)

在这里插入图片描述


http://www.ppmy.cn/embedded/42799.html

相关文章

深度学习之基于Tensorflow卷积神经网络验证码识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 随着互联网的快速发展&#xff0c;验证码作为一种有效的防止自动化攻击和用户身份验证的手段&…

Python线程

Python线程 1. 进程和线程 先来了解下进程和线程。 类比&#xff1a; 一个工厂&#xff0c;至少有一个车间&#xff0c;一个车间中至少有一个工人&#xff0c;最终是工人在工作。 一个程序&#xff0c;至少有一个进程&#xff0c;一个进程中至少有一个线程&#xff0c;最终…

【2024软考】史上最全!软考刷题+解析大合集(9万字全手工打,货真价实)

计算机基础知识 1.中断向量表用来保存各个中断源的中断服务程序的入口地址。当外设发出中断请求信号&#xff08;INTR&#xff09;以后&#xff0c;由中断控制器&#xff08;INTC&#xff09;确定其中断号&#xff0c;并根据中断号查找中断向量表来取得其中断服务程序的入口地…

基于地理坐标的高阶几何编辑工具算法(5)——合并相交面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 选中一个面&#xff0c;点击“合并相交面”工具&#xff0c;选择其他相邻面&#xff0c;空格执行合并。 应用场景 用于将相邻或相交的同类型几何面进行合并&#xff0c;达到综合效果。 算法输入 待…

手机怎么恢复照片?2个数据恢复教程详解!

“安卓手机自带相机录的视频和拍的照片被误删了&#xff0c;照片没有同步到云盘或百度网盘&#xff0c;学习资料很重要&#xff0c;折腾了一天&#xff0c;不知道该怎么找回。有没有恢复的方法呢&#xff1f;求告知&#xff0c;谢谢大家&#xff01;” 无论是珍贵的家庭瞬间、…

C语言之指针进阶(3),函数指针

目录 前言&#xff1a; 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结&#xff1a; 前言&#xff1a; 本文主要讲述C语言指针中的函数指针&#xff0c;包括函数指针变量的概念、创建…

从 0 实现一个文件搜索工具 (Java 项目)

背景 各文件系统下, 都有提供文件查找的功能, 但是一般而言搜索速度很慢 本项目仿照 everything 工具, 实现本地文件的快速搜索 实现功能 选择指定本地目录, 根据输入的信息, 进行搜索, 显示指定目录下的匹配文件信息文件夹包含中文时, 支持汉语拼音搜索 (全拼 / 首字母匹配…

SpringMVC接收请求参数的方式:

接收简单变量的请求参数 直接使用简单变量作为形参进行接收&#xff08;这里简单变量名称需要与接收的参数名称保持一致&#xff0c;否则需要加上RequestParam注解&#xff09;&#xff1a; 细节&#xff1a; 1&#xff1a;SpringMVC会针对常见类型&#xff08;八种基本类型及…