JVM内存结构

2021-03-03  本文已影响0人  lix22

JVM架构

JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区(runtime data area)


jvm架构.jpg 运行时数据区.jpg

内存分类

按空间划分为两类:堆内存(Heap)非堆内存(NonHeap)

堆内存(Heap)

堆内存.jpg
Thread Local Allocation Buffer (TLAB,线程本地分配缓冲区)

非堆内存(NonHeap)

非堆内存.jpg
Metaspace
Compressed Class Space
Direct Memory

线程共享与私有

线程共享与私有.jpg

堆外内存使用指标

usedcapacitycommittedreserved

Netty直接内存溢出

LEAK.jpg OODM.jpg

常见调优参数

参数名称 含义 默认值 说明
-Xms   初始堆大小              物理内存的1/64            默认空余堆内存小于40%时(MinHeapFreeRatio),堆增大到-Xmx的值
-Xmx 最大堆大小 物理内存的1/4 默认空余堆内存大于70%时(MaxHeapFreeRatio),堆减小到-Xms的值
-Xmn 年轻代大小 堆内存的1/3 此处的大小是eden+ 2 survivor space,增大年轻代后,将会减小年老代大小
-Xss 每个线程的堆栈大小 1M
-XX:NewRatio 年轻代与年老代的比值 2 -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,当Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置
-XX:MetaspaceSize 元空间初始大小 21M 元空间的大小达到这个值时,会触发Full GC并会卸载没有用的类
-XX:MaxMetaspaceSize 元空间最大可分配大小 物理内存的1/64
-XX:MaxDirectMemorySize 直接内存最大可分配大小 与堆内存相同

[-Xmx] + 线程数量*[-Xss] + [-XX:MaxMetaspaceSize] + [-XX:MaxDirectMemorySize]


垃圾回收(GC)

有不少人把这项技术当作Java语言的伴生产物。事实上,垃圾收集的历史远远比Java久远,在1960年诞生于麻省理工学院的Lisp是第一门开始使用内存动态分配和垃圾收集技术的语言。

GC重点
可达性分析法

当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。

可达性分析法.jpg

在Java技术体系里面,固定可作为GC Roots的对象包括以下几种:

分代收集理论

当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)[1]的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:

  • 收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储

在一次次只局限于新生代区域内的收集中,新生代中的对象是完全有可能被老年代所引用的,因此对分代收集理论添加第三条经验法则:

不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构记忆集(Remembered Set),把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用。

各阶段GC名词:

堆内存使用流程
对象申请内存流程.jpg
上一篇 下一篇

猜你喜欢

热点阅读