当前位置:首页 > 内存 > 正文

java对象的内存布局

  • 内存
  • 2024-08-28 02:01:51
  • 3815

一、无声的性能杀手——伪共享(FalseSharing)伪分享看似看不见的性能杀手;它通常在多线程缓存系统中默默地工作。缓存行大小和数据争用是关键因素。当多个线程同时更新独立但共享的缓存行中的数据时。即使在代码中不明显,参数写入也会导致性能显着下降。为了保证螺纹尺寸,避免缓存行冲突很重要。
Java内存布局对于理解这个问题很重要。在HotSpotJVM中,对象头包含哈希码和标志位;接下来是类引用和数组的附加长度信息。优化性能;对象字段通常根据字节大小重新排序。通过在不同字段之间插入padding,比如7个long;尽可能避免错误共享。例如,在破坏者中,RingBuffer的游标和BatchEventProcessor接受这样的策略。
通过实际测量,当增加线程数量和调整缓存行填充时,性能会发生显着变化。图形结果表明,当没有缓存行竞争时。性能测量表明它们接近线性。虽然VolatileLongs的内存位置无法精确控,但它们通常会聚集在一起,进一步凸显了伪共享的潜在影响。
所以对于多线程编程来说,伪共享不容忽视,它会默默地降低性能,是开发人员需要认真对待以避免的问题。
二、从JDK9到19,认识一个新的Java形态(内存篇)


自从JDK9发布以来,Java更新的步伐明显加快,每年至少有两个大版本,直到现在的JDK19。JDK逐渐聚焦云原生场景,增加感知容器内资源、不延迟GC等能力。EDAS团队根据实践经验,分析了内存相关的技术变化,以帮助理解这种新的Java格式。


JVM内存管理的演变

自诞生以来,JVM以其自动管理和一次性配置内存的能力主导了企业应用程序市场。然而从JDK9开始,CMS的弃用和G1算法的引入标志着内存技术的发展方向。主要变化围绕三个核心点:堆栈内存布局、序列模型和集合行为。
堆内存布局

传统的分代模型曾一度流行,但在高卷积、低延迟的应用中,G1引入了基于区域的算法,不再依赖于它。记忆中的事物是按年龄来划分的,但通过区域行政的平等性和对象的广泛性,STW的时间明显减少。模型线程

ZGC等现代GC算法允许线程任务参与内存管理,跨块读取STW,提高并发处理能力。


行为收集

从简单到更详细的Region管理,行为收集变得更加细致,旨在更好地减少内存和资源的使用。


与云原生相关的关键能力

在云原生背景下,JDK增加了NUMA感知、ElasticMetaspace和ZGC管理项目,以优化资源使用和内存性能。


G1NUMA-Aware:在多节点架构中,JVM自动感知并使用本地内存,提高访问速度。
ElasticMetaspace:通过增加元空间管理来获得更高效的内存分配和回收。
ZGCUncommitUnusedMemory:在ZGC中,内存回收返回给操作系统,用于系统资金平衡和回收效率。

简而言之,JVM不断演进到本机环境并适应新技术趋势,以获得更好的性能和资源利用率。技术趋势影响着开发者、合作伙伴、工具的选择,云原生已经成为不可忽视的趋势。