JVM

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、软引用和弱引用的使用场景(软引用可以实现缓存,弱引用可以用来在回调函数中防止内存泄露);

推荐阅读更多精彩内容