在复习Java内存机制的过程中有一些新问题,自问自答,做个记录。
新生代是java堆内存的一部分。堆内存分新生代和老生代两大块,也有把堆内存分为新生代老生代永久代(持久代)三块的说法。(不过这种说法应该逐渐被淘汰,因为从java7开始永久代就已经被移除了。)
新生代继续细分,可以划分出Eden,SurvivorFrom,SurvivorTo三块,Eden区和Survivor的两个区大小的比例默认为8:1:1,新创建的对象如果不是特别大都分配在Eden区和SurvivorFrom,在新生代GC后,这两块内存中仍然存活的对象会被复制到SurvivorTo中或复制到老年代。

1、什么时候触发新生代GC?
在Eden区空间不足时会触发新生代的GC。

2、为什么Survivor区要空出一块?
典型的空间换时间,用10%的新生代内存的浪费,换取新生代GC时更高的效率。由于新生代的对象大多存活时间短,因此时间上更高效的复制算法是更合适的选择,空出一块用于复制存活对象也就是自然而然的选择。

3、新生代的GC用什么回收算法?
上文提到,复制算法。复制算法将还存活的对象直接复制到另一块内存上,再将被复制的内存清空。优点是不会产生内存碎片,实现简单高效,缺点也显而易见,总是会有一部分的内存处于空闲状态。

4、GC的过程的怎样的?
GC触发时,Eden区中存活的对象会被直接复制到SurvivorTo区,SurvivorFrom区中年龄超过配置的对象会复制到老年代,年龄没有达到配置值的对象也被复制到SurvivorTo中。

5、GC时SurvivorTo内存不够怎么处理?
研究表明98%情况下对象都是很快消亡,Survivor区分为两块,而不是三块四块也是为了避免Survivor区过于碎片化的权衡结果,因此在大多数情况下不会出现复制时Survivor区大小不足的情况。如果真的频繁出现,可能需要更改配置,增大Survivor区的内存占比。

6、GC之前如何判断对象是否存活?
主流的实现都是使用可达性分析算法来判断。可达性分析算法是指,以一系列被定义为GC Roots的对象为起点,开始向下搜索引用链,可以到达的对象判断为存活,不可到达的标记为可回收。GC Roots对象包括本地变量表中引用的对象,类静态属性引用的对象(例如一些public static的String对象),方法区中常量引用的对象等。可达性分析算法相比于引用计数算法最大的优势是很好的解决了循环引用的两个对象不能被回收的问题。

JVM复习--新生代GC的更多相关文章

  1. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...

  2. 浅析JVM中的GC日志

    目录 一.GC日志的格式分析 二.运行时开启GC日志 一.GC日志的格式分析 在讲述GC日志之前,我们先来运行下面这段代码 package com.example; public class Test ...

  3. 【转】JVM 分代GC策略分析

    我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我们应该知道,垃圾回收主要是针对 ...

  4. JVM学习之GC常用算法

    出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了哪些问题? 既然是要进行自动GC,那必然会有相应的策略,而这些策略解决了哪 ...

  5. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  7. jvm参数与GC

    一.JVM的新生代.老年代.与永久代 JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 1.新生代:主要是用来存放新生的对象,一般占据堆的1/3空间.由于频繁创建对象,所以新生代会频繁触发Mi ...

  8. 什么是新生代 GC 和老年代 GC

    GC 经常发生的区域是堆区,堆区还可以细分为新生代.老年代 jvm堆示意图 新生代 一个 Eden 区 两个 Survivor 区 老年代 默认 新生代(Young)与老年代(Old)的比例的值为 1 ...

  9. 触发JVM进行Full GC的情况及应对策略

    堆内存划分为 Eden.Survivor 和 Tenured/Old 空间,如下图所示: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为M ...

随机推荐

  1. CentOS 7修改yum源为阿里源

    1.备份本地源 1 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里yum源配置 ...

  2. 31_网络编程-struct

    一.struct   1.简述  我们可以借助一个模块,这个模块可以把要发送的数据长度转换成固定长度的字节.这样客户端每次接收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么 ...

  3. solr 加载 停用/扩展词典

    startup.bat 停止词典的效果

  4. CDH中如何升级Spark

    公司平时使用的CDH版本的hadoop生态,spark任务是基于yarn来管理的,而不是基于原生的spark master slave集群管理. 因此任务的大致启动模式是: 如果是Cluster模式: ...

  5. Python黑客——快速编写信息收集器

    i春秋作家:大木瓜 环境:Python 3模块:LxmlRequestBeautifulsoup开始:首先看一下目标站: http://gaokao.chsi.com.cn/gkxx/zszcgd/d ...

  6. D3.js的基础部分之选择集的处理 enter和exit的处理方法 (v3版本)

    上一节给大家讲述额绑定数据的原理.当数组的长度与元素的数量不一致时,有enter部分和exit部分,前者表示存在多余的数据,后者表示存在多余的元素.本节将给大家介绍如何处理这些多余的东西,最后会给大家 ...

  7. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset

    Logistic Regression with a Neural Network mindset Welcome to the first (required) programming exerci ...

  8. opencv实现canopy算法

    #include "stdafx.h" using namespace cv; int main(int argc, char** argv) { Mat img=imread(& ...

  9. PHP:session无法使用

    今天在将一套程序放到其他服务器上执行的时候,发现后台的登录验证码不管输入正确与否,总是显示: 验证码输入有误 接着就开始debug了. 因为正确的验证码结果已经经过加密之后保存在了session中,所 ...

  10. Azure Redis 缓存使用注意事项与排查问题文档整理

    StackExchange.Redis 使用名为 synctimeout 的配置设置进行同步操作,该设置的默认值为 1000 毫秒. 如果同步调用未在规定时间内完成,StackExchange.Red ...