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