首页 > 系统相关 >熟悉JVM吗?为什么新生代内存需要有两个Survivor区?

熟悉JVM吗?为什么新生代内存需要有两个Survivor区?

时间:2023-03-19 14:14:55浏览次数:56  
标签:Survivor Eden 对象 GC 内存 JVM Minor

在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?

为什么要有Survivor区

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)

老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。执行时间长有什么坏处?频发的Full GC消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度。更不要说某些连接会因为超时发生连接错误了。

在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:

显而易见,没有Survivor的话,上述两种解决方案都不能从根本上解决问题。

Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。

为什么要设置两个Survivor区

设置两个Survivor区最大的好处就是解决了碎片化。

刚刚新建的对象在Eden中,一旦Eden满了,触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。

碎片化带来的风险是极大的,严重影响JAVA程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间,接下去如果程序需要给一个内存需求很大的对象分配内存,就无法进行分配了,引发内存溢出错误。

 

参考:

 

标签:Survivor,Eden,对象,GC,内存,JVM,Minor
From: https://www.cnblogs.com/xfeiyun/p/17232956.html

相关文章

  • JVM详解
    1JVM运行机制概述JVM运行机制类加载机制:类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显式加载两种方式。隐式加载是指在使用new等方式创建对......
  • 谈谈面试必问的Java内存区域(运行时数据区域)和内存模型(JMM)
    Java内存区域和内存模型是不一样的东西,内存区域是指JVM运行时将数据分区域存储,强调对内存空间的划分。而内存模型(JavaMemoryModel,简称JMM)是定义了线程和主内存之间......
  • jvm 八股
    jvm先掌握4点。1.类加载器,2.内存模型,3.垃圾回收机制,4.性能调优。chapter1学习资料:https://gavinzhang1.gitbooks.io/java-jvm-us/content/la_ji_shou_ji_qi_yu_nei_......
  • Java三大版本。JDK、JRE、JVM
    JavaSE:标准版(桌面程序,控制台开发...)JavaME:嵌入式开发(手机,小家电...)JavaEE:E企业级开发(Web端,服务器开发...)JDK:javadevelopmentkitJava开发者工具JRE:javaruntimeen......
  • 内存淘汰策略
    Redis内存满了怎么办?Redis的内存到达maxmemory了之后会开启内存淘汰策略一个键是过期的,那么它到了过期时间之后是马上从内存中被删除呢?不是,而是指定时间扫描一次,以减轻c......
  • JVM——垃圾回收
    2垃圾回收2.1判断对象可以回收引用计数法计算被引用的数,如果被引用数为0则进行回收可达性分析算法jvm所使用的方法根对象:肯定不能被当做垃圾回收的对象垃......
  • Linux进程通信 | 共享内存
    一、共享内存是什么在Linux系统中,共享内存是一种IPC(进程间通信)方式,它可以让多个进程在物理内存中共享一段内存区域。这种共享内存区域被映射到多个进程的虚拟地址空间中,......
  • 关于float和double类型数据在单片机内存中如何存储和转换
    关于float和double类型数据在单片机内存中如何存储和转换1、单精度浮点型float,双精度浮点型double数据在内存中的存储模型(1)下图为单精度浮点型数据float的存储模型,符号位......
  • jvm jstat -gcutil 参数详解
    jstat-gcutil854410008544进程ID,用jps命令查出1000单位毫秒,每秒读取一次S0survivor0使用百分比S1survivor1使用百分比EEden区使用百分比O老年代使用百分比M......
  • Docker Mysql限制内存
    买了个阿里云的1G单核的服务器,运行了Docker装了数据库占用内存2/3的内存,然后再跑个Java小型程序直接死机,无奈只能减小mysql内存解决后效果:查询了网上资料总结解决方案:......