1、压缩指针
2、每个线程的栈的大小Xss
3、线程太多,栈空间飙升
4、堆【eden(8/10) from(1/10) to(1/10) 老年代(2/3)】
minor GC
full GC
STW
(新生代设置大大一些然后不停的创建一些临时的变量,survivor)
先把所有的永久对象驱赶到老年代,然后执行System.gc(),这样字就可以知道永久对象的大小了。
java -showversion -Dkey=value App (设置系统参数)
-Xcomp -Xint -Xmixed
普通参数 -D参数 -X参数 -XX参数
-XX参数
·boolean类型 -XX:+DisableExplicitGC -XX:-DisableExplicitGC
非boolean类型 -XX:NewRatio=1
-Xms -Xmx (-Xmx2048m等价于-XX:MaxHeapSize=2048m) (-Xms2048m等价于-XX:InitialHeapSize=2048m)
-XX:+PrintFlagsFinal 打印所有的JVM参数(启动的时候)
jinfo -flags jcid(查看正在运行的JVM参数)
jps -l
元空间的原因:
jstat查看堆内存的使用情况:
jstat -class jcid
jstat -compiler jcid
jstat -gc jcid
jstat -gc jcid 1000 5 (每一秒打印一次,一共打印5次)
jmap -heap jcid
jmap -histo jcid | more 查看对象信息
jmap -histo:live jcid | more 查看对象信息
jmap -dump:format=b,file=fileName jcid
jhat对dump文件进行分析
jhat -port 9999 dumpFile 和 eclipse MAT工具
-XX:+HeapDumpOnOutOfMemoryError
jstack检测线程情况
性能调优的手段之一可以学习netty一样,用对象池来管理对象,避免GC进行频繁的垃圾回收
容器中对象的释放问题
调优的步骤:
1、设置最大内存和最小内存
2、设置新生代的大小(-Xmn -XX:NewSize -XX:MaxNewSize)
怎么防止内存震荡
3、设置线程栈的大小-Xss(每个线程所能持有的栈的大小)
4、设置新生代和老年代的比例大小-XX:Ratio;设置eden和survivor的比例大小 -XX:SurvivorRatio -XX:TargetSurvivorRatio
5、编译器的调优
-version -Xcomp -Xint -Xmixed
-XX:+PrintGCDetails
6、-XX:MetaspaceSize -XX:MaxMetaspaceSize
7、为什么需要对象池,避免频繁的回收与申请
8、压缩指针
1、jps -l
2、jps -v
3、jinfo -flags 71236
4、java -XX:+PrintFlagsFinal
5、jinfo -flag +PrintGCDetails 43520动态的设置参数
6、jstat -gc pid
jstat -gcutil pid
jstat -gcnew pid
jstat -gcold pid
7、jstat -class pid
8、jstat -compiler pid
1、编译器的优化
2、池化技术(线程调优)
3、缓冲管理
1、jps jinfo查看虚拟机配置参数
2、jstat参看虚拟机统计信息
3、打印垃圾回收信息
4、通过垃圾货收信息首先配置元空间的大小,防止内存震荡
5、确认初始化的老年代的大小(适当的调大新生代,适当的调整晋级老年代的策略,通过不同的创建新对象把一些持久化的对象驱赶到老年代)
6、参数:垃圾回收时间+系统吞吐量+系统响应时间(指定相应的垃圾回收器)
7、然后再次调整老年代的大小
8、确认新生代的大小【确认eden空间大小和survivor空间的大小】
通过系统最大吞吐量来确定eden空间的大小
通过系统最大吞吐量和系统响应时间来确定survivor空间的大小
9、确认eden和survivor的比例大小
9、jmap查看虚拟机的内存状况(内存泄漏问题)(内存不断的增加现象)
10、jstack查看虚拟机的线程状况(死锁信息)(cpu100%)
11、选择指针压缩策略
12、选择不用类校验器
怎么快速的找到枚举根节点,(在类加载,或者JIT编译器中的OopMap中记录下类),在OopMap的帮助下,可以快速且准确的完成GCRoots枚举
只有在安全点才有OopMap数据结构,主动式中断
虚拟机在离开安全区域时会检测是否完成了根节点的枚举
RememberedSet是记录新生代和老年代的对象相互引用的情况下的问题的
Java虚拟机是面向操作数栈的架构,Linux系统是面向寄存器的架构
类的生命周期:加载+验证+准备+解析+初始化+使用+卸载