JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

2023-11-02

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。

HotSpot虚拟机GC算法采用分代收集算法:

1、一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。

2、并不是进入Survivor Space(幸存者区)后就保证人身是安全的,但至少可以活段时间。GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。

3、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。

分区的目的:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不同情况使用不同算法。

非heap区域中Perm Gen中放着类、方法的定义,jvm Stack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。

以上转自:http://lhc1986.iteye.com/blog/1421832

以下转自:http://www.cnblogs.com/xhr8334/archive/2011/12/01/2270994.html




 

GC工作机制

SUN的jvm内存池被划分为以下几个部分:

Eden Space (heap)

内存最初从这个线程池分配给大部分对象。

 

Survivor Space (heap)

用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。

 

Tenured Generation (heap)

用于保持已经在survivor space内存池中存在了一段时间的对象。

 

Permanent Generation (non-heap)

保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。

 

Code Cache (non-heap)

HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。

 

简单来讲,jvm的内存回收过程是这样的:

对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。

若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行Full GC,此时jvm gc停止所有在堆中运行的线程并执行清除动作。

本文转载自:http://blog.csdn.net/aoxida/article/details/45061571

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释 的相关文章

  • 如何判断我是在 64 位 JVM 还是 32 位 JVM 中运行(在程序内)?

    如何判断应用程序运行的 JVM 是 32 位还是 64 位 具体来说 我可以使用哪些函数或属性来在程序中检测到这一点 对于某些版本的 Java 您可以使用标志从命令行检查 JVM 的位数 d32 and d64 java help d32
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • Java中的整数缓存[重复]

    这个问题在这里已经有答案了 可能的重复 奇怪的Java拳击 https stackoverflow com questions 3130311 weird java boxing 最近我看到一个演示 其中有以下 Java 代码示例 Inte
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • Android java.exe 以非零退出值 1 结束 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试过查看类似的解决方案 但没有解决方案有效 我以前运行应用程序没有问题 但我的新应用程序突然开始给我带来问题 当我尝试运行它时总是
  • 使用 Coldfusion 11 的 CFdirectory,文件名中存在非 ASCII 字符问题

    我有一个类似的问题 ColdFusion CFDirectory 和法语 https stackoverflow com questions 1715632 coldfusion cfdirectory and the french从而没有
  • Kotlin 支持 Java 11 吗?

    我尝试使用 Kotlin V1 2 70 Gradle V4 10 1 和 Java 11 使用 gradle 编译项目时 出现错误 未知 JVM 目标版本 11 支持的版本 1 6 1 8 Kotlin 编译器是否支持 Java 11 生
  • Java 加载类时如何管理内存?

    想象一下 我有一个包含 10 个方法的类 我需要从该类中实例化 10 个对象 问题是 JVM 会在对象创建时为 10 个实例分配 10 个不同的内存空间 我的意思是在我调用构造函数时 即 new MyClass 吗 或者它会在内存中加载一次
  • 使用同一类的不同版本进行类加载:java.lang.LinkageError:尝试重复名称的类定义

    我有一个工作代码 可以动态加载具有不同类名的不同类实现 类文件被加载到内存数据库 Apache 德比数据库 类加载器检索 class文件来自BLOB列 我想做的是插入 class文件为带有版本列的二进制 BLOB 和IS ENABLED标志
  • java内存不足然后退出

    我有一个必须分析大文件的软件 限制输入或提供无限内存都不是一个选择 所以我必须忍受飞行的 OOME 因为 OOME 只杀死线程 所以我的软件运行在一些糟糕的状态 从外面看一切都很好 因为进程正在运行 但在内部却是脑死亡 我想拔掉它的插头 但
  • 从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

    我有一个桌面应用程序 当有人按下按钮时 我希望它启动另一个执行类的 main 方法的 JVM 我的桌面应用程序已经依赖于包含具有我想要执行的 main 方法的类的 jar 目前我有以下代码 但是 我希望它们是一种更优雅的方法 Runtime
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 附加到已经运行的 JVM

    有没有办法附加到已经运行的 JVM 例如 在 JNI 中您可以使用JNI CreateJavaVM创建一个虚拟机并运行一个 jar 并检查它的所有类 但是 如果 jar 已经在运行 我找不到附加到其 JVM 并与其类通信或获取其的方法env
  • Clojure 为什么命名为 Clojure

    为什么该语言的名称是 Clojure 我用谷歌搜索了一下 在 clojure 中询问 到目前为止 还没有运气 Rich Hickey 他是 Clojure 的设计者 对此的评论是 wiki 上的第一个参考链接 您是否根据以 closure
  • Java:输入/使用“try-catch”块的开销?

    这个问题说明了一切 尽管命中率不是很高 我测得速度慢了 1 5 倍到 2 倍 但使用 try catch 的字节码和不使用 try catch 的字节码之间没有区别 那么是什么让它通常变慢呢 PL 请注意 问题不是抛出异常的开销 而是进入

随机推荐

  • vue项目关闭提交代码时的代码校验(整理)

    赋链接一份 其他博主文章 记录 vue项目关闭提交代码时的代码校验 vue vue项目一般会有一个提交代码时的校验 一般提交需要git commit m no verify 才能跳过校验 不想每次提交都输入 no verify可以进行如下配
  • C++operator()(重载小括号运算符)

    在C 语言中有时候需要重载运算符 今天我们主要介绍它主要应用的场合 仿函数 先考虑一个简单的例子 假设有一个vector 你的任务是统计长度小于5的string的个数 如果使用count if函数的话 你的代码可能长成这样 bool Len
  • CESM2 实验笔记

    文章目录 一 关于重启 运行方式 重启文件 初始文件 1 重新启动 RESTART 1 1 关于重启文件 2 RUN TYPE 初始化运行方式 startup branch hybrid 3 branch 或者 hybrid运行的示例 4
  • SQL注入漏洞(绕过篇)

    在学习完了SQL注入的原理 SQL注入的类型后那么可以说SQL注入已经大致了解了 但事实是现实中开发人员不可能让你这么简单就攻击到数据库 他们一般会对已输入或可输入的数据做一定限制 这篇文章我主要对SQL注入中代码或者waf过滤的绕过做一次
  • 网络安全设备之防火墙技术详解

    一 防火墙概述 1 网络防火墙简介 无论是大中型企业网络 还是小型家庭办公网络 对网络安全方面的要求一直保持上升趋势 微软公司的官方网站尚且难逃黑客的魔爪 普通的中小网络更是难以抵抗了 解决网络安全问题最常用的防护手段就是安装网络防火墙 对
  • 2023最新CISP模拟考试题库及答案(一)

    1 在橙皮书的概念中 信任是存在于以下哪一项中的 A 操作系统 B 网络 C 数据库 D 应用程序系统 答案 A 备注 标准和法规 TCSEC 2 下述攻击手段中不属于DOS攻击的是 A Smurf攻击 B Land攻击 C Teardro
  • 593. Valid Square

    Given the coordinates of four points in 2D space return whether the four points could construct a square The coordinate
  • 【DL】第 4 章 : 什么是神经网络:概述、应用和优势

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • jupyter notebook导入上级目录的文件

    在jupyter中 使用 os path realpath 可以得到当前文件的路径 import sys import os os chdir os path dirname os path realpath sys path insert
  • Keepalived,基于 CentOS 7构建nginx的Keepalived 高可用群集。

    目录 1 简述 Keepalived 的主要功能 应用场合 2 使用 Keepalived 实现双机热备时 主 备服务器的配置存在哪些区别 3 构建 LVS Keepalived 高可用群集时 如何缩短故障中断时间 4 基于 CentOS
  • 电商高利润市场系统分析课:讲解电商赚钱机会,必看课程

    新标题 电商市场系统分析课程 揭秘电商盈利机会 值得推荐的学习资源 文章 引言 100字 电商行业成为了当今最受欢迎的盈利模式之一 但是 如何在电商市场中找到高利润市场 仍是一个颇具挑战的问题 本文将介绍一门关于电商市场系统分析的课程 该课
  • 在 vue3 中构建 SvgIcon 组件

    效果图 1 组件编写 components SvgIcon vue
  • Matlab:日期与时间的格式设置

    Matlab 日期与时间的格式设置 在Matlab中 我们经常需要对日期和时间进行格式设置 例如 在数据可视化和分析中 如果我们想要显示日期和时间的格式为 年 月 日 时 分 秒 就需要对其进行设置 下面 我们将介绍如何在Matlab中进行
  • vscode C语言运行程序无法打印输出中文

    用vscode编译c程序时 遇到中文无法打印输出的情况 解决方法 tasks json中将 fexec charset GBK 修改成 fexec charset UTF 8 即可
  • Centos7 安装MySQL5.7

    Centos7 5 安装MySQL5 7 rpm方式 1 首先删除Centos7自带的mariadb数据库 注意 以下指令要使用root用户执行 使用yum命令卸载 yum remove mysql mysql server mysql l
  • 七夕趣味玩法,用 MMGeneration 生成心仪的 TA

    七夕啦 小情侣们又又又又又要正大光明 撒狗粮 了 在这个特别的日子里 还是 单身喵 的你我他 是不是更对未来的 TA 充满了期待呢 来 AI 来帮你找到心仪的另一半 不信 你看 只需要文字描绘出 你心目中未来的 TA 的样子 就能立马生成一
  • AcWing 417. 不高兴的津津

    题目 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假设津津不会因为其它
  • Metadata操作手册

    Metadata操作手册 1 Metadata基础知识 1 1 专业术语 元数据 1 1 1 公共仓库数据模型 公共数据仓库模型是一种规范标准 限定了数据仓库 商业智能 知识管理 端口 portal 技术之间交换的元数据的格式 Pentah
  • .net Core Api swagger 注释不显示问题

    创建好API之后代码写了注释发现API文档没有注释 解决方法如下 1 勾选项目属性中的生成XML 2 Program cs文件增加如下代码 builder Services AddSwaggerGen c gt c SwaggerDoc v
  • JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

    jvm区域总体分两类 heap区和非heap区 heap区又分 Eden Space 伊甸园 Survivor Space 幸存者区 Tenured Gen 老年代 养老区 非heap区又分 Code Cache 代码缓存区 Perm Ge