java 永久代_Java新生代、老生代和永久代详解
前言: 还是面试经常被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新生代、老生代和永久代详解相关推荐
- java htmlparser 代理_Java解析HTML之HTMLParser使用与详解
转自:http://free0007.iteye.com/blog/1131163 HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要 ...
- java matcher遍历_java正则表达式之Pattern与Matcher类详解
Pattern.split方法详解 /** * 测试Pattern.split方法 */ @Test public void testPatternSplit() { String str = &qu ...
- java 字节缓冲_Java字节缓冲流原理与用法详解
本文实例讲述了Java字节缓冲流原理与用法.分享给大家供大家参考,具体如下: 一 介绍 BufferInputStresm和BufferOutputStream 这两个流类为IO提供了带缓冲区的操作, ...
- java u盘_Java检测Windows的U盘插入详解
package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...
- java赛马游戏_Java小程序赛马游戏实现过程详解
这是当时做的一个小游戏,大概就是程序开始后,会进入用户登录界面,用户输入自己的姓名和密码后,选择登录会进入到赛马比赛的界面,这时可以看见赛马场和马匹的编号,用户可以选择任何一个编号的马进行投注,输入有 ...
- java类索引_java中索引的分类,图片详解
java的学习是一个漫长而又循环往复不断上升的过程,今天我们再来看一下java索引的分类,并且通过详细的图片解析. 首先,java中的索引主要分为聚簇索引和非聚簇索引. 其中InnoDB主键使用的是聚 ...
- java对象数组_Java中对象数组的使用方法详解
本文实例讲述了Java中对象数组的使用方法.分享给大家供大家参考,具体如下: 一 点睛 对象可以用数组来存放,通过下面两个步骤来实现. 1 声明以类为数据类型的数组变量,并用new分配内存空间给数组. ...
- java并发类_Java并发编程之常用的辅助类详解
1.CountDownLatch 1.2.示例:班长锁门问题 问题描述:假如有7个同学晚上上自习,钥匙在班长手上,并且要负责锁门.班长必须要等所有人都走光了,班长才能关灯锁门.这6个同学的顺序是无序的 ...
- java 位与运算_java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 正数直接取二进 ...
- 华硕灵耀S 2代笔记本u盘装win10系统图文详解
华硕灵耀S 2代是2018年上市的一款15.6英寸超薄笔记本电脑,这款笔记本性能出众.设计新奇,采用了intel第八代酷睿i7处理器以及性能级独立显卡,满足用户们日常娱乐使用需求;同时,它拥有鲜艳色系 ...
最新文章
- activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示
- 用python绘制漂亮的图形-python如何画出漂亮的地图?
- SQL Server 装载 msxmlsql.dll 失败的解决办法
- 20135231 —— 第六周任务总结报告
- [css] 使用css画出一个五角星
- 2021高考理综单科成绩查询,2021全国各省市高考总分及各科分数 分值是多少
- 【月报】Java知音的二月汇总
- python3----练习题(弹幕跟随)
- 文本框获取焦点时,去掉边框
- 学python能做什么类型的工作-学Python要先学什么?Python入门方法
- c++ hashset的用法_C++ set crbegin() 使用方法及示例
- SecureCRT鼠标双击或拖成变成Ctrl+C的解决办法
- 使用 Iperf 测试软路由性能
- MATLAB环境下基于深度学习的语音降噪方法
- 怎样在电脑上上传图片_怎样上传图片或照片
- 出国常用必备英语口语
- NoSQL Scylla Open Source 3.0食量比Cassandra大
- [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
- 吉里吉里1/吉里吉里2中KAG脚本的解释执行(1)
- 探悉 Excel 中不为人所知的技巧