垃圾回收基本算法
标记-清除
进行标记时从“根对象”开始扫描引用的对象,在回收期间将未被标记的对象清除回收。该算法会产生大量的空闲空间碎片,可能导致大对象不容易获得空闲的内存空间。
标记-压缩
进行标记时从“根对象”开始扫描引用的对象,在回收期间将被标记的对象汇集到连续的内存空间。该算法通过整合空闲空间,避免内存碎片化。
复制
内存空间分成两个部分,每次只用其中一个部分。进行标记时从“根对象”扫描引用的对象,在回收期间将被标记的对象复制到另一部分内存空间。
查看使用的 GC 算法
- 使用命令行获取
java -XX:+PrintCommandLineFlags -version
- 打印进程信息
先使用命令 jps 查看进程号。
然后使用命令 "jinfo -flags 进程号" 打印进程信息。
内存区域
- Eden: 对象被创建的时候首先放到这个区域。
- S0/S1: 两个区域空间相同的幸存者区,轮流用于存放年轻代经垃圾回收后应保留的对象。
- 老年代: 用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能大对象直接进入老年代。
GC 类型
- Minor GC: 年轻代空间回收内存。
- Major GC: 老年代空间回收内存。
- Full GC: 全局范围回收内存。
性能调优工具
!!!可能不同 JDK 版本自带的工具不同!!!
jps 主要用于查看进程号
可视化工具
| 工具 | 说明 |
|---|---|
| JConsole | JDK自带的监控工具 |
| JVisualVM | JDK8之后的版本需要单独下载 |
| JMC | JDK8之后的版本需要单独下载 |
JConsole
JVisualVM
JMC
工具命令
| 工具 | 说明 |
|---|---|
| jhsdb | JDK9新增的命令行工具 |
| jstat | 对 Java 应用程序的资源和性能进行实时的监控 |
| jinfo | 查看正在运行的 Java 应用程序的扩展参数 |
| jstack | 打印堆栈信息 |
| jmap | Java内存图 |
| jhat | 堆储存查器 |
备注: jhsdb拥有 jstack、jmap、jinfo 等命令的功能。
显示当前所有 Java 进程 pid 的命令
$> jps
显示指定进程的 JVM 命令行参数
$> jinfo -flags {pid}
显示指定进程的当前堆栈情况
$> jstack {pid}
显示指定进程的堆详细信息
$> jmap -heap {pid}
参考资料
- GC类型 cloud.tencent.com/developer/a…
- 性能调优工具官方文档 docs.oracle.com/javase/1.5.…