Java性能调优学习

130 阅读2分钟

垃圾回收基本算法

标记-清除

进行标记时从“根对象”开始扫描引用的对象,在回收期间将未被标记的对象清除回收。该算法会产生大量的空闲空间碎片,可能导致大对象不容易获得空闲的内存空间。

标记-压缩

进行标记时从“根对象”开始扫描引用的对象,在回收期间将被标记的对象汇集到连续的内存空间。该算法通过整合空闲空间,避免内存碎片化。

复制

内存空间分成两个部分,每次只用其中一个部分。进行标记时从“根对象”扫描引用的对象,在回收期间将被标记的对象复制到另一部分内存空间。

查看使用的 GC 算法

  1. 使用命令行获取
java -XX:+PrintCommandLineFlags -version
  1. 打印进程信息
先使用命令 jps 查看进程号。

然后使用命令 "jinfo -flags 进程号" 打印进程信息。

内存区域

内存区域.png

  • Eden: 对象被创建的时候首先放到这个区域。
  • S0/S1: 两个区域空间相同的幸存者区,轮流用于存放年轻代经垃圾回收后应保留的对象。
  • 老年代: 用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能大对象直接进入老年代。

GC 类型

  • Minor GC: 年轻代空间回收内存。
  • Major GC: 老年代空间回收内存。
  • Full GC: 全局范围回收内存。

性能调优工具

!!!可能不同 JDK 版本自带的工具不同!!!

jps 主要用于查看进程号

图片.png

可视化工具

工具说明
JConsoleJDK自带的监控工具
JVisualVMJDK8之后的版本需要单独下载
JMCJDK8之后的版本需要单独下载

JConsole JConsole.png

JVisualVM JVisualVM.png

JMC JMC.png

工具命令

工具说明
jhsdbJDK9新增的命令行工具
jstat对 Java 应用程序的资源和性能进行实时的监控
jinfo查看正在运行的 Java 应用程序的扩展参数
jstack打印堆栈信息
jmapJava内存图
jhat堆储存查器

备注: jhsdb拥有 jstack、jmap、jinfo 等命令的功能。

显示当前所有 Java 进程 pid 的命令
$> jps

显示指定进程的 JVM 命令行参数
$> jinfo -flags {pid}

显示指定进程的当前堆栈情况
$> jstack {pid}

显示指定进程的堆详细信息
$> jmap -heap {pid}

参考资料