Redian新闻
>
JVM 内存架构和 GC 算法基础

JVM 内存架构和 GC 算法基础

科技

新钛云服已为您服务1500




目的

本文讨论了 JDK8 及更高版本的堆内存和栈内存管理的基本概念。以及 GC 及其算法的基础知识。

内存管理的重要性

Java 垃圾收集器不能确保堆内存完全空闲,而且对于开发人员来说,不可能强制垃圾收集器在特定时间运行。因此,了解 Java 中的内存管理是如何工作的对开发程序会很有帮助。


了解内存管理有助于编写优化的内存效率代码,并有助于避免程序中任何与内存相关的问题,这些问题可能导致应用程序运行缓慢,并有助于避免 StackOverFlowError 和 OutOfMemoryError 等错误。

栈内存

栈是一种线性数据结构,是 Java 分配的静态内存,用于存储堆对象引用,也存储 Java 原始类型值。栈以后进先出 (LIFO) 顺序访问内存,并且栈比堆内存快。


每个线程在内存中创建自己的栈,这反过来又使栈内存线程安全。


 

Java 中的方法仅访问方法体(方法范围内)内的栈内存中的对象。当方法执行完成时,该方法对应的块会从栈中清除。


 

在上面的程序中,我们可以看到,当控件到达main方法时,栈中会有一个args的入口。然后当控件在下一行时,一个新条目被添加到栈中。

当控件超出方法的范围时,引用将从栈中删除。


如果栈内存已满,JVM 会抛出 StackOverFlowError。

堆内存

堆用于JVM在运行时为Java对象动态分配内存。任何新对象都存储在堆中,并且对象的引用(示例变量)存储在栈中。您可以在下面的示例中看到示例代码的变量如何存储在堆和堆栈中。


下面是上述代码片段在堆中的内存分配。


堆内存可以分解成更小的部分,称为代,它们是年轻代、年老/终身代和永久代。

年轻一代

所有新对象都在此内存段中分配。 年轻代由 Eden 和两个 Survivor 空间组成。当 Eden 填满时,垃圾收集发生在年轻代上,这称为 Minor GC。在 Minor GC 期间,来自年轻代的引用对象被移动到 Survivor 空间 #1,并且对象的年龄增加。

例如,在下图中,“对象 1”和“对象 2”将在第一次 Minor GC 之后移动到 Survivor 空间 #1,并且它们将具有指定的年龄。如果“对象 1”在第一次 Minor GC 中幸存下来,则年龄为零。现在如果“对象 1”在下一次 Minor GC 中也幸存下来,那么它将被移动到幸存者空间 2,并且年龄将再次增加。


 

在第二次 Minor GC 期间,驻留在 Survivor 空间 #1 中的对象(具有引用)将被移动到 Survivor #2,并且年龄将增加(即根据示例年龄将从零变为一)。并且从完整的年轻代空间中所有未引用的对象都将被删除。


老一代

老年代是存放长寿命对象(最老的对象)的地方。 年轻代对象有年龄的上限或阈值。 一旦对象达到该上限,则该对象将移至老一代或终身代。


终身代

这部分堆内存用于存储运行时类和方法的元数据。 JDK 8 开始,这部分内存已被 Java 完全删除,并被 Metaspace 概念所取代。您仍然可以设置 --XX:PermSize 和 -XX:MaxPermSize 配置。但是,如果您在 JDK 8 或更高版本上运行应用程序,则会在运行时收到警告。


元空间

这是从 JDK 8 版本开始引入的,它是一个可调整大小的内存区域并从本机内存中分配。元空间保存类元数据,它不是一个连续的内存位置。


每当 Metaspace 达到为 Metaspace 分配的最大大小时,Java 就会触发自动 GC 以释放 Metaspace 内存。


元空间选项是 -XX:MetaspaceSize=size 和 -XX:MaxMetaspaceSize=size

 


垃圾收集

Java程序编译并更改为字节码并在JVM(Java虚拟机)上运行。Java 程序的对象是在该程序的专用堆内存上创建的。随着时间的推移,会创建更多对象,并且程序不再需要一些对象(未引用和取消范围)。垃圾回收是 Java 执行自动内存管理并通过删除未引用对象来释放内存空间的过程。

 

JVM 结合了不同的垃圾收集算法。垃圾收集算法检查内存中的每个引用对象,其余对象被视为垃圾收集。

GC算法的类型

以下是 JVM 可用的 4 种类型的 GC 算法。

并行GC

串行GC

并发标记和扫描

G1 垃圾优先

并行GC

专为具有中等或大量数据的多线程应用程序而设计,在多处理器环境中运行良好。但它会在垃圾收集期间冻结所有应用程序线程。 JVM 选项是 -XX:+UseParallelGC ,您可以选择使用 -XX:ParallelGCThreads=<NoOfThreads> 设置并行线程数。

串行GC

主要设计用于单线程环境。 Liek Parallel GC,它还会在垃圾收集期间冻结所有应用程序线程。JVM 选项是 -XX:+UseSerialGC。

并发标记和渗漏(CMS)

这是一个并发 GC,旨在缩短 GC 暂停时间,并且不需要停止正在运行的应用程序来执行 GC。这就是为什么这个过程比串行或并行 GC 慢的原因。


它使用多线程进行垃圾收集,并且可以与垃圾收集器共享处理器资源。JVM 选项是 -XX:+UseConcMarkSweepGC

G1 垃圾收集器(G1GC)

这是另一种最高效的并发 GC,专为具有大量内存的多处理器环境而设计。JVM 选项是 -XX:+UseG1GC

选择 GC 算法的参数

除非您对 GC 时间有特定要求并且需要放置其他规范,否则最好让 JVM 自己选择 GC 算法。


如果要选择和配置 GC 算法,那么需要考虑的参数很少,如堆大小、CPU 核心数、应用程序数据集体积、吞吐量、暂停时间、延迟。

 

a、堆大小 - 分配给 JVM 的内存总量。更大的堆大小意味着 GC 将花费更多时间。更大的堆内存意味着与更少的堆内存相比,JVM 触发 GC 的频率不会那么频繁。JVM 选项是 -Xms=和 -Xmx=,其中 -Xms 表示最小值,-Xmx 是最大值。


b、CPU 核心 - GC 算法因 CPU 核心数量而异。其中一些是为单核 CPU 设计的,一些是为多核 CPU 设计的。


c、应用程序数据集 - 这是指应用程序使用的对象数量。创建更多数量的新对象,导致填充年轻代空间,需要更多的 GC 时间来释放内存。


d、吞吐量 - 它是完成应用程序任务所需的总时间(GC 外)的百分比。它与分配给 JVM 的内存成反比。


e、暂停时间 - GC 算法在内存回收期间停止应用程序所花费的时间。它根据不同的GC算法而有所不同。JVM 选项是 -XX:MaxGCPauseMillis=


f、延迟 - 它是应用程序的响应时间,直接取决于 GC 暂停时间。

 

根据上述参数,您必须选择最适合您的应用的 GC 算法。例如:

· 如果应用程序很小并且使用较小的数据集并且在没有暂停时间要求的单处理器上运行,则串行 GC。


· 如果应用程序性能是最高优先级,则并行 GC。


· 当应用程序的响应时间很重要时,G1GC 或 CMS 因为它在运行 GC 时不会保留应用程序。

原文链接:https://dzone.com/articles/jvm-memory-architecture-and-gc


了解新钛云服

新钛云服荣膺第四届FMCG零售消费品行业CIO年会「年度数字化服务最值得信赖品牌奖」

新钛云服三周岁,公司月营收超600万元,定下百年新钛的发展目标

当IPFS遇见云服务|新钛云服与冰河分布式实验室达成战略协议

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案


往期技术干货

Kubernetes扩容到7,500节点的历程

低代码开发,全民开发,淘汰职业程序员!

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?



点👇分享

戳👇在看

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
DDR内存技术更迭20年彭博社开源 Memray,一个 Python 内存剖析器 | Linux 中国坏算法?笨算法?精选DS岗位 | Amazon、VMware、Autodesk等公司最新职位发布!为“架构”再建个模:如何用代码描述软件架构?架构即代码:编码下一代企业(应用)架构体系精选SDE岗位 | VMware、Google、Verily等公司最新职位发布!河流现代人的婚姻观到底应该是什么样的?最残暴上位史!LVMH和它背后的男人精选DS岗位 | Visa、VMware、Q2等公司最新职位发布!精选SDE岗位 | Tableau、Amazon、VMware等公司最新职位发布!Cell丨CCoV-HuPn-2018的S蛋白结构和功能及受体被解析;这是第8种从动物跨中传播给人的冠状病毒精选SDE岗位 | Google、WEX、VMware等公司最新职位发布!面向 Java 开发人员的 JVM 参数指南 | Linux 中国架构工作台:构建企业(应用)架构的数字孪生彭博社:苹果新头显或配备M2处理器,16GB内存;JBD宣布实现0.13英寸红光Micro-LED微显示器量产精选SDE岗位 | Qualcomm、Amazon、VMware等公司最新职位发布!兰卡资讯 | 反对党提交两项不信任动议;JVP党披露拉贾巴克萨家族的涉腐大量文件都 2022 年了,iPhone 为什么还是 4GB 内存?可省近90%服务器,反欺诈效率却大增,PayPal打破「AI内存墙」的方案为何如此划算?精选SDE岗位 | VMware、WellSky、Ping Identity等公司最新职位发布!多机构和经济学家预警:美国经济衰退风险“非常高”蒲公英!精选SDE岗位 | Amazon、Google、VMware等公司最新职位发布!桃花雪我和娘亲在外婆“老虎灶”的往事回忆 (上)内存再不足,也不删这张照片架构自治服务:构建数据驱动的架构洞察精选SDE岗位 | Google、VMware等公司最新职位发布!用CPU方案打破内存墙?学PayPal堆傲腾扩容量,漏查欺诈交易量可降至1/30聊一款采用大容量LPDDR5内存的笔记本特斯拉遭非裔员工起诉,被指在湾区工厂内存在种族主义硬核观察 #673 Ubuntu 22.04 干掉内存占用超出的应用引来批评精选SDE岗位 | Tableau、VMware、Amazon等公司最新职位发布!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。