JVM是Java Virtual Machine(Java虚拟机),是一种用于计算设备的规范,一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

每个Java程序都离不开Java虚拟机,Java程序的运行依靠具体的Java虚拟机实例

Java它没有寄存器,所以指令集是使用Java栈来存储中间数据,这样做的目的就是为了保持Java虚拟机的指令集尽量的紧凑,同时也便于JAVA虚拟机在那些只有很少通用寄存器的平台上实现

虚拟机的垃圾回收机制是完善的

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 (阈值)来设置。

参考:
1 原文: Minor GC vs Major GC vs Full GC
2 Java中的新生代、老年代、永久代和各种GC

作者:Aaron_Swartz
链接:https://www.jianshu.com/p/d3a0b4e36c28
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java基础之jvm,堆的分类新生代、老生代和永久代详解相关推荐

  1. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第6章 集合

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.Comparator 2.hashNext().next() 3.键.值 4.ArrayList ...

  2. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第5章 Java中的常用类

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1. String.StringBuffer 2. Date.Calendar.DateFormat ...

  3. Java基础学习总结(125)——org.apache.commons.lang3.StringUtils类方法详解

    org.apache.commons.lang3.StringUtils中方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的 ...

  4. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第3章 面向对象(上)

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.封装.继承.多态 2.this 3.private.default.protected.publ ...

  5. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第10章 多线程

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.Thread.Runnable.Callable 2.synchronized.this 3.N ...

  6. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第7章 I/O流

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1. 字节流.字符流 2. Channel.Buffer 3. InputStreamReader. ...

  7. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第4章 面向对象(下)

    文章目录 一.填空题 二.判断题 三.选择题 四.简答题 五.编程题 六.原题及其解析 一.填空题 1.方法,抽象类2.子类.父类.基类3.final4.Object5.参数列表."-> ...

  8. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    JAVA基础-栈与堆,static.final修饰符.内部类和Java内存分配 发布时间: 2013/01/12 22:29 QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 ...

  9. java年轻代minor gc_jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化...

    关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...

  10. 从Java程序员进阶到架构师,6大核心技能要领详解

    " java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...

最新文章

  1. 1010 [HNOI2008]玩具装箱toy
  2. python super 变参数问题(六)
  3. Dubbo的使用及原理浅析
  4. 系统安装重装与优化:chapter7 操作系统的修复与重装
  5. 不用数组 java输出杨辉三角_不用数组实现杨辉三角(巴斯卡三角形)
  6. java面板中添加面板_如何把窗体加入面板中 java
  7. EasyUI中dialog中嵌入form细节问题记录
  8. 如何动态修改select的值_SQL成长记录02-SELECT语句
  9. TextView输入文字改变输入框大小
  10. MATLAB 绕轴旋转图像函数 rotate 详解
  11. win7的centos虚拟机上搭建mysql5.6服务
  12. 面试官:问点基础,说说Object类下面有几种方法呢?
  13. 工具-WPT(Windows Performances Tool Kit) References
  14. 浅谈如何删除JSP编译后的空行
  15. Altium差分布线和等长方法
  16. knockout的监控数组实现 - 司徒正美
  17. 普普通通的算法期末考试试卷
  18. 3DMAX入门教程,这样还担心学不会?
  19. ElasticSearch入门
  20. 程序设计 | python | Hello World的条件输出

热门文章

  1. Windows下用某品牌随身WiFi搭建一个钓鱼热点
  2. 一个酒鬼有20美元,三美元可以买一瓶酒,三个空瓶子可以换一瓶酒
  3. 关注点云 专栏及博主
  4. sql-子查询当作字段返回提示至过多
  5. 【JNU】网络配置大题详解(E口与G口两种类型)
  6. python读取grd数据_Matlab 读取.grd文件
  7. 中职生职业生涯规划书2000字学计算机,计算机专业中职生职业生涯规划书
  8. 【卷指南】科研工作团队协作避坑指南
  9. 在浏览器中直接访问linux服务器中的文件(以图片为例)
  10. kibana去重统计和分组统计