您的当前位置:首页正文

成为Java顶尖程序员,先过了下面问题!(二)

来源:华拓网

三、JVM

1.JVM堆的基本结构。

堆可以细分为:新生代(Young Generation ) 和老年代(Tenured Generation) ;
也可分为: Eden空间,From Survivor 空间、 To Survivor空间;

2.JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程?
  1. 引用计数法(简单高效,但是无法处理循环引用,jvm中不采用)
  2. 可达性分析算法
  • 标记清除算法
  • 复制算法
  • 标记整理算法

CMS(Concurrent Mark Sweep)基本流程:

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除
3.JVM有哪些常用启动参数可以调整,描述几个?
参数名 使用说明
Xms 设置 Java 堆的初始化大小
Xmx 设置 Java 堆最大值大小
Xss 设置Java虚拟机栈大小
Xmn 设置年轻代大小
-XX:PermSize 设置持久代(perm gen)初始值
-XX:MaxPermSize 设置持久代最大值
4.如何查看JVM的内存使用情况?

在jdk的bin目录下有
jstat.exe jconsole.exe jvisualvm.exe 等工具可以查看内存状况

5.Java程序是否会内存溢出,内存泄露情况发生?举几个例子。

创建一个大数组就会内存溢出:long[] arr=new long[102410241024];
不关资源,比如数据库连接,打开的文件等,就会出现内存泄漏。

6.你常用的JVM配置和调优参数都有哪些?分别什么作用?

参考第3题

7.JVM的内存结构?

由所有线程共享:方法区,堆。
线程隔离的数据区: 虚拟机栈,本地方法栈,程序计数器。

8.常用的GC策略,什么时候会触发YGC,什么时候触发FGC?

设置安全点,安全区域。

JVM的YGC&FGC
YGC :对新生代堆进行GC。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。
FGC :全堆范围的GC。默认堆空间使用到达80%(可调整)的时候会触发FGC。以我们生产环境为例,一般比较少会触发FGC,有时10天或一周左右会有一次。

对YGC的 触发时机,相当的显而易见,就是eden空间不足, 这时候就肯定会触发ygc

对于FGC的触发时机, old空间不足, 和perm的空间不足, 调用system.gc()这几个都比较显而易见,就是在这种情况下, 一般都会触发GC。