本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

JVM优化

  • 参数类别

    • 标准参数
    • -client/-server()
      • x86
      • Windows系统,默认使用Client类型JVM
      • 其他系统,满足2G内存且有2核心,默认使用Server类型,否则Client类型
      • x64
      • 只有Server类型,不支持Client类型
      • 区别
      • Server的初始堆更大一些, 且使用并行GC, 启动慢运行快
      • Client初始堆小一些, 使用串行GC, 启动快运行慢
    • -D: 可以给程序传入一些参数, java代码里通过System.getProperty(key)或getProperties()获取
    • -X参数
    • Running mode
      • -Xint interpreted mode
      • 启动快,执行慢
      • 强制JVM执行所有字节码,降低运行速度,降低10倍左右
      • -Xcomp complied mode
      • 启动慢,执行快
      • 启动时编译所有字节码为本地代码,带来最大程度优化,JIT不会根据代码类型自动判断是否编译
      • -Xmixed mixed mode
      • interpreted和complied混合使用,由JVM决定
    • -XX参数
    • boolean类型
      • -XX:+DisableExplicitGC
    • 非boolean类型
      • -XX:InitialHeapSize=111m / -Xms
      • -XX:MaxHeapSize=222m / -Xmx
      • -XX:PrintFlagsFinal / jinfo -flags {param} {pid}
  • 内存模型

    对于常量池, 1.6放在了方法区里, 1.7和1.8放在了Heep里

    • java7
    • Young
      • eden: 当eden区变满的时候,gc会将存活的对象移到survivor区
      • survivor: suvivor区有两个,同时只会有一个工作,另一个在gc回收时复制对象使用
      • S0
      • S1
    • Old: 大对象会直接进入Old Gen, 或在Survivor区经过几次垃圾回收仍然存活的对象也会进入此区域
    • Perm: 主要存放Class,Method,Field对象
    • java8
    • Young
      • Eden: 当eden区变满的时候,gc会将存活的对象移到Survivor区
      • Survivor: Suvivor区有两个,同时只会有一个工作,另一个在gc回收时复制对象使用
      • S0
      • S1
    • Old 大对象会直接进入Old Gen, 或在Survivor区经过几次垃圾回收仍然存活的对象也会进入此区域
    • MetaSpace
      • CSS
      • CodeCache
  • JDK提供的常用命令

    • jstat - Monitors Java Virtual Machine (JVM) statistics.常用于查看堆内部内存使用情况
      • 便于实时显示可以加上 1000(毫秒) 0(显示次数, 非正数则无限次) - 每1秒打印一次
      • -class pid: 查看类的加载信息
      • -compiler pid: 查看类的编译信息
      • -gc pid: 查看类的编译信息
      • -gcutil pid: 可以查看堆内存占用率和回收时间
    • jmap - Prints shared object memory maps or heap memory details for a process, core file, or remote debug server.可以查看比jstat更详细的内存统计
      • -heap pid: 查看堆内存的使用情况
      • -histo[:live] pid: histogram直方图显示所有对象以及占用空间, :live可以只查看活跃对象
      • -dump:[live,] format=b, file=filename pid: Dump jvm当前内存到文件中
    • jstack pid - 用于查看线程状态
    • jvisualvm - JDK[6],7,8提供的一个图形化整合以上所有命令的工具, 可远程
      • 远程配置: 可加上以下OPTS
        • -Dcom.sun.management.jmxremote # 开启JMX
        • -Dcom.sun.management.jmxremote.port=9999 # 指定通信端口
        • -Dcom.sun.management.jmxremote.authenticate=false # 关闭auth
        • -Dcom.sun.management.jmxremote.ssl=false # 关闭SSL
  • 对内存dump进行分析

    • 1. jhat [options] dumpfile: 提供了一个简单的Web页面便于查询对象情况(使用OQL查询)

      • -port port-number: 指定绑定的Web端口
      • -exclude exclude-file: 指定文件排除一些数据成员, 格式(java.lang.String.value)
      • -debug int: 指定debug级别默认0, 向上调整
    • 2. MAT: 一个基于Eclipse的软件, 很强大, Eclipse.....这里还是不作介绍了

  • 垃圾回收

    • 垃圾回收常见算法

      • 1.引用计数算法: 在每个对象内部维护一个计数器, 每当被引用+1, 当计数器归0, 回收, 不能解决循环依赖回收

      • 2.标记清除算法: 从根节点遍历所有对象, 标记所有被Root(间接)引用的对象, 标记后释放所有未被标记的 , 耗时,内存碎片化

      • 3.标记压缩算法: 在二的基础上把标记的对象复制到内存一侧形成连续, 释放临界值以外所有对象, 耗时

      • 4.复制算法

      • 5.分代算法