首页 > 系统相关 >演示JVM中对象分配内存过程和OOM发生原因

演示JVM中对象分配内存过程和OOM发生原因

时间:2024-01-10 10:56:06浏览次数:31  
标签:放到 OOM s1 s0 对象 幸存 分配内存 JVM gc

工具:jvisualvm

image

测试代码:

    public static void main(String[] args) throws Exception{
        List<byte[]> list = Lists.newArrayList();
        System.in.read();
        while (true){
            System.out.println("-----"+ DateUtil.now());
            final int mem =1024*1024*4;
            byte[] bytes = new byte[mem];
            list.add(bytes);
            //阻塞通过手动按键控制
            System.in.read();
        }
    }

流程:

  • 在jvm中,如果new一个对象,会放在年轻代中的Eden区。等Eden快满了会后发生 Minor GC,如果对象不能及时清理,会放到下面的survior幸存区,并将对象年龄标记为1。等下一次GC,如果上传的对象还没有及时回收,年龄会上涨为2,经过15次回收,还是不能回收会放到old老年代。老年代满了会发生oom
  • 幸存区分为s0和s1。两个可以是from也可以是to,使用的是复制清除算法,所以他们中间只有一个会存放对象,另一个永远为空。例如:s1是from区,s0为to区,当s1的对象满了之后,会复制到s0区,让s0变成from区,s1变成to区,来回交替15放到老年代
  • 上面的代码会每次放4M数据,会发现Eden区迅速上涨,当满了会放到幸存区,如果幸存区较小会直接放到老年区
    image
    image

线上查看gc详情

启动命令添加jvm参数: -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -Xloggc:gc.log

标签:放到,OOM,s1,s0,对象,幸存,分配内存,JVM,gc
From: https://www.cnblogs.com/cgy1995/p/17956050

相关文章

  • 常见OOM问题之GC overhead limit exceeded 问题详解
    Java运行时环境包含一个内置的垃圾回收(GC)进程。在许多其他编程语言中,开发人员需要手动分配和释放内存区域,以便可以重用释放的内存。另一方面,Java应用程序只需要分配内存。每当内存中的特定空间不再使用时,称为垃圾收集的单独进程会为它们清除内存。垃圾收集手册中更详细地解释......
  • JVM4(运行时内存)
    Java堆从GC的角度还可以细分为:新生代(Eden区、FromSurvivor区和ToSurvivor区)和老年代。(1)新生代是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。新生代又分为Eden区、ServivorFrom、ServivorTo三个区。......
  • 初识JVM​-JVM基础概念
    什么是JVMJVM全称是JavaVirtualMachine,中文译名Java虚拟机。JVM的功能01解释和运行对字节码文件中的指令,实时的解释成机器码,让计算机执行。02内存管理自动为对象、方法等分配内存自动的垃圾回收机制,回收不再使用的对象03即时编译对热点代码进行优化,提升执行效率。Java语言如果不......
  • JVM3(内存区域)
    JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在HotspotVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存......
  • 一文搞定JVM字节码
    公众号《鲁大猿》,寻精品资料,帮你构建Java全栈知识体系 www.jiagoujishu.cn(架构技术.cn)多语言编译为字节码在JVM运行计算机是不能直接运行java代码的,必须要先运行java虚拟机,再由java虚拟机运行编译后的java代码。这个编译后的java代码,就是本文要介绍的java字节码。为什么jvm不能......
  • JVM2(线程)
    (1)线程这里所说的线程指程序执行过程中的一个线程实体。JVM允许一个应用并发执行多个线程。HotspotJVM中的Java线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java线程结束,原......
  • JVM1(基本概念)
    (1)基本概念:JVM是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。(2)运行过程:我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件......
  • Spark orderBy OOM / 执行时间超长
    比如orderbylong_columnorderbydouble_column执行时间超长,或者内存溢出原因:排序的列里有NaN值(极大值),可能是有除法里分母为0导致的。另外,count()也可能因为列里有NaN值而OOM......
  • kubernetes 集群 oom 导致集群无法访问
    现象执行kubectlgetnode无法获取集群状态。日志截图:查看message日志,发现报错存在OOM,并与应用测试的容器相关,截图如下:分析首先,定位最初的oom发生的时间点,是2023年12月15日,如图按照正常逻辑来讲,应用实例做了limit限制,如果应用超出内存限制,应该被杀掉并且进行重新调度。进一步......
  • JVM如何线上调优?
    晚上8点是我和们的业务高峰,—到高峰的时候,发现TP8的蚝时会变高,有明显的手剩,通过排查发现内存使用率也会增大,然后再释放,其他各项指标证正常,于是怀疑是GC导致的,观察服务器的GC情况,发现yongGC情况如下,大概每5分钟,GC55次,峰值最高可以达到20次。FiulGC比较频繁,每5分钟大概0.5次,峰值8次......