JVM调优+jsvm远程调试技巧

jsvm远程调试技巧

1.cd ${JAVA_HOME}/bin

2.sudo vi jstatd.all.policy

 

 其中jstatd.all.policy 文件内容如下:

grant codebase "file:${java.home}/../lib/tools.jar" {

permission java.security.AllPermission;

};
3.jstatd -J-Djava.security.policy=jstatd.all.policy &

1.最大堆和最小堆模拟运行一段时间后向上预估调优20-30%
2.
元空间最大最小设置一样大
(1)防止内存抖动
(2)物理内存的1/32

jdk exec version

三种运行模式

Xint  纯字节码解释器 (淘汰)
-Xcomp 纯模板解释器 适合小型应用
-Xmixed 字节码解释器 + 模板解释器 


  模板解释器
    Java字节码->硬编码


    看一个C程序:模拟的就是模板解释器的底层实现

    1、申请一块内存:可读可写可执行

      JIT在Mac是无法运行的

      Mac无法申请可执行的内存块

      Unix

      mmap

    2、将处理new字节码的硬编码拿过来(硬编码怎么拿到?) lldb   解析可执行文件
    3、将处理new字节码的硬编码写入申请的内存
    4、申请一个函数指针,用这个函数指针执行这块内存
      函数指针
        执行函数的指针


    5、调用的时候,直接通过这个函数指针调用就可以了

 java -client -XX:+PrintFlagsFinal -version | grep CompileThreshold

热度衰减

    new    7000
    有一段时间没有执行
    2倍速往下掉  3500


热点代码缓存区
  方法区

  自动清理
  LRU

  CodeCache

  调优中的一种


  server 编译器模式下代码缓存大小则起始于 2496KB
  client 编译器模式下代码缓存大小起始于 160KB


java -client -XX:+PrintFlagsFinal -version | grep CodeCache

InitialCodeCacheSize
ReservedCodeCacheSize
设置一样大

Codecache Size Options
-XX:InitialCodeCacheSize
用于设置初始CodeCache大小

-XX:ReservedCodeCacheSize
用于设置Reserved code cache的最大大小,通常默认是240M

-XX:CodeCacheExpansionSize
用于设置code cache的expansion size,通常默认是64K
Codecache Flush Options
-XX:+UseCodeCacheFlushing
是否在code cache满的时候先尝试清理一下,如果还是不够用再关闭编译,默认开启

Compilation Policy Options
-XX:CompileThreshold
方法触发编译时的调用次数,默认是10000

-XX:OnStackReplacePercentage
方法中循环执行部分代码的执行次数触发OSR编译时的阈值,默认是140

Compilation Limit Options
-XX:MaxInlineLevel
针对嵌套调用的最大内联深度,默认为9

-XX:MaxInlineSize
方法可以被内联的最大bytecode大小,默认为35

-XX:MinInliningThreshold
方法可以被内联的最小调用次数,默认为250

-XX:+InlineSynchronizedMethods
是否允许内联synchronized methods,默认为true

-XX:+PrintFlagsFinal(默认没有启用)
用于查看所有可设置的参数及最终值(JDK 6 update 21开始才可以用),默认是不包括diagnostic或experimental系的。如果要在-XX:+PrintFlagsFinal的输出里看到这两种参数的信息,分别需要显式指定-XX:+UnlockDiagnosticVMOptions / -XX:+UnlockExperimentalVMOptions(-XX:+PrintCommandLineFlags 这个参数的作用是显示出VM初始化完毕后所有跟最初的默认值不同的参数及它们的值)

-XX:+PrintCodeCache(默认没有启用)
-XX:+PrintCodeCache用于jvm关闭时输出code cache的使用情况

-XX:+PrintCodeCacheOnCompilation(默认没有启用)
用于在方法每次被编译时输出code cache的使用情况


查看Code Cache的使用情况

XX:+PrintCodeCache

-XX:+DoEscapeAnalysis表示开启逃逸分析,JDK8是默认开启的

-XX:+PrintGC 表示打印GC信息

-Xms5M -Xmn5M 设置JVM内存大小是5M
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn

-Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。

逃逸分析
1将堆分配转化为栈分配。如果某个对象在子程序中被分配,并且指向该对象的指针永远不会逃逸,该对象就可以在分配在栈上,而不是在堆上。在有垃圾收集的语言中,这种优化可以降低垃圾收集器运行的频率。
2同步消除。如果发现某个对象只能从一个线程可访问,那么在这个对象上的操作可以不需要同步。
3分离对象或标量替换。如果某个对象的访问方式不要求该对象是一个连续的内存结构,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。

虚拟机参数:-XX:+HeapDumpOnOutOfMemoryError,让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照来分析;
使用内存映像分析工具分析堆转储快照,确认内存中的对象是否必要 TODO

–XX:ParallelGCThreads=20:设置 20 个线程进行垃圾回收;

–XX:+UseParNewGC:年轻代使用并行回收器;

–XX:+UseConcMarkSweepGC:年老代使用 CMS 收集器降低停顿;

–XX:+SurvivorRatio:设置 Eden 区和 Survivor 区的比例为 8:1。稍大的 Survivor 空间可以提高在年轻代回收生命周期较短的对象的可能性,如果 Survivor 不够大,一些短命的对象可能直接进入年老代,这对系统来说是不利的。

–XX:TargetSurvivorRatio=90:设置 Survivor 区的可使用率。这里设置为 90%,则允许 90%的 Survivor 空间被使用。默认值是 50%。故该设置提高了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。因此,这个选项更有助于将对象留在年轻代。

–XX:MaxTenuringThreshold:设置年轻对象晋升到年老代的年龄。默认值是 15 次,即对象经过 15 次 Minor GC 依然存活,则进入年老代。这里设置为 31,目的是让对象尽可能地保存在年轻代区域。

-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-Xmn:设置年轻代大小
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

jps 查看

jstat -gc pid 5000 时间


jmap 打出堆栈

jmap  -histo pid > xxx.log
jmap  -heap pid > xxx.log

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
         S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
         S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
         S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
           EC:年轻代中Eden(伊甸园)的容量 (字节)
           EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
           OC:Old代的容量 (字节)
           OU:Old代目前已使用空间 (字节)
           PC:Perm(持久代)的容量 (字节)
           PU:Perm(持久代)目前已使用空间 (字节)
         YGC:从应用程序启动到采样时年轻代中gc次数
       YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
         FGC:从应用程序启动到采样时old代(全gc)gc次数
       FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
         GCT:从应用程序启动到采样时gc用的总时间(s)

    NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

    NGCMX:年轻代(young)的最大容量 (字节)

        NGC:年轻代(young)中当前的容量 (字节)

   OGCMN:old代中初始化(最小)的大小 (字节) 

   OGCMX:old代的最大容量 (字节)

       OGC:old代当前新生成的容量 (字节)

   PGCMN:perm代中初始化(最小)的大小 (字节) 

   PGCMX:perm代的最大容量 (字节)   

       PGC:perm代当前新生成的容量 (字节)

          S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

         S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

           E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

           O:old代已使用的占当前容量百分比

           P:perm代已使用的占当前容量百分比

  S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

 S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

    ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

       DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

          TT: 持有次数限制

       MTT : 最大持有次数限制

UseCompressedoops
压缩的是对象指针的长度

UseCompressedClassPointers
压缩的是Klass对象的指针的长度

-Xloggc:gc日志路径

1、方法区
1、模拟OOM,上代码
-XX:+PrintGCDetails -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m
调优原则
1、最大、最小设置成一样大
2、程序运行起来后,通过visualVM、arthas查看占用了多少内存,向上调优,预留20%以上的空间

2.堆区
-XX:+PrintGCDetails -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -Xloggc:/Users/didi/Downloads
调优原则
1、预留30%以上的空间
2、周期性看日志,重点关注full gc频率

3虚拟机栈
-Xss200k

CPU占用太高

jps -lvm  jps jps -l
CPU
top
top 查看cpu占用率  shift P 排序

top -H -p

1,使用命令top -p <pid> ,显示你的Java进程的内存情况,pid是你的java进程号,比如4977

2,按H,获取每个线程的内存情况 
3,找到内存和cpu占用最高的线程pid,比如4977 
4,执行 System.out.println(Integer.toHexString(4977));8 得到 0x1371 ,此为线程id的十六进制 
5,执行 jstack 4977|grep -A 10 1371,得到线程堆栈信息中1371这个线程所在行的后面106,查看对应的堆栈信息找出可能存在问题的代码

1.使用top 定位到占用CPU高的进程PID

top 
ps aux | grep PID

2.获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn 

3.将需要的线程ID转换为16进制格式

printf "%x\n" tid

4.打印线程的堆栈信息

jstack pid |grep tid -A 30
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值