1、为什么JVM调优经常会将-Xms和-Xmx参数设置成一样;
针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
2、Java内存模型,方法区存什么;
3、类的基本信息、常量、静态变量、编译后的代码
4、CMS垃圾回收过程;
5、Full GC次数太多了,如何优化;
full gc频繁说明old区很快满了。
如果是一次fullgc后,剩余对象不多。那么说明你eden区设置太小,导致短生命周期的对象进入了old区。
如果一次fullgc后,old区回收率不大,那么说明old区太小。
6、直接内存如何管理的;
Minor GC与Full GC分别在什么时候发生?什么时候触发Full GC;
minorGC 针对年轻代 full gc 年轻代老年代同时进行
当Eden区满时,触发Minor GC
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)方法去空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
7、GC收集器有哪些?CMS收集器与G1收集器的特点。
Serial 单线程串行进行垃圾收集,复制算法
ParNew Serial 多线程版本,复制算法,可以与CMS配合
Parallel 重吞吐,复制,多线程
SerialOld 串行 单线程 标记 整理
ParallelOld 标记整理
CMS 标记清除 获取最小停顿时间,特别适合BS使用
G1 布局不是只有新生代活老年代,整个布局逻辑划分region,G1跟踪每个region里垃圾大小,维护优先的列表,根据允许的收集时间,优先收集收集价值最大的Region
年轻代一般用复制算法,老年代一般用标记--算法
9、Java在什么时候会出现内存泄漏;
内存泄漏:程序申请的内存无法释放,始终占用空间,分配的对象可达但是无用,一般是一个很大的对象无法释放,老年代的大对象,内存泄漏最终会导致内存溢出
内存溢出:程序申请内存时,没有内存空间可分配了
10、Java中的大对象如何进行存储;
超过EDEN区一半,直接跳过年轻代进入老年代
11、rt.jar被什么类加载器加载,什么时间加载;
Bootstrap Classloader
12、自己写的类被什么加载,什么时间加载;
13、自己写的两个不同的类是被同一个类加载器加载的吗?为什么?
14、为什么新生代内存需要有两个Survivor区?
15、几种常用的内存调试工具:jmap、jstack、jconsole;
16、dump日志
17、类加载的五个过程:加载、验证、准备、解析、初始化;
18、G1停顿吗,CMS回收步骤,CMS为什么会停顿,停顿时间;
19、栈主要存的数据是什么,堆呢?
20、堆分为哪几块,比如说新生代老生代,那么新生代又分为什么?
Eden survior 1 survior 2
21、软引用和弱引用的使用场景(软引用可以实现缓存,弱引用可以用来在回调函数中防止内存泄露);