JVM内存模型
2019-12-05 09:53:44 0 举报
JVM内存模型
作者其他创作
大纲/内容
stack
Thread Local Allocation Buffer
Thread1...N
Method Area/Meta Space
Runtime Constant Pool
Code Cache
ToSurvivor
Heap Space
Vitual
pc
Code
当内存需求不断增长的时候,JVM 会逐渐扩展其空间大小,Virtual 区域代表的就是暂时不可用(uncommitted)
所有 OpenJDK 衍生出来的 JVM 都提供了 TLAB的设计。这是 JVM 为每个线程分配的一个私有缓存区域,否则多线程同时分配内存时,为避免操作同一地址,可能需要使用加锁等机制,进而影响分配速度,
TLAB...
Old Generation
-Xmx=最大堆内存-Xms=最小堆内存-XX:NewRatio=老年代和新生代的比例,默认2:1
Field & Method Data
Permanent Generation
Young Generation
EdenSpace
native stack
常用的JVM内存分析工具1.堆内存分析:命令:jmap,堆转储(Head Dump)文件,再结合jhat或者Eclipse的MAT 等堆转储分析工具进行详细分析2.堆外内存——直接内存分析:JDK 自带的 Native Memory Tracking(NMT)特性,它会从 JVM 本地内存分配的角度进行解读2.1开启NMT模式,并采用summary模式: -XX:NativeMemoryTracking=summary2.2退出时打印NMT统计信息:-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics2.3打印结果分析:2.3.1 Java Heap,堆大小,调整方式:-Xmx -Xms2.3.2Class,Class内存占用,也就是Java 类元数据所占用的空间,调整方式:-XX:MaxMetaspaceSize=value2.3.3Thread,这里既包括 Java 线程,如程序主线程、Cleaner 线程等,也包括 GC 等本地线程。补充:G1垃圾收集器用的线程比较多(比parallelGC,-XX:UseParallelGC),Java9的JIT 编译默认是开启了 TieredCompilation(关闭:-XX:-TieredCompilation)2.3.4Code,这是 CodeCache 相关内存,也就是 JIT compiler 存储编译热点方法等信息的地方,JVM 提供了一系列参数可以限制其初始值和最大值等(-XX:InitialCodeCacheSize=value,-XX:ReservedCodeCacheSize=value)2.3.5GC,垃圾收集器占用的空间2.3.6Compiler,JIT 的开销,显然关闭 TieredCompilation会降低开销2.3.7Internal,(JDK 11 以后在 Other 部分)部分,其统计信息包含着 Direct Buffer 的直接内存,这其实是堆外内存中比较敏感的部分,很多堆外内存 OOM 就发生在这里2.3.8详细参考:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr022.html#BABCBGFA3.jstat,可以实时查看gc信息
使用程序的方式监测内存1.java.lang.Runtime类有freeMemory()、totalMemory()等方法可以获取到jvm内存情况2.jmx可以做到通过代码而不是工具去监控,其实jdk安装包的工具也是对jmx的一个薄层的封装
compile
-XX:SurvivorRatio=【8】Eden与Survivor(1个)的大小比例,默认8:1
8
程序计数器Java虚拟机栈本地方法栈
native
FromSurvivor
Tenured
Native Area
2
JDK8把持久代移除,变更为MetaSpace,在此区域分配大小,-XX:MaxMetaspaceSize=元数据区大小,存储的是Class,运行时常量、属性、方法...
0 条评论
回复 删除
下一页