前言: 还是面试经常被q,小结一下

image.png

JVM中的堆一般分为三部分,新生代、老年代和永久代。

1 新生代

主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

新生代分为Eden区、ServivorFrom、ServivorTo三个区。

Eden区:Java新对象的出生地(如果新创建的对象占用内存很大则直接分配给老年代)。当Eden区内存不够的时候就会触发一次MinorGc,对新生代区进行一次垃圾回收。

ServivorTo:保留了一次MinorGc过程中的幸存者。

ServivorFrom: 上一次GC的幸存者,作为这一次GC的被扫描者。

当JVM无法为新建对象分配内存空间的时候(Eden区满的时候),JVM触发MinorGc。因此新生代空间占用越低,MinorGc越频繁。

MinorGC采用复制算法。

2 老年代

老年代的对象比较稳定,所以MajorGC不会频繁执行。

触发MinorGC的条件:

1 在进行MajorGC之前,一般都先进行了一次MinorGC,使得有新生代的对象进入老年代,当老年代空间不足时就会触发MajorGC。

2 当无法找到足够大的连续空间分配给新创建的较大对象时,也会触发MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法(或者标记—整理算法)

MajorGC的耗时比较长,因为要先整体扫描再回收,MajorGC会产生内存碎片。为了减少内存损耗,一般需要合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM。

永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息。

Class在被加载的时候元数据信息会放入永久区域,但是GC不会在主程序运行的时候清除永久代的信息。所以这也导致永久代的信息会随着类加载的增多而膨胀,最终导致OOM。

注意: 在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下元空间的大小仅仅受本地内存的大小限制。类的元数据放入 native memory, 字符串池和类的静态变量放入java堆中。 这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

MajorGC和FullGC的区别(这里参考1建议不要纠结这两个概念的区别,而是应该专注于解决问题)

Full GC 是清理整个堆空间—包括年轻代和老年代。

Major GC 是清理老年代。

MinorGC 触发机制

1 Eden区满的时候,JVM会触发MinorGC。

MajorGC 触发机制

1 在进行MajorGC之前,一般都先进行了一次MinorGC,使得有新生代的对象进入老年代,当老年代空间不足时就会触发MajorGC。

2 当无法找到足够大的连续空间分配给新创建的较大对象时(如大数组),也会触发MajorGC进行垃圾回收腾出空间。

Full GC触发机制:

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

2 老年代空间不足

3 方法区空间不足

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

5 由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,

4 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载。

虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1 岁,  当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold (阈值)来设置。

java 永久代_Java新生代、老生代和永久代详解相关推荐

  1. java htmlparser 代理_Java解析HTML之HTMLParser使用与详解

    转自:http://free0007.iteye.com/blog/1131163 HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要 ...

  2. java matcher遍历_java正则表达式之Pattern与Matcher类详解

    Pattern.split方法详解 /** * 测试Pattern.split方法 */ @Test public void testPatternSplit() { String str = &qu ...

  3. java 字节缓冲_Java字节缓冲流原理与用法详解

    本文实例讲述了Java字节缓冲流原理与用法.分享给大家供大家参考,具体如下: 一 介绍 BufferInputStresm和BufferOutputStream 这两个流类为IO提供了带缓冲区的操作, ...

  4. java u盘_Java检测Windows的U盘插入详解

    package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...

  5. java赛马游戏_Java小程序赛马游戏实现过程详解

    这是当时做的一个小游戏,大概就是程序开始后,会进入用户登录界面,用户输入自己的姓名和密码后,选择登录会进入到赛马比赛的界面,这时可以看见赛马场和马匹的编号,用户可以选择任何一个编号的马进行投注,输入有 ...

  6. java类索引_java中索引的分类,图片详解

    java的学习是一个漫长而又循环往复不断上升的过程,今天我们再来看一下java索引的分类,并且通过详细的图片解析. 首先,java中的索引主要分为聚簇索引和非聚簇索引. 其中InnoDB主键使用的是聚 ...

  7. java对象数组_Java中对象数组的使用方法详解

    本文实例讲述了Java中对象数组的使用方法.分享给大家供大家参考,具体如下: 一 点睛 对象可以用数组来存放,通过下面两个步骤来实现. 1 声明以类为数据类型的数组变量,并用new分配内存空间给数组. ...

  8. java并发类_Java并发编程之常用的辅助类详解

    1.CountDownLatch 1.2.示例:班长锁门问题 问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门.班长必须要等所有人都走光了,班长才能关灯锁门.这6个同学的顺序是无序的 ...

  9. java 位与运算_java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 正数直接取二进 ...

  10. 华硕灵耀S 2代笔记本u盘装win10系统图文详解

    华硕灵耀S 2代是2018年上市的一款15.6英寸超薄笔记本电脑,这款笔记本性能出众.设计新奇,采用了intel第八代酷睿i7处理器以及性能级独立显卡,满足用户们日常娱乐使用需求;同时,它拥有鲜艳色系 ...

最新文章

  1. activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示
  2. 用python绘制漂亮的图形-python如何画出漂亮的地图?
  3. SQL Server 装载 msxmlsql.dll 失败的解决办法
  4. 20135231 —— 第六周任务总结报告
  5. [css] 使用css画出一个五角星
  6. 2021高考理综单科成绩查询,2021全国各省市高考总分及各科分数 分值是多少
  7. 【月报】Java知音的二月汇总
  8. python3----练习题(弹幕跟随)
  9. 文本框获取焦点时,去掉边框
  10. 学python能做什么类型的工作-学Python要先学什么?Python入门方法
  11. c++ hashset的用法_C++ set crbegin() 使用方法及示例
  12. SecureCRT鼠标双击或拖成变成Ctrl+C的解决办法
  13. 使用 Iperf 测试软路由性能
  14. MATLAB环境下基于深度学习的语音降噪方法
  15. 怎样在电脑上上传图片_怎样上传图片或照片
  16. 出国常用必备英语口语
  17. NoSQL Scylla Open Source 3.0食量比Cassandra大
  18. [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
  19. 吉里吉里1/吉里吉里2中KAG脚本的解释执行(1)
  20. 探悉 Excel 中不为人所知的技巧

热门文章

  1. Fashion-MNIST数据集离线加载办法
  2. 抽象类-(抽象类的样子)
  3. 【C++深度剖析教程19】前置操作符与后置操作符
  4. 【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序
  5. 线程安全-常用的模式
  6. 小程序·云开发的HTTP API调用丨实战
  7. easyUI学习笔记二
  8. Linux下git使用
  9. 嵌入式linux的学习笔记-共享内存(六)
  10. Dijkstrala算法