首页 > 系统相关 >JVM4(运行时内存)

JVM4(运行时内存)

时间:2024-01-09 10:03:02浏览次数:32  
标签:ServicorTo MinorGC Eden 对象 JVM4 MajorGC 内存 运行

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。

(1)新生代

是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发 MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。

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

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

(1.3) ServivorTo 保留了一次 MinorGC 过程中的幸存者。 2.3.1.4. MinorGC 的过程(复制->清空->互换) MinorGC 采用复制算法。

1:eden、servicorFrom 复制到 ServicorTo,年龄+1

首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年 龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不 够位置了就放到老年区);

2:清空 eden、servicorFrom

然后,清空 Eden 和 ServicorFrom 中的对象;

3:ServicorTo 和 ServicorFrom 互换

最后,ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom 区。

(2)老年代

主要存放应用程序中生命周期长的内存对象。

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

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

(3)永久代

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

(3.1)JAVA8 与元数据

在 Java8 中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间 的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用 本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由 MaxPermSize 控制, 而由系统的实际可用空间来控制。

标签:ServicorTo,MinorGC,Eden,对象,JVM4,MajorGC,内存,运行
From: https://blog.51cto.com/u_16466456/9156811

相关文章

  • 【C语言高阶篇】结构体 —— 什么是内存对齐?
    (文章目录)前言  <fontcolor=green>......
  • 《PySpark大数据分析实战》-10.独立集群模式的代码运行
    ......
  • openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存
    openGauss学习笔记-189openGauss数据库运维-常见故障定位案例-TPCC-WAL-内存189.1TPCC运行时,注入磁盘满故障,TPCC卡住的问题189.1.1问题现象TPCC运行时,注入磁盘满故障,TPCC卡住,故障消除后,TPCC自动续跑。189.1.2原因分析数据库本身机制,在性能日志(gs_profile)所在磁盘满时,导致......
  • 软件测试/测试开发/全日制|Pytest如何灵活地运行用例
    前言Pytest能够满足我们对单元测试框架的许多要求,它简洁易用,同时提供了丰富的功能来进行测试用例的管理和执行。在本文中,我们将深入探讨如何使用Pytest运行多条测试用例、测试文件或测试包,并且指定运行特定的测试用例,并对执行结果进行分析。运行多条测试用例/文件/包Pytest具备......
  • wasmex webassenbly elixir 运行时
    wasmex是基于wasmtime以及rustnif开发的方便elixir运行webassembly的框架与rust的集成与rust集成使用的三方包 与mjml工具类似使用了rustler_precompiled以及rustlerrust使用的三方包 前边也说了是基于了wasmtime包装的,同时使用了wasmtimewasi一些子模块说明rustle......
  • 全何发布96GB大容量DDR5内存:8400MHz超高频率
    1月5日消息,台湾全何(V-Color)发布了全新的MantaXFinity系列DDR5内存,不但拥有最高96GB大容量,还有8400MHz最高频率。新内存提供2x16GB、2×24GB、2×32GB、2×48GB等不同容量套装,频率最高可选8400MHz。专门针对Intel平台优化,并支持XMP3.0,可以一键达成高频。散热马甲也重新设计,几何......
  • 内存溢出会导致模块测试正常,植入系统失败
    前些天,遇到了一个问题:需要在系统中添加一个小功能,单独测试,然后植入系统。代码使用了从网上下载的函数,模块单独运行,没有问题,但是放在系统中运行就会出问题。不得已的情况下,只能一行行代码排查,发现一个地方使用了malloc但是没有使用free。结果,发现malloc(rdata_len1);之后使用了......
  • Java 打maven包 可以使用java -jar 运行
    有时候我们想打一个jar包像springboot项目一样运行javajar来运行,但是直接使用maven引入相关的依赖直接打包无法使用。这时需要在pom.xml中添加一个plugin   <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-pl......
  • 【Vue】运行npm run dev出现98%vue-quill-editor 富文本编辑器错误解决
    感谢:SpiritualTuto1、下载Vue-Quill-Editornpminstallvue-quill-editor--save2、如果还不行,下载quill(Vue-Quill-Editor需要依赖)npminstallquill--save3、全局引入import'quill/dist/quill.core.css'import'quill/dist/quill.snow.css'import'q......
  • JVM3(内存区域)
    JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在HotspotVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存......