java 永久代_Java新生代、老生代和永久代详解

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

d3a0b4e36c28

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java算法:冒泡排序

java算法:冒泡排序 冒泡排序:不断遍历文件,交换倒序的相邻元素,直到文件排好顺序。冒泡排序的主要优点是容易实现,冒泡排序通常会比选择排序、插入排序慢。 如,对EXAMPLE 字母进行排序: E X…

python3发布时间_Python3优雅操作-时间处理与定时任务

无论哪种编程语言,时间肯定都是非常重要的部分,今天来看一下python如何来处理时间和python定时任务 注意:本篇所讲是python3版本的实现,在python2版本中的实现略有不同 1.计算明天和昨天的日期 #! /usr/bin/env python #codingutf…

Cubieboard安装Debian在Nand中

本教程所附带系统为Server版,不带显示,所以插显示器是不会有任何画面出现的。另外所提供系统为 http://linux-sunxi.org 所推荐(linux-sunxi.org的权威毋庸置疑),非CB官方提供,但CB官方并未提供相关CB所用Server版,而且…

strlwr,strupr函数

函数原型&#xff1a;extern char *strlwr(char *str) extern char *strupr(char *s) 参数说明&#xff1a;str为要转换的字符串。 所在库名&#xff1a;#include <string.h> 函数功能&#xff1a;将字符串str中的大(小)写字母转换成为小(大)写字母&#xff…

为Cubieboard打造完美Debian系统

作为Cubieboard的用户&#xff0c;最头疼的问题就是没有一个比较好的系统&#xff0c;本文将帮你解决这个问题。 首先需要感谢网站http://guillaumeplayground.net/的作者制作了这个系统。不过由于是定制给mele的&#xff0c;所以在Cubieboard上运行需要做一些优化调整。 系统…

python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)

原标题 Understanding Python Dataclasses?—?Part 2 &#xff0c;作者为 Shikhar Chauhan 。这是 Python 最新的 Dataclasses 系列的第二部分内容。在第一部分里&#xff0c;我介绍了 dataclasses 的一般用法。这篇主要介绍另一个特征&#xff1a;dataclasses.field。我们已…

java 图形处理库_java中处理图片的类库

拷贝一下代码&#xff0c;以后备用&#xff1a;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servle…

Hibernate @OneToMany等注解设置查询过滤条件等

如实体PdOrg对象中有users对象&#xff0c;数据库user表有字段DEL_FLAG(0&#xff1a;删除&#xff1b;1&#xff1a;未删除)&#xff1a; private List<User> users new ArrayList<User>(); 生成get、set方法&#xff1a; OneToMany(fetchFetchType.LAZY, mappedB…

西部数码域名解析到阿里云_西部数码云主机好吗 稳定性如何

随着云计算技术的不断发展&#xff0c;我国云计算市场的经济效益也在日渐扩大&#xff0c;各个云服务商之间的竞争异常激烈。在这种环境下&#xff0c;备受人们关注的云服务企业主要呈现两大类&#xff0c;一是互联网巨头背景的阿里云、腾讯云等&#xff1b;二是以西部数码为代…

ffmpeg yasm not found, use --disable-yasm for a crippled build

yasm是汇编编译器&#xff0c;因为ffmpeg中为了提高效率用到了汇编指令&#xff0c;比如MMX和SSE。解决这个问题方面有两个&#xff1a;1、在网上下载一个yasm.exe并安装在mingw/bin下面&#xff0c;编译代码时你注意看&#xff0c;会发现asm后缀的文件用的编译器是yasm&#x…

java native 接口_Java本地接口--Java Native Interface (JNI)

一、方法介绍java native方法是指本地方法&#xff0c;当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件时要声明为native方法。java中&#xff0c;通过JNI(Java Native Interface,java本地接口)来实现本地化。Native方法一般用于两种情况&a…

【转】android程序连接网络出现android.os.NetworkOnMainThreadExceptionat

错误&#xff1a; android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) ...... 原因&#xff1a;是涉及到url操作的时候&#xff0c;访问网络不能在主程序中运行 解决&#xff1a;参考【http://geeksu…

mysql8.0.22安装步骤图解_MySQL server 5.5的安装 步骤图解

作者&#xff1a;极客小俊 一个专注于web技术的80后我不用拼过聪明人&#xff0c;我只需要拼过那些懒人 我就一定会超越大部分人!知乎极客小俊&#xff0c;官方首发原创文章还有人用老版本的mysql 5.5吗&#xff1f;&#xff1f; 如果有的话 并且不会安装的小白看下面的步骤图吧…

win7下ffmpeg编译动态链接库整理

1.写在ffmpeg编译前 关于ffmpeg的编译过程google一搜&#xff0c;一大堆&#xff0c;ffmpeg编译真的有那么难么&#xff1f;在我编译成功后回头来看&#xff0c;网上的资料过多&#xff0c;反而使自己走了很多的弯路。即便有些楼主亲自测试后编译成功了&#xff0c;由于受机器…

inputstream java_Java实现inputstream流的复制

获取到一个inputstream后&#xff0c;可能要多次利用它进行read的操作。由于流读过一次就不能再读了&#xff0c;而InputStream对象本身不能复制&#xff0c;而且它也没有实现Cloneable接口&#xff0c;所以得想点办法。实现思路&#xff1a;1、先把InputStream转化成ByteArray…

wzctool工具使用详解

Wzctool是WinCE一个比较小巧实用的无线Wifi配置小工具&#xff0c;借助命令行调用该程序能够非常简单地设置wifi的相应参数&#xff0c;能够在一定程度上避免书写代码的繁琐之举。 这个工具是在编译系统的时候&#xff0c;添加Wifi组件后自动生成的。如果用户直接进到Platform…

spring boot 入门_玩转springboot2.x之快速入门开山篇

Spring Boot简介Spring Boot的目的在于创建和启动新的基于Spring框架的项目。Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合。大部分Spring Boot应用只需要非常少的配置就可以快速运行起来。Spring Boot是伴随着Spring4.0诞生的&#xff0c;旨在简化开发。Spri…

详细介绍Qt,ffmpeg 和SDl 教程之间的联系

Qt与 ffmpeg 与 SDl 教程是本文要介绍的内容&#xff0c;从多个角度介绍本文&#xff0c;运用了qmake&#xff0c;先来看内容。1. 注释 从“ #” 开始&#xff0c;到这一行结束。2. 指定源文件 1. SOURCES *.cpp 对于多源文件&#xff0c;可用空格分开&#xff…

如何生成JAR包

JDK中自带了jar命令&#xff0c;可以生成jar包&#xff0c;在命令行输入jar可以看到用法。 E:\20121008>jar用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...选项包括&#xff1a; -c 创建新的归档文件 -t 列出归档目录 …

java 匿名内部类 百科_java匿名内部类具体概念是什么,在什么地方用到?

展开全部java匿名内部类一定是在new的后面&#xff0c;用其隐含实现一个接口或实现一个类&#xff0c;没有类名&#xff0c;根据多态&#xff0c;我们e69da5e887aa62616964757a686964616f31333337613863使用其父类名。因他是局部内部类&#xff0c;那么局部内部类的所有限制都对…