JVM性能

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系统是面向寄存器的架构

类的生命周期:加载+验证+准备+解析+初始化+使用+卸载

原文地址:https://www.cnblogs.com/erdanyang/p/13052812.html