第一章:为什么要讲JVM
第二章:Windows机器上测试
第三章:JVM运行时的数据区
面试相关肯定跑不了:考验基本功、参数监控、性能调优
本地Windows上肯定都安装了jdk,本次测试使用jdk1.8,和jdk1.7是有很大区别的。
https://docs.oracle.com/javase/specs/jvms/se8.html/index.html
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)
Java是一种解释型、编译型的语言呢?
解释型不会把java代码转为本地代码,编译型是第一次会把java转为本地代码。
X参数还分为boolean和非boolean,我们在讲Hive的时候,set key = value
jdk7到jdk8发生了什么样的变化?
JDK7:永久代
JDK8:Metaspace
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)
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)
新建包,新建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、如何开启这个参数:
重新运行一遍输出程序:
再去到控制台窗口中,查看发现这个参数被开启了。
总结:
jinfo -flag MetaspaceSize 3768
C:\Program Files (x86)\cmder
λ jinfo -flag MetaspaceSize 3768
-XX:MetaspaceSize=21807104
还是在Edit Configurations中,
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
直接在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
PrintFlags系列参数:
java -XX:PrintFlagsInitial
java -XX:PrintFlagsFinal
= 默认值
:=修改过的
-Xms: min -XX:InitialHeapSize
-Xmx: max -XX:MaxHeapSize
-Xss -XX:ThreadStackSize
默认堆内存:256M 是总内存的1/64
最大堆内存:4070M 是总内存的1/4
问题:这两个值是怎么来的呢,默认堆内存是机器总内存的 1/64,最大堆内存是1/4.
为什么此时这个ThreadStackSize参数是0?
小结:最佳实践,生产上最小=最大,怎样去查看名字的参数。
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
PK老师经典话语:
一流企业做标准
二流企业做产品
三流企业做服务
四流企业做项目
待续。。。