SE_JVM
2022-03-28 17:22:44 10 举报
AI智能生成
JVM结构以及GC
作者其他创作
大纲/内容
结构
Class loader类加载系统
内含多个类加载器,将类装载到运行数据区的方法区中
Execution engine执行引擎系统
内含JITCompiler即时编译器和垃圾回收器
Runtime data area运行数据区
内含方法区、堆、栈、本地方法栈、程序计数器等
Native interface本地接口
运行时数据区结构
PC寄存器
记录线程当前执行到哪条指令
栈
变量存放空间
堆
实例对象存放空间
方法区
存储类结构信息,可以被所有线程共享,不会频繁的被GC
运行时常量池
常量存放区
本地方法栈
JVM运行Native方法准备的空间
内存空间
物理内存和虚拟内存
物理内存,RAM(随机存储器)
寄存器,用于存储计算单元执行指令
地址总线,连接处理器和RAM
虚拟内存,多个进程在同时运行时可以共享物理内存
内核空间和用户空间
内核空间,操作系统运行时所使用的用于程序调度,虚拟内存的使用或连接硬件资源的程序逻辑
用户空间,用户运行时占用的内存空间
JAVA需要的内存组件
java堆
用于存储java对象的内存区域
分配完成后无法在内存不够时重新申请
线程
每个线程创建时,JVM会分配一个堆栈,通常在256~756KB之间
类和类加载器
在Sun SDK中存储在堆中,永久代(PermGen区)
只有HotSpot才有PermGen space
JRockit(Oracle)、J9(IBM)并没有PermGen space
JDK1.8中PermSize和MaxPermGen无效,使用元空间替代,位于本地内存
默认3个类加载器
Bootstap ClassLorader
ExtClassloader
AppClassloader
NIO
JDK1.4引入基于通道和缓冲区来执行IO的新方式
使用java.nio.ByteBuffer.allocateDirect()方法分配内存,分配的是本机内存不是java堆内存
分配内存时会调用操作系统的os::malloc()函数
JNI
JNI使得本机代码可以调用java方法,也就是native memory
GC
概念
Minor GC
JVM无法为新对象分配空间时触发
内存池被填满,内容会被全部复制,指针从0开始跟踪内存
执行Minor GC不会影响永久代
Minor GC会触发Stop The World,停止应用程序的进程
Major GC
Full GC
引用状态
强引用
类似Object o = new Object()这样引用称之为强引用,强引用存在则对象永远不会被回收
软引用
描述有用非必需的对象。在系统即将内存溢出的异常之前,将会把这些对象进行二次回收,SoftReference回收失败则抛出异常。
弱引用
描述非必需对象。该对象只能生存在下一次回收之前,在回收器工作之后就WeakReference不存在。
虚引用
这个引用的存在的唯一目的就是在对象被回收时收到一个通知,被虚引用关联的西乡和其生存时间完全没有关系,Java中的PhantomReference表示虚引用
方法区的垃圾回收
废弃常量
无用的类
该类所有的实例都被回收
加载该类的ClassLoader被回收
该类对应的Java.lang.Class对象在任何对方都没有引用,无法通过反射找到该类
内存回收策略
回收原则
引用计数法
可达性分析法
垃圾收集算法
标记-清楚算法(Mark-Sweep)
先标记然后统一回收
复制算法(Copying)
将可用内存分为两份,一份内存用完了,将当前存活的对象复制到另一份上,然后释放被使用的内存
标记-整理算法(Mark-Compact)
让所有的对象向一端移动,清除边界以外的内存
分代收集算法
大批对象死去,少量对象存活(新生代),使用复制算法成本低;对象成活率高,没有额外空间担保的(老年代),采用标记算法处理
垃圾收集器
G1收集器(JDK1.7)
并行和并发,使用多个CPU缩短Stop The World停顿时间与用户线程并行
分代收集,独立管理整个堆,能够采用不同方法新老生代对象,以获取更好的收集效果
空间整合,基于收集-整理算法,无内存碎片
可预测的停顿,能让使用者明确指定在一个M毫秒的时间片段内消耗在垃圾收集上不超过N毫秒
Young Generation
Serial收集器(JDK1.3)
采用复制算法的收集器
ParNew收集器(JDK1.4)
Serial的多线程版本
Parallel Scavenge收集器(JDK1.4)
新生代收集器,也是复制算法收集器,也是多线程收集器
虚拟机运行在Server模式下的默认收集器
目标是达到一个可控制的吞吐量
Tenured Generation
Parallel Old收集器(JDK1.6)
Parallel Scavenge收集器老年代版本,采用标记-整理算法
CMS收集器(JDK1.5)
初始标记,标记GCRoots直接关联的对象,时间很短,暂停所有的应用程序线程
并发标记,GCRoots Tracting(可行性分析)过程,时间很长
重新标记,修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,时间很长,暂停所有的应用线程
并发清除,回收内存空间,时间很长
Serial Old收集器(JDK1.5)
Serial收集器老年代版本,同样单线程,采用标记-整理算法
参数
-Xmx
堆最大值,默认内存1/4,<1G
-Xms
堆最小值,默认内存1/64,<1G
-Xss
线程栈大小,默认128K,可酌情提升至256K
-Xmn
年轻代大小,影响老年代大小,一般2G
-XX:NewSize
年轻代初始值,一般1G
-XX:MaxNewSize
年轻代最大值,一般1G
-XX:PermSize
持久代初始值,一般256m
-XX:MaxPermSize
持久代最大值,一般256m
-XX:NewRatio
年轻代和老年代的比值,设置4表示4:1
-XX:SurvivorRatio
年轻代Eden区和Survivor区的比值,设置8表示8:1:1
-XX:MaxTenuringThreshold
年轻代生存周期,设置7表示对象在Survivor区转移7次未回收则进入老年代
工具
JConsole
JVisual
0 条评论
下一页