若泽数据公开课-JVM01

第一章:为什么要讲JVM

第二章:Windows机器上测试

  • 2.1 Servers模式和Client模式
  • 2.2 JVM三种类型参数
  • 2.3 在IDEA中测试boolean类型
  • 2.4 在IDEA中测试非boolean类型
  • 2.5 jinfo命令帮助
  • 2.6 PrintFlags系列参数
  • 2.7 Xmx Xms参数

第三章:JVM运行时的数据区

第一章:为什么要讲JVM

面试相关肯定跑不了:考验基本功、参数监控、性能调优

  • 不管是Hadoop系列还是Spark,OOM是什么东西:针对不同异常信息采用不同的解决方案
  • GC模块,不同的垃圾收集器拥有不同的特性

本地Windows上肯定都安装了jdk,本次测试使用jdk1.8,和jdk1.7是有很大区别的。

https://docs.oracle.com/javase/specs/jvms/se8.html/index.html

2.1 Servers模式和Client模式

JVM中有两个模式:Server和Client,Client模式默认是32位的

现在的机器默认都是Server模式:

C:\Users\Administrator>java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

mixed mode:

Java是一种解释型、编译型的语言呢?
解释型不会把java代码转为本地代码,编译型是第一次会把java转为本地代码。

2.2 JVM三种类型参数

  1. 标准 从jdk发布到现在的版本,这些参数并没有发生太多的变化,比较稳定:java -version
  2. X 相对的变化较少的
  3. XX JVM调优最为重要的

X参数还分为boolean和非boolean,我们在讲Hive的时候,set key = value

  • boolean:-XX:[+/-] name
  • -XX: +UseG1GC -XX:-UseG1GC +表示启用,-表示禁用

问题:

jdk7到jdk8发生了什么样的变化?
JDK7:永久代
JDK8:Metaspace

interpreted mode:

C:\Program Files (x86)\cmder
λ java -Xint -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, interpreted mode)

compiled mode:

C:\Program Files (x86)\cmder
λ java -Xcomp -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, compiled mode)

2.3 在IDEA中测试boolean:

新建包,新建JvmDemo类:

1、单纯只打印一句话的话,直接就结束了,我们让线程睡一会
package jvm;

public class JvmDemo {
public static void main(String[] args) throws InterruptedException {
System.out.println(“若泽数据欢迎您”);

    Thread.sleep(100000);
}

}

2、在控制台上使用jps命令查看:
C:\Program Files (x86)\cmder
λ jps
12752 Launcher
13744 JvmDemo
10536 Jps
14220
1964 NailgunRunner

3、表示这个参数没有开启
C:\Program Files (x86)\cmder
λ jinfo -flag PrintGCDetails 13744
-XX:-PrintGCDetails

4、如何开启这个参数:
若泽数据公开课-JVM01_第1张图片
若泽数据公开课-JVM01_第2张图片
重新运行一遍输出程序:
再去到控制台窗口中,查看发现这个参数被开启了。
若泽数据公开课-JVM01_第3张图片

总结:

  • 在boolean类型中,使用-XX去设置,使用+、-号来设置或赋值,jps去获取到它的pid;
    jinfo -flag name pid

2.4 在IDEA中测试非boolean:

  • 非Boolean类型中,-XX:name = value

获取Metaspace的大小,目前是20来兆。

jinfo -flag MetaspaceSize 3768

C:\Program Files (x86)\cmder
λ jinfo -flag MetaspaceSize 3768
-XX:MetaspaceSize=21807104

还是在Edit Configurations中,

  • -XX:MetaspaceSize=128M
C:\Program Files (x86)\cmder
λ jinfo -flag MetaspaceSize 2260
-XX:MetaspaceSize=134217728

年龄阈值,默认15(对象被复制的次数)

C:\Program Files (x86)\cmder
λ jinfo -flag MaxTenuringThreshold 2260
-XX:MaxTenuringThreshold=15

2.5 jinfo命令帮助

直接在cmder控制台上输入jinfo查看命令帮助:

  • jinfo -flag InitialHeapSize

    λ jinfo -flag InitialHeapSize 2260
    -XX:InitialHeapSize=268435456

  • jinfo -flags 2260 我们运行当前程序的所有信息

C:\Program Files (x86)\cmder
λ jinfo -flags 2260
Attaching to process ID 2260, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4267704320 -XX:MaxNewSize=1422393344 -XX:MetaspaceSize=134217728 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -XX:+PrintGCDetails -XX:MetaspaceSize=128M -javaagent:D:\intellij idea\IntelliJ IDEA 2018.1\lib\idea_rt.jar=64963:D:\intellij idea\IntelliJ IDEA 2018.1\bin -Dfile.encoding=UTF-8

剖析:Command line中的是在idea中传入的参数

学到此时:学会了两个:
1、jinfo -flag name pid
2、jinfo -flags pid

2.6 PrintFlags系列参数

PrintFlags系列参数:

  • -XX:+PrintFlagsInitial
  • -XX:+PrintFlagsFinal

java -XX:PrintFlagsInitial
java -XX:PrintFlagsFinal
= 默认值
:=修改过的

2.7 几个特殊的XX参数

-Xms: min -XX:InitialHeapSize
-Xmx: max -XX:MaxHeapSize
-Xss -XX:ThreadStackSize

默认堆内存:256M 是总内存的1/64
最大堆内存:4070M 是总内存的1/4

问题:这两个值是怎么来的呢,默认堆内存是机器总内存的 1/64,最大堆内存是1/4.
若泽数据公开课-JVM01_第4张图片

若泽数据公开课-JVM01_第5张图片

抛出问题:

为什么此时这个ThreadStackSize参数是0?
在这里插入图片描述
小结:最佳实践,生产上最小=最大,怎样去查看名字的参数。

第三章:JVM运行时的数据区

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

PK老师经典话语:
一流企业做标准
二流企业做产品
三流企业做服务
四流企业做项目

待续。。。

你可能感兴趣的:(若泽数据公开课-JVM01)