此文查看操作,是在windows环境下进行的
1、查看java版本
java -version
2、如果不知道java安装路径,想查看安装路径的话,可执行
java -verbose
执行上述命令后,会在最后打印出如下信息:
3、查看jvm使用的垃圾收集器
java -XX:+PrintCommandLineFlags -version
C:\Users\Administrator>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=267440704 -XX:MaxHeapSize=4279051264 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.275-b01, mixed mode)
参数说明
-XX:InitialHeapSize 初始堆大小
-XX:MaxHeapSize 最大堆大小
各个版本的JDK默认的垃圾回收器
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
JVM-查看JVM参数:
-XX:+PrintVMOptions 程序运行时,打印虚拟机接受到的命令行显式参数
-XX:+PrintCommandLineFlags 打印传递给虚拟机的显式和隐式参数
-XX:+PrintFlagsFinal 打印所有的系统参数的值
参考:https://blog.csdn.net/weixin_45737870/article/details/108932376
如何定位垃圾
- 引用计数
- 根可达算法
典型的垃圾收集算法
- 标记清除 - 位置不连续 产生碎片
- 拷贝算法 - 没有碎片,浪费空间
- 标记压缩 - 没有碎片,效率偏低
详细说明:
典型的垃圾收集器:
其他:
1.JVM内存分代模型(用于分代垃圾回收算法)
- 部分垃圾回收器使用的模型
- 新生代 + 老年代 + 永久代(1.7)/ 元数据区(1.8) Metaspace
- 永久代 元数据 - Class
- 永久代必须指定大小限制 ,元数据可以设置,也可以不设置,无上限(受限于物理内存)
- 字符串常量 1.7 - 永久代,1.8 - 堆
- MethodArea逻辑概念 - 永久代、元数据
- 新生代 = Eden + 2个suvivor区
- YGC回收之后,大多数的对象会被回收,活着的进入s0
- 再次YGC,活着的对象eden + s0 -> s1
- 再次YGC,eden + s1 -> s0
- 年龄足够 -> 老年代 (15 CMS 6)
- s区装不下 -> 老年代
- 老年代
- 顽固分子
- 老年代满了FGC Full GC
- GC Tuning (Generation)
- 尽量减少FGC
- MinorGC = YGC
- MajorGC = FGC
2.常见的垃圾回收器
- Serial 年轻代 串行回收
- PS 年轻代 并行回收
- ParNew 年轻代 配合CMS的并行回收
- SerialOld
- ParallelOld
- ConcurrentMarkSweep 老年代 并发的, 垃圾回收和应用程序同时运行,降低STW的时间(200ms)
- G1(10ms)
- ZGC (1ms) PK C++
- Shenandoah
- Eplison
1.8默认的垃圾回收:PS + ParallelOld