文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

简单说说JVM堆区的相关知识

2024-04-02 19:55

关注

一、堆概述

1.1 堆内存细分

现代垃圾收集器大部分基于分代收集理论设计,堆空间细分为:

使用下面命令设置堆空间初始化 10m,最大空间 10m


-Xms10m -Xmx10m

使用java visual 查看 visual gc

可以看出通过参数设置的内存大小 只与新生代(Eden+s0+s1 ),老年代有关,而在逻辑上还要加上元空间。

1.2 堆空间大小的设置

1.2.1 通过参数设置


-Xms 用来设置堆空间(年轻代+老年代)的初始内存大小
  -X 是jvm的运行参数
  ms 是memory start
  
-Xmx 用来设置堆空间(年轻代+老年代)的初始内存大小

1.2.2 默认空间大小

使用一下代码查看 当前jvm初始化内存与最大内存



public class Test9 {

    public static void main(String[] args) {
        //返回jvm中的内存总量(字节)
          long initialMemory = Runtime.getRuntime().totalMemory()/1024/1024;
        //虚拟机将尝试使用最大堆内存
         long maxMemory = Runtime.getRuntime().maxMemory()/1024/1024;
        System.out.println("-Xms:"+initialMemory+"m");

        System.out.println("-Xmx:"+maxMemory+"m");


        System.out.println("系统大小:"+initialMemory*64/1024+"G");
        System.out.println("系统大小:"+maxMemory*4/1024+"G");

    }

}

结果(本机运行内存为 8g)

1.2.3 通过参数设置堆空间大小后内存不一致问题

设置300

查看



public class Test9 {

    public static void main(String[] args) {
        //返回jvm中的内存总量(字节)
        long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
        //虚拟机将尝试使用最大堆内存
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
        
        System.out.println("-Xms:" + initialMemory + "m");

        System.out.println("-Xmx:" + maxMemory + "m");
        
    }

}

结果

分析

在vm参数设置里面加上


-XX:+PrintGCDetails 

再次运行程序查看

原理

新生代的s0 和 s1 只能有一个生效

1.3 年轻代与年老代

一类是生命周期较短的瞬时对象。

另外一类是对象生命周期非常长。

可以通过 -XX:NewRation设置新生代与老年代的比例,默认值是2.(一般都不会去设置)

1.4 对象分配过程

1.new的对象先放伊甸区,此区有大小限制

2.当伊甸区满的时候,程序需要创建时,jvm的垃圾回收将对伊甸园区进行垃圾回收(minor gc)

3.然后将伊甸园中的剩余对象移动到辛存者0

4.如果再次触发垃圾回收,上次幸存下来的放到幸存者0区,没有回收,就会放到幸存者1区

5.再次经历垃圾回收会重新放回辛存者0区

6.当在辛存者区达到15次时,就可以去老年区了

可以设置参数:-XX:MaxTenuringThreshold=

7.当养老区内存不足时,再次触发GC:major GC,进行养老区的内存处理

8.若养老区进行处理后,依然无法进行对象的保存,就会产生00m异常


java.lang.outofMemoryError:java heap space

9.总结

10.流程

当Eden满时,会触发MinorGC算法来回收memory,旨在清理掉再无引用的数据(在内存里是Tree),意图存储到S0. 若此时S0也满了,会再次MinorGC意图回收S0无引用的数据,把有引用的数据移动到S1。如果S1够用,此时会清空S0;如果S1满了,会回滚刚存入S1的数据,直接把本次GC的数据存入Old区,S0保持刚刚MinorGC时的状态。延伸:如果Old也满了,会触发MajorGC,如果还是不够,则存入Permanent Generate,不幸这里也满了,会在允许的范围内按照内置的规则自动增长,可能不会发生GC,也可能会。当增长的量不够存时,会触发Full GC。若FullGC后还是不够存,自动增长的量也超过了允许的范围,则发生内存溢出。还有一种情况,就是分配的线程栈处于很深的递归或死循环时,会发生栈内存溢出。

二、对象分配过程:Tlab

2.1 为什么要有tlab

2.2什么是tlab

对象分配流程

对象分配流程

三、堆空间常用参数设置

四、堆是分配对象的唯一选择吗

  1. 随着jit编译期的发展与逃逸分析技术成熟,栈上分配与标量替换优化技术导致所有对象都分配到堆上不那么绝对了
  2. 如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么可能被优化成栈上分配

4.1 逃逸分析

判断逃逸的方法:看new 的对象实体是否有可能在方法外被调用

在这里插入图片描述

4.2 代码优化

到此这篇关于简单说说JVM堆区的相关知识的文章就介绍到这了,更多相关JVM堆区内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯