Java JVM相关
2024-04-07 17:49:19 0 举报
AI智能生成
登录查看完整内容
Java JVM相关
作者其他创作
大纲/内容
本地系统加载
网络下载.class文件
从zip、jar等压缩文件中加载.class文件
专有数据库中提取.class文件
将java源文件动态编译为.class文件
加载.class文件的方式
类的加载是将.class文件中的二级制文件加载到内存中
将类的数据结构加载到方法区
类的加载最终产品(对象)位于堆区中
类的加载
通过类的全限定名来获取其定义的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
在Java堆中生成一个代表这个类的java.lang.class对象,作为对方法区中这些数据的访问入口
加载
验证
为类的 静态变量分配内存,并将其初始化为默认值
数据类型默认值,并不是类属性的定义赋值
如果是final static同时修饰该字段属性,则是初始化的指定值
准备
符号引用就是一组符号来描述目标,可以是任何字面量。
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
解析
链接
初始化
类的生命周期
类加载器
类的加载机制
命令格式:jps [options] [hostid]
option参数:-l : 输出主类全名或jar路径-q : 只输出LVMID-m : 输出JVM启动时传递给main()的参数-v : 输出JVM启动时显示指定的JVM参数
JPS
命令格式:jstat [option] LVMID [interval] [count]
-class :监视类装载、卸载数量、总空间以及耗费的时间
-compiler:输出JIT编译过的方法数量耗时等。
-gc:垃圾回收堆的行为统计,常用命令
-gccapacity:同-gc,不过还会输出Java堆各区域使用到的最大、小空间
-gcutil: 同-gc,不过输出的是已使用空间占总空间的百分比
-gccause:垃圾收集统计概述(同-gcutil),附加最近2次的垃圾回收事件的原因
-gcnew:统计新生代行为
-gcnewcapacity:新生代与其相应的内存空间的统计
-gcold:统计旧生代的行为
-gcoldcapacity:统计旧生代的大小和空间
-gcpermcapacity:永生代行为统计
-printcompilation:hotspot编译方法统计
option参数详解
参数:[option] : 操作参数LVMID : 本地虚拟机进程ID[interval] : 连续输出的时间间隔[count] : 连续输出的次数
jstat
命令格式:jmap [option] LVMID
option参数:dump : 生成堆转储快照finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象heap : 显示Java堆详细信息histo : 显示堆中对象的统计信息permstat : to print permanent generation statisticsF : 当-dump没有响应时,强制生成dump快照
jmap
命令格式:jhat [dumpfile]
jhat
命令格式:jstack [option] LVMID
option参数:-F : 当正常输出请求不被响应时,强制输出线程堆栈-l : 除堆栈外,显示关于锁的附加信息-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
jstack
命令格式:jinfo [option] [args] LVMID
options参数:-flag : 输出指定args参数的值-flags : 不需要args参数,输出所有JVM参数的值-sysprops : 输出系统属性,等同于System.getProperties()
jinfo
命令篇
工具篇
JVM调优
-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最大空间大小。-XX:PermSize设置永久代最小空间大小。-XX:MaxPermSize设置永久代最大空间大小。-Xss设置每个线程的堆栈大小。
java运行内存控制参数
JVM中分为年轻代和老年代,年轻代分为三部分,Eden空间、From Survivor空间、To Survivor空间(比率:8:1:1)
几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域
堆内存
存储类信息、常量、静态变量等数据,是线程共享的区域
方法区
java虚拟机栈、本地方法区站,主要用于方法的执行
它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
线程私有
栈
作用可以看做是当前线程所执行的字节码的行号指示器。
程序计数器
JVM内存结构
strong style=\
在Java语言中,GC Roots包括:虚拟机栈中引用的对象。方法区中类静态属性实体引用的对象。方法区中常量引用的对象。本地方法栈中JNI引用的对象。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
对象存活判断
1.标记需要清除的对象2.一次性回收掉被标记的对象
标记-清除算法
缺点:效率不高;产生大量不连续的内存碎片,导致分配大的对象时,需要再次出发垃圾回收
通过标记不需要被清除的对象,(按顺序)复制到另一块内存上。整体清除掉上一块内存
优点:没有垃圾碎片,简单,高效缺点:内存缩小为一半
复制算法
和标记清楚算法相似。1.标记出需要清除的对象2.将所有不需要清楚的对象,移动到内存的一端进行连续。3.清除存活对象的边界以外的内存
标记压缩
将Java堆分为新生代和老年代,根据各个年代的特点采用不同算法。新生代对象存活短,只会有少量存活,可采用复制算法老年代对象存货长,存活率高,可采用标记清楚、标记压缩算法来回收
分代收集算法
垃圾收集算法
只是用一个线程、最稳定、效率高,可能会有长时间停顿。(新生代复制算法,老年代标记压缩)
参数控制: -XX : +UseSerialGC
Serial收集器依然是虚拟机运行在Client模式下的默认新生代收集器
Serial收集器
是Serial收集器的 多线程版本
参数控制:-XX:+UserParNewGC 是用ParNew收集器-XX:ParallelGCThreads 限制线程数量
ParNew
类似ParNew收集器,可以通过参数可控制的吞吐量,所谓吞吐量的意思就是CPU用于运行用户代码时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总运行100分钟,垃圾收集1分钟,那吞吐量就是99%
Parallel Scavenge收集器是虚拟机运行在Server模式下的默认垃圾收集器。
参数: -XX:+UseParallelGC
Parallel收集器
Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理算法”
参数控制: -XX : +UseSerialOldGC
Serial Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
-XX:+UseParallelOldGC
Parallel Old收集器
初始标记(CMS initial mark)并发标记(CMS concurrent mark)重新标记(CMS remark)并发清除(CMS concurrent sweep
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器(清除标记算法)
-XX:+UseConcMarkSweepGC 使用CMS收集器-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程是独占的,会引起停顿时间变长-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理-XX:ParallelCMSThreads 设定CMS的线程数量(一般情况约等于可用CPU数量)
优点: 并发收集、低停顿缺点: 产生大量空间碎片、并发阶段会降低吞吐量
CMS收集器
1.空间整合
2.可预测停顿
在G1之前的垃圾收集器,收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分(可以不连续)Region的集合。
(1). 并行和并发。使用多个CPU来缩短Stop The World停顿时间,与用户线程并发执行。(2). 分代收集。独立管理整个堆,但是能够采用不同的方式去处理新创建对象和已经存活了一段时间、熬过多次GC的旧对象,以获取更好的收集效果。(3). 空间整合。基于标记 - 整理算法,无内存碎片产生。(4). 可预测的停顿。能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
优点
参数:-XX:+UseG1GC #开启;-XX:MaxGCPauseMillis=50 #暂停时间目标; -XX:GCPauseIntervalMillis=200 #暂停间隔目标; -XX:+G1YoungGenSize=512m #年轻代大小; -XX:SurvivorRatio=6 #幸存区比例
G1收集器
垃圾收集器
GC算法 垃圾收集器
Java JVM相关
0 条评论
回复 删除
下一页