JVM~基本命令、运行时数据区域

编程入门 行业动态 更新时间:2024-10-27 18:25:27

JVM~基本<a href=https://www.elefans.com/category/jswz/34/1771323.html style=命令、运行时数据区域"/>

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~基本命令、运行时数据区域

本文发布于:2023-07-28 20:16:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1298332.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:命令   区域   数据   JVM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!