JVM相关

JVM类加载过程:
1、验证:对所需加载的.class类进行验证,看是否符合规范
2、准备:对加载的类分配内存空间,对类中的变量分配内存与给定初始值
3、解析:把符号引用替换为直接引用的过程
4、初始化:对类进行初始化,new的对象与类中变量赋值,初始化过程中,发现有父类还没加载和初始化,则加载父类并初始化

应用类加载器、拓展类加载器、启动类加载器
双亲委派机制

JVM内存区域划分:
1、类内存(元数据空间)
2、对象内存
3、方法内存

程序计数器

JAVA虚拟机栈:
每个线程都有自己的虚拟机栈,调用任何方法时,都会给方法创建栈帧入栈,执行完方法就出栈
堆内存:
存放代码运行过程中创建的各种对象,其实就是局部变量表里的引用指向了堆内存里new出来的对象

Minor GC:新生代垃圾回收
Full GC:新生代老年代垃圾回收,会严重影响系统性能

可达性算法来判定新生代哪些对象是可以被回收的,哪些对象是不可以被回收的,算法意思就是分析对象有没有被引用,看是否有GC Roots,如果有GC Roots,该对象就不能被回收
强引用:垃圾回收时绝对不会被回收的对象
软引用:正常情况下不会回收软引用对象,但如果垃圾回收后发现内存还是不够存放新的对象,内存快要溢出,此时就会把软引用对象给回收掉,哪怕对象被引用了
虚引用:知道概念即可

新生代内存被划分为两块
复制算法:垃圾回收时,把没被回收的存活对象,复制到另外一块空白内存中去,可保证没有内存碎片,然后清空需回收的内存块

新生代内存被划分为三块
一个Eden区和两个Survivor区,Eden区80%内存,Survivor区各10%内存,每次触发Minor GC后,存活对象转移到Survivor区,三块内存相互转换

标记整理算法来判断老年代垃圾回收对象

Minor GC会在新生代内存快满时触发,Minor GC后发现Survivor区仍不够存放新生代存活的对象,则会计算老年代是否空间足够,若老年代空间不够,则触发一下Full GC,
再从Survivor区开始循环,若又到达存放老年代环节,此时如果内存再不够,则会发生Handle Promotion Failure异常,即OOM内存溢出问题

ParNew垃圾回收器是多线程回收,默认根据服务器CPU核数确定线程数量,4核就是4个线程
Serial垃圾回收器是单线程回收

为避免长时间Stop The World,CMS采用了4个阶段来进行垃圾回收:
1、初始标记:会Stop The World,只是直接标记所以GC Root对象的引用,所以时间会很短
2、并发标记:会对老年代所有对象进行GC Root的追踪,非常耗时,但是是并发执行的,所以对系统不会造成影响
3、重新标记:会Stop The World,就是把在程序执行期间创建的并发对象进行重新标记(包括此时产生的垃圾对象),
因为这次标记在并发标记的基础上,所以标记对象很少,时间也会很短
4、并发清理:清理掉所有垃圾对象即可,非常耗时,但是是并发处理,所以对系统也不会造成影响

G1垃圾回收,Region概念:
1、初始标记:同上
2、并发标记:同上
3、最终标记:同上
4、混合回收:根据G1特性,按最短时间尽可能回收最多的垃圾对象,会stop the world,stop the world根据设定时间,默认200ms

jstat -gc PID:查看某个Java进程的内存和GC情况
S0C:这是From Survivor区的大小
S1C:这是To Survivor区的大小
S0U:这是From Survivir区当前使用内存的大小
S1U:这是To Survivor区当前使用内存的大小
EC:这是Eden区的大小
EU:这是Eden区当前使用大小
OC:这是老年代的大小
OU:这是老年代内存使用大小
MC:这是方法区(永久代、元数据区)的大小
MU:这是方法区(永久代、元数据区)当前使用内存大小
YGC:这是系统运行迄今为止Young GC的次数
YGCT:这是Young GC的耗时
FGC:这是系统运行迄今为止Full GC的次数
FGCT:这是Full GC的耗时
GCT:这是所有GC的总耗时

jstat其它命令
jstat -gccapacity PID:堆内存分析
jstat -gcnew PID:年轻代GC分析,这里的TT和MTT可以看到对象在年轻代存活的年龄和存活的最大年龄
jstat -gcnewcapacity PID:年轻代堆内存分析
jstat -gcold PID:老年代GC分析
jstat -gcoldcapacity PID:老年代内存分析
jstat -gcmetacapacity PID:元数据区内存分析

jmap -histo PID:按照各种对象占用内存空间进行降序排列
jmap -dump:live,format=b,file=dump.hprof PID:导出堆内存快照,用于工具分析,如MAT

XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5
:设置5次Full GC之后才会进行一次内存压缩操作,解决内存碎片问题,可空余出大片连续可用内存空间,-XX:CMSFullGCsBeforeCompaction=0即为每次Full GC都解决内存碎片
JVM参数含义:
-Xms4096M 堆内存的最小大小,默认为物理内存的1/64
-Xmx4096M 堆内存的最大大小,默认为物理内存的1/4
-Xmn3072M 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
-Xss1M 设置每个线程可使用的内存大小,即栈的大小
-XX:PermSize=256M 永久代最小大小(Java8之前)
-XX:MaxPermSize=256M 永久代最大大小(Java8之前)

-XX:NewSize=10485760 新生代大小
-XX:MaxNewSize=10485760 新生代最大大小
-XX:InitialHeapSize=20971520 初始堆内存20M
-XX:MaxHeapSize=20971520 最大堆内存20M
-XX:SurvivorRatio=8 年轻代占比8:1:1
-XX:MaxTenuringThreshold=15 15次Young GC后对象进入老年代
-XX:PretenureSizeThreshold=3145728 对象大于3M直接进入老年代

-XX:+UseParmNewGC 使用ParmNewGC方式
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFaction=92 老年代占用超过92会触发Full GC
-XX:+UseCMSCompactAtFullCollection 在Full GC时,对老年代进行压缩
-XX:CMSFullGCsBeforeCompation=0 每次Full GC都整理内存碎片
-XX:+CMSParallellnitialMarkEnabled 初始标记采用并发方式
-XX:+CMSScavengeBeforeRemark Full GC之前先触发一次Young GC

-XX:+PrintGCDetails 打印GC详细信息
-XX:+PrintGCTimeStamps 打印时间戳
-Xloggc:gc.log 打印gc.log日志文件

-XX:+DisableExplicitGC 禁止显示执行GC,不允许通过代码来执行GC,如:System.gc();

堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行老年代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值