Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。

从内存回收角度看,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代。再细致一点儿就是Eden空间、From Survivor空间以及To Survivor空间等。

注意:堆=新生代+老年代,不包括永久代(方法区)

从内存分配角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。

新生代

Eden区域和Survivor区域,Survivor区域由FromSpace和ToSpace组成。新建的对象都是由新生代分配内存,Eden空间不足会把存货的对象转移到Survivor中,新生代带下可以由-Xmn控制,也可以通过调节SurvivorRatio控制Eden与Survivor的比例。

MinorGC的过程:MinorGC采用复制算法。首先,把Eden和SurvivorFrom区域中存活的对象复制到SurvivorTo区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果SurvivorTo不够位置了就放到老年区);然后,清空Eden和SurvivorFrom中的对象;最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区。

老年代

用于存放新生代中经过多次垃圾回收仍然存活的对象。

老年代的对象比较稳定,所以MajorGC不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域。它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。

废弃常量满足条件:

没有任何对象引用常量池中的常量,也没有其他地方引用了这个字面量。

无用的类满足以下3个条件:

1、该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;

2、加载该类的ClassLoader已经被回收;

3、该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法;

注意:虚拟机对满足上述三个条件的无用类理论可以回收,但不是必然;HotSpot虚拟机(SunJDK和OpenJDK中所带的虚拟机)提供了-Xnoclassgc参数进行控制。

Minor GC ,Full GC 触发条件

Minor GC触发条件:

当Eden区满时,触发Minor GC。

Full GC触发条件:

1、调用System.gc时,系统建议执行Full GC,但是不必然执行;

2、老年代空间不足;

3、方法区空间不足;

4、通过Minor GC后进入老年代的平均大小大于老年代的可用内存;

5、由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。

本文由51ste.com网友编辑,未经授权,不得转载使用上述作品盈利;个人转载,需标明作者及出处。

jvm对象从新生代到老年代_一文搞懂JVM新生代、老年代和永久代相关推荐

  1. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  2. java中判断undefined_Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  3. python中row是什么意思_一文搞懂Python中的yield

    关注公众号「Python七号」,及时 get Python 技能. yield 可以实现生成器,可以实现协程. 什么是生成器,什么是协程,如果还不了解,可以继续往下看,概念可以不懂,只要理解它的作用和 ...

  4. 一文搞懂JVM架构:入职3个月的Java程序员面临转正

    Java基础 1.JAVA 中的几种数据类型是什么,各自占用多少字节. 2.String 类能被继承吗,为什么. 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true ...

  5. 一文搞懂JVM架构和运行时数据区,全网最新

    1.Java基础面试知识点 Java中==和equals和hashCode的区别 int.char.long各占多少字节数 int与integer的区别 探探对Java多态的理解 String.Str ...

  6. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. python数组类型_一文搞懂Python中的所有数组数据类型

    关于我 编程界的一名小小程序猿,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. 联系:hylinux1024@gmail ...

  8. rest api是什么_一文搞懂什么是RESTful API

    RESTful接口实战 首发公众号:bigsai 转载请附上本文链接 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景 ...

  9. 想自学Java的速来!一文搞懂JVM架构和运行时数据区,满满干货指导

    前言 Java是目前应用最为广泛的软件开发平台之一.随着Java以及Java社区平台的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台.一种文化.一个社区. 作为一个平台,Ja ...

最新文章

  1. java中两个Integer类型的值相比较的问题
  2. 结对项目开发电梯调度 - 整体设计
  3. Java遍历Map对象的四种方法
  4. 【MM模块】Cycle Counting 周期盘点
  5. 可视化大屏设计尺寸_可视化大屏设计_酷炫不是最高效的大屏展示的唯一标准...
  6. 格式小结 css 0926
  7. git(3)---git 安装
  8. 存在sql注入漏洞的php,TCCMS在app/controller/news.class.php存在sql注入漏洞
  9. pat题解java,1039 到底买不买 (20分) Java题解 PAT (Basic Level) Practice (中文)- 巧妙开大数组减少代码量...
  10. 我有一张1996年版一元钱,值多少钱?
  11. python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...
  12. 正找工作的同学看过来——Java项目经验篇
  13. 安装VMware虚拟机及镜像文件
  14. android 软件搬家 换机,手机搬家一键换机
  15. 英语语法回顾7——状语从句特殊用法
  16. 几何光学学习笔记(23)- 5.6 远心光路
  17. spring boot 实现 Kurento 一对一浏览器视频聊天
  18. Fatal error: Cannot use 'Object' as class name as it is reserved in xxx/Object.php on line 77
  19. MD5大小写,32,16
  20. Vulnhub靶场之symfonos:1

热门文章

  1. isnumeric()方法
  2. 荣耀手表GS Pro开箱: 103种运动模式、超长续航更安心
  3. c++模板的概念全新解释
  4. 职场漂流记:学会没脸没皮
  5. 为什么APP需要做漏洞渗透测试服务?
  6. PowerDesigner16.5设置主键自增Identity
  7. 主定理与主方法:一类递归式的紧确界分析
  8. 中国移动张志宏:软件定义与开源、云计算密不可分
  9. ApkBus---四种方案解决ScrollView嵌套ListView问题
  10. FTP、FTPS与SFTP定义与联系