三、JVM
1.JVM堆的基本结构。
堆可以细分为:新生代(Young Generation ) 和老年代(Tenured Generation) ;
也可分为: Eden空间,From Survivor 空间、 To Survivor空间;
2.JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程?
- 引用计数法(简单高效,但是无法处理循环引用,jvm中不采用)
- 可达性分析算法
- 标记清除算法
- 复制算法
- 标记整理算法
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。
目录列表
一、数据结构与算法基础
二、Java基础
三、JVM
四、多线程/并发
五、Linux使用与问题分析排查
六、框架使用
七、数据库相关
八、网络协议和网络编程
九、Redis等缓存系统/中间件/NoSQL/一致性Hash等
十、设计模式与重构
本文是针对知乎文章《成为Java顶尖程序员,先过了下面问题》的解答