面试总结----java虚拟机

在面试过程中,java虚拟机被问到的概率非常大,应该是每场面试必问的问题。

下面从JVM内存结构、垃圾收集、常见异常、参数设置等四个方面来总结java虚拟机。

1、JVM内存结构.
从两个层面划分,第一个层面划分具体如下图所示:
 


a.程序计数器,即记录每个线程执行的字节码的行号,为线程切换时返回或退出提供服务。
b.java虚拟机栈,保存方法中的局部变量表、操作数栈等信息。
c.native方法栈,为native方法提供服务。
d.堆,存储对象或者数组。垃圾收集的主要区域。
e.方法区,保存类信息(魔数、主次版本号等)、常量、静态变量等。包含运行时常量池,包含符号引用等信息。

  第二个层面划分如下图所示:
 

  a.Young,即为年轻代,新生对象一般都是在这个区域,因为这个区域中的对象很年轻,因此称此区域为年轻代。这个区域可细分为Eden区,s0和s1区,s即为survivor,对象一般在Eden区域产生,垃圾回收时,在s0和s1中来回复制。
  b.Old区,存放老对象和大对象。对象在Young中产生后,经过指定次数的垃圾回收后仍然幸存,则这个对象会被移动到Old区域,如果新产生的对象较大,在Young区域中存放不下,则直接存放在Old区域。
  c.Perm区域存放类信息,String.intern()方法产生的常量等。
一般情况下,Old区域必Young区域大很多,Eden与s0或s1的比例为8。

2、垃圾回收
  java虚拟机采用分代垃圾回收机制来回收垃圾。java对象有一个特点,大多数对象会在很短的时间内死亡,之后很少一部分对象会在长时间内存活。因此,针对Young区域和Old区域采取不用的垃圾回收机制和算法。垃圾回收的前提是对象已经死亡,怎么判断对象死亡呢,这里采用根搜索算法(而不是引用计数算法),能作为根的对象有四种:
  a.java虚拟机栈中引用的对象
  b.方法区中类静态属性引用的对象
  c.方法区中常量引用的对象
  d.本地方法栈中引用的对象
不能喝上述四种对象产生关联的对象都会在垃圾回收的时候被回收掉,垃圾回收的被动触发的,而不是主动执行的。
  Young区中的对象死亡的概率很大,而Old区域的对象不容易死亡,因此针对这两个区域的,产生了不同的垃圾回收算法:复制-清除(Young区)、标记-整理、标记-清除(Old区),这里有单线程、多线程并发的垃圾回收算法实现,G1垃圾回收算法为将JVM内存区分为大小相等的若干区域,在指定时间内,回收垃圾最多的区域。

3、常见异常
   除了程序计数器区域外,其他部分都会产生异常,主要分为OOM(OutOfMemoryError)、StackOverFlowError。OOM为无法申请到足够的内存空间时,抛出的错误,StackOverFlowError为方法访问时,方法调用深度超出虚拟机允许的最大深度时抛出的错误。
解决这两个问题,可以设置内存大小和栈深度来解决。

4、参数设置
   a.-Xms和-Xmx来设置堆的最小最大值,一般设置为相等,防止堆抖动。
   b.-Xmn来设置Young区域的大小,-XX:SurvivorRatio来设置Eden与S0或S1的比率,-XXInitialSurvivorRatio来设置Young与S0或S1的比率。
   c.-XX:MaxPermSize和-XX:PermSize来设置Perm区域的最大和最小值。

这里只是总结了java虚拟机中的极小部分知识。

关于java虚拟机的知识,推荐《深入理解java虚拟机:JVM高级特性与最佳实践》(周志明)



猜你喜欢

转载自yangjianzhouctgu.iteye.com/blog/2211993
今日推荐