Heap分区和分代概念

俗说 GC 之 Heap 区内存模型的演进 1 篇首 最近看到 GC 这个异常古老的话题又被抛了出来,OpenJDK11 中出现了大道至简、返璞归真的 Epsilon GC 垃圾回收器,ZGC,Shenandoah GC 作为在 G1 的基础之上的两个分别合入了 OpenJDK11 和 OpenJDK12 的项目,两个项目的代号分别为分别为 JEP333、JEP189,这两款目前正在发展中的垃圾回收器成为了与 CMS、G1 两款早期并发回收器进行性能对比的主角。然后我就突然找到了一个主题,那就是比较两款垃圾回收器的性能就是在比较什么?要比较的究竟是哪 阅读详情

Heap分区的目的
1. 为了分代:不同代的对象放到不同的内存分区中,实现“代提升”,也方便实现对不同分代采用不同的垃圾收集算法。
2. 垃圾收集算法需要:新生代GC使用到复制算法,该算法需要将对应的分区划分成三个分区:Eden/S0/S1。

术语
Generation代
- YongGeneration/NewGeneration:新生代,在Eden/S0/S1的存活的对象。
- OldGeneration:老年代,在Tenured区存活的对象。
- PermanentGeneration:永久代。
Space 区
- Eden:伊甸园区,是新生代的一个区。
- Survivor:幸存区,属于新生代,为了复制算法的需要。一般分成大小相等的两个区(S0/S1或者From/To)。
- Tenured:存放老年代的区域。
- Permanent:终身区。

下图:Hotspot 的 Heap 分区

下图:VisualVM 中通过 VisualGC插件显示的分区

Eden/S0/S1 新生代
[Eden ][S0 ][S1 ]
S0/S1是大小相当的两个区域,共同组成Survivor区。
空间比例:Eden:S0==8:1。设定方法:-XX:SurvivorRatio=8。
新生对象在Eden/S0或者Eden/S1中分配,Eden区的对象量达到一个阈值后,发生一次新生代GC。

Old 老年代
每个对象有“对象年龄计数器”。对象由Eden收集到Survivor区后,年龄+1。进行新生代GC后,年龄+1。依次,当年龄>=15后进入老年代。
最大年龄阈值设定:-XX:MaxTenuringThreshold。
动态年龄:如果在Survivor中所有相同年龄对象占用了空间的一半多,大于等于上述年龄的对象直接进入老年代。
大对象(比如大的数组)直接进入老年代。阈值设定:-XX:PretenureSizeThreshold。

Perm 永久代(PermanentGeneration)
用于存放不变对象,如类、方法、字符串等。
Java7把驻留字符串(intentd string)放到了老年代区。Java8中移除了Hotspot的永久代区。

http://www.cnblogs.com/caca/p/jvm_gc_algorithm_heap_space.html

服务器安装Ubuntu 18.04.2 LTS超详细步骤(小白图文详解) 服务器安装Ubuntu 18.04.2 LTS超详细步骤(小白图文详解) 本文不包括启动盘制作步骤,相关内容可自行百度 华为服务器 1 插入u盘,关机重启 2 初始化界面后进入到系统的BIOS设置界面 (华为服务器按Del键,不同品牌方法不同) 3 进入的时候,华为的服务器默认设置了BIOS密码,因此需要输入之前预设的密码。 注意密码大小写问题,若密码输错三次,则需重启 4 密码输入以后,进入... 阅读详情

相关推荐

BQ4050开发进阶(二):Protections参数优化策略与实战解析

本文深入解析了BQ4050电池管理芯片中Protections参数的优化策略与实战方法。针对电压、电流、温度等核心保护功能,详细阐述了如何根据具体电芯特性、负载场景和环境因素,精细调整CUV、COV、OCC/OCD等阈值与延时,以在确保电池绝对安全的前提下,实现极致的用户体验与系统可靠性。

rgv234567的博客 479

JVM(二) Heap体系、堆内存分析

Heap 堆:一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存逻辑上分为三部分:新生区Young/New养老区Old/Tenure永久区Perm新生代(年轻代)、老年代永久代(持久代)。永久区(非堆)就是方法区为什么需要把Java堆分代?不分代就不能正常工作了吗其实不分代完全可以,分代的唯一理由就是优化GC性能。经研究,不同对象的生命周期不同。

m0_56799642的博客 1263

UG/NX二次开发实例流程样例(nx1980+vs2019)

以上就是基本操作了,下面进入界面开发流程,nx1980的界面开发操作,也需要在块UI界面编辑器中操作,很多教程都没有讲解这一点,尤其是如何进入块UI界面编辑器,那么我在这里详细说明一下步骤。》,这一篇文章我们将详细讲述,如何开发一个具体的功能——根据用户输入的数据,在特定的点上创建一个指定大小的立方体。可以将文件保存当桌面,笔者保存在桌面的create_block目录中了,如下图所示,可以发现生成了三个文件。4.在新建模型完成后,我们准备创建交互UI,按照下图所示的顺序,找到块UI界面编辑器,。

秋月的私语 1万+

java堆结构,以及堆中的永久代

转自:java堆的结构以及堆中的永久代 java堆不是数据接口意义上的堆(一种有序的树),而是jvm的堆,也即是运行时的数据区。所有类的实例和数组都是在堆上分配内存,它在JVM启动时被创建,对象所占的内存是由自动内存管理系统也就是垃圾回收器回收。 堆内存是由存活的对象以及死亡的对象组成的。存活的对象不会被垃圾回收器回收;死亡的对象是还没有被垃圾回收器回收的对象,等下一个周期回收 永久代:永久

子衿_青青的博客 5472

ESP32搭配FT6236触摸屏:从芯片手册到完整I2C驱动代码的保姆级解析

本文详细解析了ESP32搭配FT6236触摸屏的I2C驱动开发过程,从芯片手册解读到完整代码实现。通过硬件架构分析、寄存器配置、I2C通信封装及触摸数据处理等步骤,提供了一套完整的驱动解决方案,帮助开发者快速掌握ESP32与触摸屏的交互技术。

weixin_29174385的博客 291

【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python package

如何安装请详见上文 【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python接口_子韵如初的博客-优快云博客w不需要安装啥x11 、 xming直接mobxterm可以搞定点击右上角的X server打开可视化服务器然后 apt install x11-apps -yxclock 搞定从mobxterm可以看到display的端口X11显示可视化的原理是就是通过X协议,类似于http对linux于w

weixin_43953700的博客 3万+

内存的五大分区

是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

weixin_61196797的博客 1万+

基于STM32F4XX 、HAL库的GXHT30C温湿度传感器驱动应用C语言程序设计

define GXHT30C_STATUS_WRITE_CHK (1 << 0) // 写数据校验状态。#define GXHT30C_STATUS_HUMI_TRACK (1 << 11) // 湿度跟踪报警。#define GXHT30C_STATUS_TEMP_TRACK (1 << 10) // 温度跟踪报警。#define GXHT30C_STATUS_CMD_STATUS (1 << 1) // 命令执行状态。

PP_Cottage的博客 226

C++ 内存分区模型中堆区(heap)与栈区(stack)的区别

C++ 内存分区模型中堆区(heap)与栈区(stack)的区别

weixin_44391223的博客 428

基于STM32设计的盲人智能导盲杖

本设计基于STM32单片机,开发了一种面向视障人群的智能导盲杖系统。系统以STM32F103C8T6为核心控制器,集成了超声波测距、语音提示、环境光检测、GPS定位及4G通信等多种功能模块。

640

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

堆区(Heap)详细介绍

1. 核心概念 1.1 堆区的特点 在《Java虚拟机规范》中指出,堆可以是物理上不连续的内存空间,但是在存储逻辑上是连续的。还规定所有的对象实例以及数组都应当在运行时分配在堆上。这就说明了数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。 一个JVM实例只存在一个堆空间,并且所有的线程共享堆内存。 但是可以在堆内存划分线程私有的缓冲区(TLAB),下文会介绍 堆区的大小是可以调节的,但是Java堆区在JVM启动时就被创建,其大小也就确定了。并且是J.

qq_43684005的博客 5426

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

XiaoqiangClub的博客 4003

JVM中的垃圾收集算法和Heap分区简记

如何判断垃圾对象? 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。 引用计数(ReferenceCounting)算法 这种方法比较简单直观,FlashPlayer/Python使用该算法,简单高效。核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。但是,Java/C#并不采用该算法,因为该算法没...

weixin_34384681的博客 80

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java学习---JVM中的垃圾收集算法和Heap分区简记

如何判断垃圾对象? 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。   引用计数(ReferenceCounting)算法 这种方法比较简单直观,FlashPlayer/Python使用该算法,简单高效。核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。但是,Java/C#并不采用该算

wust小吴 569

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

gc技术记忆

如何判断垃圾对象? 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。 引用计数(ReferenceCounting)算法 这种方法比较简单直观,FlashPlayer/Python使用该算法,简单高效。核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。但是,Java/C#并不采用该算法,因为该算法

qq_34936628的博客 446

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入解析Mono堆结构与分代机制

《Mono堆结构与分代》技术解析与实践指南(150字摘要) 本文系统剖析Mono运行时内存管理机制,重点解读分代堆结构设计原理。通过"新生代-老年代-大对象堆"三级架构,结合对象生命周期特性实现高效垃圾回收。分析表明:90%的新建对象在Generation 0即被回收,仅10%会晋升至老年代,这种分代策略使GC效率提升5-10倍。文章深入SGen GC源码实现,结合Unity项目案例,揭示分代GC引发的卡顿、泄漏等典型问题,并提供对象池优化、Heap分析工具使用等实战方案。最后探讨.NE

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 990

JVM垃圾回收之分代算法

分代回收算法其实是这样的,根据对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或者标记压缩算法。 这种算法的主要思想就是将内存 划分为不同的几块 然后根据各个年到的特点采用最适当的收集算法。在新生代 每次垃圾回收时 都有大批量的对象死去,只有少量存活那就采用–复制算法。而老年代因为存活率较高 采用标记清除 或者标记整理算法来分配空间。 分代收集算法,并不是...

yanghenan19870513的专栏 1160

JVM 对象分代、垃圾回收机制

JVM中对象分代:年轻代、老年代、持久代,垃圾回收算法,垃圾回收过程整理。

cyc头发还挺多的博客 1537

G1收集器的革新:为什么放弃传统分代设计是JVM进化的必然选择

内存管理需要与时俱进 🚀软硬件协同设计是关键 💻取舍平衡是永恒主题 ⚖️思考题:你的应用更适合G1还是ZGC?分享你的场景分析!💬#Java #JVM #G1GC #垃圾回收 #性能优化 #内存管理。

全栈开发工程师 713

低延迟GC实战秘籍,全面解析ZGC分代模式下的内存优化技巧

掌握低延迟GC优化秘诀,深入解析ZGC分代模式下的内存管理优化策略。适用于高并发、大堆场景,通过并发标记与压缩技术显著降低停顿时间,提升系统响应速度。实战经验总结,值得收藏。

CodeVibe的博客 953

JVM堆内存空间(heap)

Java堆空间是JVM运行时内存区域中占比最大的一块,此内存区域唯一的目的就是存储运行时创建出的对象实例。同时,随着运行时采用的GC器不同,Java堆也会被分为不同的结构,其中主要可分为分代和不分代的两类结构。相对来说,分代结构是最适合Java对象“朝生夕死”的特性的,如果堆结构是分代的,可以使得JVM能够更好的管理堆内存中的对象,包括内存的分配以及回收。有兴趣的同学可以加群。

weixin_43776652的博客 2200

java虚拟机分区_三类常见的Java虚拟机垃圾回收机制的比较(HotSpot,JRockit,J9 JVM)...

一、HotSpotJVM1)HotSpotJVM使用内存分区(如永久perm区和分代Generation Heap区),分代区(Generation Heap区)又包括新生Yong区和老生Old/Tenured区,Yong区中又分为Eden区和 Survior区(2块);2)Yong区 GC:对象先在Yong区的Eden中得到分配,任何时候Eden区满了就会触发Yong区GC (Minor GC?...

weixin_39897392的博客 317
上一篇: JVM垃圾收集GC
下一篇: JVM内存回收策略
jamespengo
博客等级 码龄16年 83粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值