命令、运行时数据区域"/>
JVM~基本命令、运行时数据区域
JVM在工作中是非常常用的,JVM调优更是尤为重要
JVM基础使用和基础面试题解析
- jinfo 详细使用
- 运行时数据区域、面试题
- 1.The pc Register 程序计数器
- 2.Java Virtual Machine Stacks 栈
- 3. Heap
- 4. Method Area/Metaspace
- 5. Run-Time Constant Pool
- 6. Native Method Stacks本地方法栈
- Area: 不属于JVM的区域,堆外内存
- String相关面试题
1)标准:稳定
2)X:相对变化较少的
3)XX:JVM调优XX 又分为两种类型:a) boolean 类型的 -XX:[+/-] paramName+表示启动的状态 -:表示禁用的状态-XX:+UseG1GC -XX:-UseG1GCjps ==> 查看pidjinfo -flag ParamName -pidb) 非boolean类型的-XX:name = value
Boolean类型
参数使用示例:先用JPS查看进程,然后查看信息发现没启用,然后在加上参数再次查看发现已经启用参数
D:\develop\java\jdk\bin>jinfo -flag PrintGCDetails 20124
-XX:-PrintGCDetailsD:\develop\java\jdk\bin>jps
18776 TestJVMAppD:\develop\java\jdk\bin>jinfo -flag PrintGCDetails 18776
-XX:+PrintGCDetailsD:\develop\java\jdk\bin>jinfo -flag MetaspaceSize 15192
-XX:MetaspaceSize=21807104-XX:MetaspaceSize=128mD:\develop\java\jdk\bin>jinfo -flag MetaspaceSize 5272
-XX:MetaspaceSize=134217728将MetaspaceSize 改成128M新生代到老年代中回收的次数15次
D:\develop\java\jdk\bin>jinfo -flag MaxTenuringThreshold 5272
-XX:MaxTenuringThreshold=15
JDK7:永久代的概念
JDK8:Metaspace
jinfo 详细使用
格式:
jinfo -flag ParamName PID
jinfo -flags PID
查看使用帮助:
D:\develop\java\jdk\bin>jinfo
Usage:jinfo [option] <pid>(to connect to running process)jinfo [option] <executable <core>(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)where <option> is one of:-flag <name> to print the value of the named VM flag-flag [+|-]<name> to enable or disable the named VM flag-flag <name>=<value> to set the named VM flag to the given value-flags to print VM flags-sysprops to print Java system properties<no option> to print both of the above-h | -help to print this help message
查看堆的大小:
D:\develop\java\jdk\bin>jinfo -flag InitialHeapSize 11196
-XX:InitialHeapSize=534773760
查看所有参数
D:\develop\java\jdk\bin>jinfo -flags 11196
Attaching to process ID 11196, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=534773760 -XX:MaxHeapSize=8550088704 -XX:MaxNewSize=2850029568 -XX:MetaspaceSize=134217728 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=178257920 -XX:OldSize=356515840 -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -XX:+PrintGCDetails -XX:MetaspaceSize=128m -javaagent:D:\develop\idea\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=65517:D:\develop\idea\IntelliJ IDEA 2019.3.2\bin -Dfile.encoding=UTF-8
PrintFlags 系列
-XX:PrintFlagsInitial
-XX:PrintFlagsFinal
java -XX:+PrintFlagsInitial
下面的=表示未被修改,:=表示已经被修改的,
生产上面一般写到文件里面取,直接从文件里面找即可
D:\develop\java\jdk\bin>java -XX:+PrintFlagsInitial
[Global flags]uintx AdaptiveSizeDecrementScaleFactor = 4 {product}uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}uintx AdaptiveSizePausePolicy = 0 {product}uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}intx AllocateInstancePrefetchLines = 1 {product}intx AllocatePrefetchDistance = -1 {product}。。。。。
几个特殊的XX参数
- -Xms:JVM堆的最小值 -XX:InitialHeapSize
- -Xmx:JVM堆的最大值 -XX:MaxHeapSize 上面这两个值一般设置成相同
- -XXss -XX:ThreadStackSize
D:\develop\java\jdk\bin>jinfo -flag InitialHeapSize 18944
-XX:InitialHeapSize=534773760D:\develop\java\jdk\bin>jinfo -flag MaxHeapSize 18944
-XX:MaxHeapSize=8550088704总内存大小memory:32G
-XX:MaxHeapSize=8550088704 8G 1/4-XX:InitialHeapSize=534773760 500M 1/64D:\develop\java\jdk\bin>jinfo -flag ThreadStackSize 19460
-XX:ThreadStackSize=0
运行时数据区域、面试题
1)JVM 创建时创建,退出时销毁
2)每个Thread独有,Thread创建时创建,Thread退出时销毁
有些区域是共享的,有些区域是独享的
运行时数据区(一定要看官网)
运行时数据区域主要分为以下几个方面
- 1.The pc Register 程序计数器
- 2.Java Virtual Machine Stacks
- 3.Heap
- 4.Method Area
- 5.Run-Time Constant Pool
- 6.Native Method Stacks
1.The pc Register 程序计数器
当前线程所执行的字节码的行号指示器,占用一小块内存
字节码文件:在.class 文件里面是有行号的,来表示当前的字节码的位置
记录当前线程目前执行到你的代码所对应的那一条字节码指令
每一个线程都有自己的程序计数器,专门用于记录本线程的字节码执行的位置信息
2.Java Virtual Machine Stacks 栈
存储方法里面的一些局部变量,每一个线程私有一个,在线程创建时候创建
frames:栈帧,栈里面存储栈帧,局部变量、动态链接,方法的值是存储在栈帧里面的
当一个方法被调用的时候frame栈帧会创建,方法销毁时候销毁,调用方法时候会为每一个方法创建Frame入栈
方法执行完毕后,Frame出栈,
StackOverFlowError:死循环的时候容易出现此异常,或者递归的时候
3. Heap
所有的JVM的线程共享的一块区域,
创建的对象就存放在堆内存中
OOM OutOfMemoryError 不停的new 时候的大小超过Heap的大小
4. Method Area/Metaspace
所有JVM线程共享的
class文件加载进来的东西比如常量、字段、方法数据、方法代码、构造器放在这里
可能抛出OOM异常
5. Run-Time Constant Pool
6. Native Method Stacks本地方法栈
Java的Object里面的方法是native的,是调用本地操作系统里面的方法,或者一些类库
Native方法存在这里
可能抛出StackOverFlowError/OOM
Area: 不属于JVM的区域,堆外内存
NIO里面创建对象,直接操作内存空间的,性能会好些,大量去操作,自己不要直接操作堆外内存
String相关面试题
对于基本类型比如:int、long、和他们的包装类型,是放在常量池里面的
Integer类型的范围是-127 到 128 超过了就会重新创建对象,比如
Integer a = 50;Integer b = 50; a==b 为True
Integer a = 150;Integer b = 150; a==b 为False
但是对于Double类型,Double底层源码都是new的,并没有范围的概念
Double c = 10.1D;Double d= 10.1D; c==b 为False
更多推荐
JVM~基本命令、运行时数据区域
发布评论