请谈谈你对JVM的理解?java8的虚拟机有什么更新?
什么事OOM?是什么StackOverflowError?有哪些方法分析?
JVM的常用参数调优你知道哪些?
谈谈JVM中,对类加载器的认识?

对于JDK自带的JVM监控和性能分析工具用过哪些?一般怎么用

是什么

1610803597220.png

命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

性能分析工具

1610803597261.png

你平时工作用过的JVM常用基本配置参数有哪些?

基础知识

1610803594654.png

case

1610803594714.png

常用参数

-Xms

初始化大小内存,默认为物理内存1/64

等价于-XX:InitialHeapSize

-Xmx

最大分配内存,默认物理内存的1/4

等价于-XX:MaxHeapSize

-Xss

设置单个线程栈的大小,一般默认为512K~1024K

等价于-XX:ThreadStackSize

  1. -XX:ThreadStackSize = 0 , 表示使用默认512K~1024K
  2. -XX:ThreadStackSize != 0 , 表示使用自己设置的

-Xmn

设置年轻代大小,一般不需要改动

-Xms128m -Xmx4096m -Xss1024k -XX:MetaSpaceSize=512m -XX:+PrintCommandFlags -XX:+PrintGCDetails -XX:+UseSerialGC

-XX:MetaspaceSize

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。

不过元空间与永久代之间最大的区别在于:

  • 永久代在堆里面
  • 元空间并不在虚拟机中,而是使用本地内存。
    因此,在默认情况下,元空间的大小仅受本地内存限制

eg:

Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal

初始值约21M,也就是说只占用本地内存的21M,如果你频繁的new对象,有可能就会把元空间撑爆从而发生元空间异常,因此需要调大一些

-XX:+PrintGCDetails

GC

1610803594823.png

FullGC

1610803594952.png

-XX:SurvivorRatio (了解)

1610803595040.png

1610803595136.png

-XX:NewRatio (了解)

1610803595185.png

-XX:MaxTenuringThreshold (了解)

设置垃圾的最大年龄

1610803595287.png

jvm典型配置案例

  1. -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC

输出结果

  1. -XX:InitialHeapSize=134217728
  2. -XX:MaxHeapSize=4294967296
  3. -XX:MetaspaceSize=536870912
  4. -XX:+PrintCommandLineFlags
  5. -XX:+PrintGCDetails
  6. -XX:ThreadStackSize=1024
  7. -XX:+UseCompressedClassPointers
  8. -XX:+UseCompressedOops
  9. -XX:-UseLargePagesIndividualAllocation
  10. -XX:+UseSerialGC
  11. HelloGC
  12. Heap
  13. def new generation total 39296K, used 2796K [0x00000006c0000000, 0x00000006c2aa0000, 0x0000000715550000)
  14. eden space 34944K, 8% used [0x00000006c0000000, 0x00000006c02bb048, 0x00000006c2220000)
  15. from space 4352K, 0% used [0x00000006c2220000, 0x00000006c2220000, 0x00000006c2660000)
  16. to space 4352K, 0% used [0x00000006c2660000, 0x00000006c2660000, 0x00000006c2aa0000)
  17. tenured generation total 87424K, used 0K [0x0000000715550000, 0x000000071aab0000, 0x00000007c0000000)
  18. the space 87424K, 0% used [0x0000000715550000, 0x0000000715550000, 0x0000000715550200, 0x000000071aab0000)
  19. Metaspace used 3084K, capacity 4496K, committed 4864K, reserved 1056768K
  20. class space used 335K, capacity 388K, committed 512K, reserved 1048576K
  • -XX:+UseSerialGC : 串行垃圾回收器
  • -XX:+UseParalleGC :并行垃圾回收器请谈谈你对JVM的理解?java8的虚拟机有什么更新?

什么事OOM?是什么StackOverflowError?有哪些方法分析?
JVM的常用参数调优你知道哪些?
谈谈JVM中,对类加载器的认识?

你说你做过JVM调优和参数配置,请问如何查看JVM系统默认值

JVM的参数类型

标配参数 (了解)

  1. -version
  2. -help
  3. java -showversion

x参数(了解)

  1. -Xint:解释执行
  2. -Xcomp:第一次使用就编译成本地代码
  3. -Xmixed:混合模式

xx参数(重点)

Boolean类型

公式

-XX:+或者-某个属性值
+表示开启 -表示关闭

如何查看一个正在运行中的java,它的jvm参数是否开启?具体参数是多少

jps: 查看java后台进程
jinfo: 正在运行的java程序后台信息

eg:jinfo -flag PrintGCDetails 进程号

case

是否打印GC收集细节

  • -XX:-PrintGCDetails —> 没有开启
  • -XX:+PrintGCDetails —-> 开启

eg: 以IDEA为准,演示没有加JVM参数 -XX:+PrintGCDetails

1610803593941.png

  • 编辑配置,开启GC收集细节

1610803593974.png

1610803594023.png

是否使用串行垃圾回收器

  • -XX:-UseSerialGC
  • -XX:+UseSerialGC

KV设值类型

公式

-XX:属性key=属性值value

Case

-XX:MetaspaceSize=128m : 元空间大小
-XX:MaxTenuringThreadhold=15

1610803594058.png

1610803594103.png

jinfo举例,如何查看当前运行程序的配置

公式
jinfo -flag 配置项 进程编号

  • case1

1610803594172.png

  • case2

1610803594282.png

Non-default Vm: JVM做的
Command line: 人工添加的

  • case3

1610803594395.png

JVM的XX参数之XmsXmx坑题

两个经典参数:-Xms和-Xmx

这个你如何解释?

-Xms:等价于-XX:InitialHeapSize
-Xmx:等价于-XX:MaxHeapSize

盘点家底查看JVM默认值

-XX:+PrintFlagsInitial

作用

主要查看初始默认

公式

  1. java -XX:+PrintFlagsInitial -version
  2. java -XX:+PrintFlagsInitial

1610803594439.png

-XX:+PrintFlagsFinal

作用

主要查看修改更新

公式

  1. java -XX:+PrintFlagsFinal -version

1610803594473.png

:= 和 =区别

= : jvm默认加载的
:= : jvm或者用户修改过的

PrintFlagsFinal举例,运行java命令的同时打印出参数

  • 初始元空间大小,注意这时候没有 :=,说明是jvm默认值
    uintx MetaspaceSize = 21807104
  • 运行java 修改元空间大小

1610803594503.png

1610803594537.png

运行java的时候修改元空间大小为512M

-XX:+PrintCommandLineFlags

作用

打印命令行参数

公式

java -XX:+PrintCommandLineFlags -version

1610803594576.png