欢迎光临散文网 会员登陆 & 注册

jvm参数类型、bin目录下工具、gc算法/常见垃圾收集器

2023-02-28 21:51 作者:1天生傲骨怎能认输1  | 我要投稿

jvm参数类型

1.标准参数

    1.-vserion

    2.-help

2.X参数(非标准化参数)

    1.-Xinit:解释执行

    2.-Xcomp:第一次使用就编译成本地代码

    3.-Xmixed:混合模式,jvm自己来决定是否编译成本地代码

3.XX参数

    1.非标准化参数

    2.相对不稳定

    3.主要用于jvm调优和debug

    4.类型

        1)boolean类型-XX[+-]<name>表示启用或者禁用name属性

        2)非boolean类型key-value,-XX<name>=<value>表示name属性的值是value

-Xms = -XX:InitialHeapSize:初始化堆大小

-Xmx = -XX:MaxHeapSize:最大堆大小

运行时jvm参数查看

-XX:+PrintFlagsFinal

=表示默认值

:=表示用户或者JVM修改后的值

例:java -XX:+PrintFlagsFinal -version

jps

jps -l

jinfo:

查看属性值:

    jinfo -flags pid

查看最大堆:

    jinfo -flag MaxHeapSize pid

查看最大栈:

    jinfo -flag ThreadStackSize pid

查看元空间:

    jinfo -flag MetaspaceSize pid


jinfo -flags pid

Non-default VM flags:系统默认的

Command line:自己配置的

jstat查看虚拟机统计信息

类加载

jstat -class pid 1000(毫秒) 10(次数)

Loaded  Bytes  Unloaded  Bytes     Time   

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

 17330 32996.8        0     0.0      11.21

垃圾收集:-gc、-gcutil、-gccause、-gcnew、-gcold

jstat -gc pid

jstat -gc pid 1000(毫秒) 10(次数)

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   

209664.0 209664.0  0.0   111833.9 1677824.0 525792.0 6291456.0   22526.1   105860.0 102988.4 12288.0 11705.9     17    1.121   4      0.390    1.511


S0C、S1C、S0U、S1U:s0和s1的总量与使用量

EC、EU:Eden区总量与使用量

OC、OU:old区总量与使用量

MC、MU:metaspache区总量与使用量

CCSC、CCSU:压缩空间总量与使用量

YGC、YGCT:youngGC的次数与时间

FGC、FGCT:FullGC的次数与时间

GCT:总的GC时间


JIT编译:

jstat -compiler pid

Compiled Failed Invalid   Time   FailedType FailedMethod

   18681      5       0   118.76          1 com/alibaba/fastjson/parser/DefaultJSONParser parseObject


jstat -printcompilation pid

Compiled  Size  Type Method

   18790    862    1 org/springframework/core/annotation/AnnotatedElementUtils hasAnnotation


jmap+MAT实战内存溢出

如果导出内存映像文件

1.内存溢出自动导出

    -XX:+HeapDumpOnOutOfMemoryERROR

    -XX:HeapDumpPath=./

2.使用jmap命令手动导出

    jps看下进程号

    jmap -dump:format=b,file=xxx.hprof pid

    mat工具分析导出堆内存导出文件


jstack实战死循环与死锁

    jstack pid


实战死循环导致cpu飙高

    jstack pid > 文件

    top -p pid -H

    printf "%x" 线程号(转化进制)


基于JVisualVm的可视化监控

    1.监控本地tomcat

    2.监控远程tomcat

        修改jmx Catalina.sh

    3.监控普通是java进程


基于btrace的监控调试

tomcat:

tomcat远程debug

    jdwp(java debug wire protocol)

    tomcat-manager监控,需要配置user、manager

    psi-probe监控,需要配置user、manager

tomcat调优

1.内存优化

2.线程优化:http.html

     maxConnection

     acceptCount

     maxThreads

     minSpareThreads

3.配置优化

     autoDeploy

     enableLookups

     reloadable

     protocol

4.session优化

    如果是jsp,可以禁用session

1.nginx

    1.ngx_http_stub_status监控连接信息

    2.ngxtop监控请求信息

    3.nginx-rrd图形化监控

    4.nginx优化

 2.增加工作线程数和并发连接数

     worker_processes

     worker_connections

     multi_accept on;

     use epoll

 3.启用长连接

 4.启用缓存、压缩

 5.操作系统优化

 6.配置/etc/sysctl.conf

jvm层gc调优

jvm的内存结构

1.运行时数据区

  程序计数器pc register

  虚拟机栈jvm stacks

  堆heap

  方法区method area(非堆)

  方法区里面有常量池

  本地方法栈native method stacks


垃圾回收算法

    思想:枚举根节点,做可达性分析

    根节点:类加载器、thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等等

算法:

1.标记清除

     算法分为标记和清除两个阶段;首先标记出所有需要回收的对线。在标记完成后统一回收所有

     缺点:效率不高、标记和清除两个过程的效率都不高,产生碎片。碎片太多会导致提前gc

2.复制

     它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象

     复制到另外一块上面,然后再把使用过的内存空间一次清理掉

     优缺点:实现简单,运行高效,但是空间利用率低

3.标记整理

     标记过程和标记清除算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后清理掉边界以外的内存

     优缺点:没有了内存碎片,但是整理内存比较耗时


分带垃圾回收

    1.young区采用复制算法

    2.old区采用标记清除或者标记整理

对象分配

    1.对象优先在eden区分配

    2.大对象直接进入老年代:-XX:PretenureSizeThreshold

    3.长期存活的对象进入老年代:-XX MaxTenuringThreshold


垃圾收集器:

    1.串行收集器serial:serial、serial old(一般不采用,client模式下的默认收集器)

     -XX:+UseSerialGC -XX:UseSerialOldGC(jd8以后废弃)

    2.并行收集器:parallel:parallel scacenge、parallel old,吞吐量(server模式下的默认收集器,根据cpu、内存自动判断)

     -XX:+UseParallelGC -XX:UseParallelOldGC

    3.并发收集器concurrent: cms、G1,停顿时间

1.响应时间优先

CMS(老年代收集器?):XX:+useConcMarkSweepGC -XX:+UseParNewGC

cms垃圾收集过程

     1.CMS inital mark:初始标记Root,STW

     2.CMS concurrent mark:并发标记

     3.CMS-concurrent-preclean:并发预清理

     4.CMS remark:重新标记,STW

     5.CMS concurrent sweep:并发清除

     6.CMS-concurrent-reset:并发重置

缺点:cpu敏感,浮动垃圾,空间碎片

相关参数:

     1.-XX:ConcGCThreads:并发的gc线程数

     2.-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩

     3.-XX:CMSFullGCsbeforeCompaction:多少次fullGC之后压缩一次

     4.-XX:CMSInitationOCcupancyFraction:触发FullGC

     5.-XX:+UseCMSInitiationOccupancyOnly:是否动态调

     6.-XX:+CMSScaveBeforeRemark:fullGC之前先做yongGC

     7.-XX:+CMSClassUnloadingEnabled:启用回收Perm区

     I-CMS:适用于单核或者双核(jdk8后废弃)

4.G1(java 8):-XX:+UseG1GC(jdk8推荐)

新生代和老年代收集器

     1.region

     2.SATB:Snapshot-At-The-Beginning:它是通过Root Tracing得到的,GC开始时候存活对象的快照

     3.RSet:记录了其他Region中的对象引用本Region中对象的关系,属于points-into结构(谁引用了我的对象)

YoungGC

     1.新对象进入Eden区

     2.存活对象拷贝到Survivor区

     3.存活时间达到年龄阀值时,对象晋升到old区

MixdGC

     1.不是FullGC,回收所有的young和部分的Old

     2.global concurrent marking:全局的并发标记

MixdGC时机

是否需要切换到G1

5.ZGC(java 11)


G1调优

即仅使用-Xms,-Xmx和暂停时间目标-XX:MaxGCPauseMillis


并行vs并发

停顿时间vs吞吐量

垃圾收集器搭配

如何选择垃圾收集器


可视化gc日志分析工具

1.在线工具:http://gceasy.io

allocated:分配的

promoted:晋升的

1)Key Performance Indicators:关键性能指标

1.Throughput:吞吐量

2.Latency:响应时间

Avg Pause GC Time :平均gc时间

Max Pause GC Time :最大gc时间

2.GCViewer


tomcat的gc调优实战


jvm字节码指令

javap -verbose xxx.class > file

基于栈架构


i++与++i字节码指令是一样的,效率一样


字符串拼接:

每一次循环都会new一个StringBuilder

StringBuffer new一次


try-finally  return


String Constant Variable

intern


常见代码优化方法

1.尽量重用对象,不要循环创建对象,比如:for循环字符串拼接

2.容器类初始化的时候指定长度

3.ArrayList随机遍历快,linkedList添加删除快

4.集合遍历尽量减少重复计算

5.使用entry遍历map

5.大数组复制用System.arraycopy

6.尽量使用基本类型而不是包装类型

7.不要手动调用system.gc()

8.及时消除过期对象的引用,防止内存泄漏

9.尽量使用局部变量,减小变量的作用域

10.尽量使用非同步的容器ArrayList VS Vector

11.尽量减小同步作用范围,synchronzied方法VS代码块

12.ThreadLocal缓存不安全的对象,SimpleDateFormat

13.尽量使用延迟加载

14.尽量减少使用反射,加缓存

15.尽量使用连接池、线程池、对象池、缓存

16.及时释放资源,i/o流、socket、数据库连接

17.慎用异常,不要用抛异常来表示正常的业务逻辑

18.String操作尽量少用正则表达式

19.日志输出注意使用不同的级别

20.日志中参数拼接使用占位符




jvm参数类型、bin目录下工具、gc算法/常见垃圾收集器的评论 (共 条)

分享到微博请遵守国家法律