Java面试之jvm(今日更新调优工具)

1.jvm主要组成部分及其作用?

流程:首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

1.类加载器(Class Loader):加载类文件到内存。Class loader只管加载,只要符合文件结构就加载,至于能否运行,它不负责,那是有Exectution Engine 负责的。

2.执行引擎(Execution Engine):也叫解释器,负责解释命令,交由操作系统执行。

3.本地库接口(Native Interface):本地接口的作用是融合不同的语言为java所用

4.运行时数据区(Runtime Data Area):(有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户进程的启动和结束而创建和销毁。)

1)。堆是java对象的存储区域,任何用new字段分配的java对象实例和数组,都被分配在堆上,java堆可用-Xms和-Xmx进行内存控制,jdk1.7以后,运行时常量池从方法区移到了堆上。 

新生代:老年代 = 1:2

Eden:s1: s2=8:1:1(s1和s2是幸存者区,Eden是伊甸园区)

(2)方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

  误区:方法区不等于永生代

  很多人原因把方法区称作“永久代”(Permanent Generation),本质上两者并不等价,只是HotSpot虚拟机垃圾回收器团队把GC分代收集扩展到了方法区,或者说是用来永久代来实现方法区而已,这样能省去专门为方法区编写内存管理的代码,但是在Jdk8也移除了“永久代”,使用Native Memory来实现方法区。

(3)虚拟机栈:虚拟机栈中执行每个方法的时候,都会创建一个栈桢用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

(4)本地方法栈:与虚拟机发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

(5)程序计数器。指示Java虚拟机下一条需要执行的字节码指令。

2.说一下堆与栈的区别。

堆内存存储的是实体栈内存存储的是局部变量
堆内存更新速度慢栈内存的更新速度快(因为局部变量生命周期很短)
堆内存存放的实体会被垃圾回收机制不定时的回收栈内存存放的变量生命周期一旦结束就会被释放

3.栈和队列的区别?

队列
队列和栈都是被用来预储存数据的
栈和队列相似,但它允许对元素进行先进后出进行检索队列允许先进先出检索数据,但也有例外的情况,Deque接口允许从两端检索数据

4.提到了垃圾回收机制,就说一下下垃圾收集机制(在什么时候,对什么,做了什么)?

在触发GC(垃圾回收GC算法)的时候,具体如下,这里只说常见的 Young GC 和 Full GC。

Young GcFull Gc
当新生代中的 Eden 区没有足够空间进行分配时会触发Young GC。当准备要触发一次Young GC时,如果发现统计数据说之前Young GC的平均晋升大小比目前老年代剩余的空间大,则不会触发Young GC而是转为触发Full GC。(通常情况)如果有永久代的话,在永久代需要分配空间但已经没有足够空间时,也要触发一次Full GC。
System.gc()默认也是触发Full GC。
heap dump(Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息)GC默认也是触发Full GC。
CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。

对什么?

对那些JVM认为已经“死掉”的对象。即从GC Root开始搜索,搜索不到的,并且经过一次筛选标记没有复活的对象。

做了什么?

对这些JVM认为已经“死掉”的对象进行垃圾收集,新生代使用复制算法,老年代使用标记-清除和标记-整理算法。

5. 怎么判断对象是否可以被回收?

一般有两种方法来判断:

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

6.GC Root有哪些?

在Java语言中,可作为GC Roots的对象包括下面几种:

    虚拟机栈(栈帧中的本地变量表)中引用的对象。
    方法区中类静态属性引用的对象。
    方法区中常量引用的对象。
    本地方法栈中JNI(即一般说的Native方法)引用的对象。

7.垃圾收集有哪些算法,各自的特点?

标记 - 清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它的主要不足有两个:一个是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

复制算法

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半,未免太高了一点。

标记 - 整理算法

复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。

一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

在老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记—清理或者标记—整理算法来进行回收。
8. 说一下 jvm 有哪些垃圾回收器?

Serial:最早的单线程串行垃圾回收器。
Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。
ParNew:是 Serial 的多线程版本。
Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。
Parallel Old 是 Parallel 老生代版本,Parallel 使用的是复制的内存回收算法,Parallel Old 使用的是标记-整理的内存回收算法。
CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。
G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。
9. 详细介绍一下 CMS 垃圾回收器?

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。
10.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1

新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
11. 简述分代垃圾回收器是怎么工作的?

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:

把 Eden + From Survivor 存活的对象放入 To Survivor 区;
清空 Eden 和 From Survivor 分区;
From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。

每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。

老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。
12. 说一下 jvm 调优的工具?

JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

jconsole:用于对 JVM 中的内存、线程和类等进行监控;
jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。
13. 常用的 jvm 调优的参数都有哪些?

-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。

14.介绍一个查看cpu占用率等参数的工具,是jdk自带的。具体使用方法后续会写。

jps 查看 java 进程 ID

[hadoop@node1 ~]$ 
You have mail in /var/spool/mail/root
[hadoop@node1 ~]$ jps
26276 nimbus
27238 Logstash
31017 RunJar
13579 AzkabanExecutorServer
7307 Jps
27180 Logstash
22799 NameNode
23025 SecondaryNameNode
23284 ResourceManager
19444 AzkabanWebServer
18613 core
26934 Elasticsearch
14166 HMaster
17688 Main

使用jstat查看gc的信息

jstat -gc 22799 1s 30

每秒获取一次gc信息获取三十次22799为java进程ID

参数说明:S0C:第一个幸存区的大小
  S1C:第二个幸存区的大小
  S0U:第一个幸存区的使用大小
  S1U:第二个幸存区的使用大小
  EC:伊甸园区的大小
  EU:伊甸园区的使用大小
  OC:老年代大小
  OU:老年代使用大小
  MC:方法区大小
  MU:方法区使用大小
  CCSC:压缩类空间大小
  CCSU:压缩类空间使用大小
  YGC:年轻代垃圾回收次数
  YGCT:年轻代垃圾回收消耗时间
  FGC:老年代垃圾回收次数
  FGCT:老年代垃圾回收消耗时间
  GCT:垃圾回收消耗总时间

[hadoop@node1 ~]$ jstat -gc 22799 1s 30
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
3584.0 3584.0  0.0   2560.0 1390592.0 1183261.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183261.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183270.1 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183272.2 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183272.2 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183272.2 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183272.2 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183272.2 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183300.0 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183309.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183309.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183311.4 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639
3584.0 3584.0  0.0   2560.0 1390592.0 1183347.5 1051136.0   443026.8  48384.0 47434.8 5376.0 5138.6  13527  592.237   5     19.403  611.639

jmap -heap 22799

[hadoop@node1 ~]$ jmap -heap 22799
Attaching to process ID 22799, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12

using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4294967296 (4096.0MB)
   NewSize                  = 174587904 (166.5MB)
   MaxNewSize               = 1431306240 (1365.0MB)
   OldSize                  = 349700096 (333.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1423966208 (1358.0MB)
   used     = 1230129784 (1173.143180847168MB)
   free     = 193836424 (184.85681915283203MB)
   86.38756854544683% used
From Space:
   capacity = 3670016 (3.5MB)
   used     = 2621488 (2.5000457763671875MB)
   free     = 1048528 (0.9999542236328125MB)
   71.42987932477679% used
To Space:
   capacity = 3670016 (3.5MB)
   used     = 0 (0.0MB)
   free     = 3670016 (3.5MB)
   0.0% used
PS Old Generation
   capacity = 1076363264 (1026.5MB)
   used     = 453659472 (432.6433868408203MB)
   free     = 622703792 (593.8566131591797MB)
   42.14743174289531% used

18933 interned Strings occupying 1911424 bytes.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值