JVM垃圾回收问答

 

为什么要有垃圾回收 

内存资源是有限的,当所需内存不能满足时,需要把不再使用的对象清除掉,否则JVM将无法运行下去

 

 

怎么判断对象是否是垃圾

判断对象是否是垃圾,有两种方式:1是标记引用计数,2是根部可达,第一种存在环形引用问题,第二种是JVM目前采用的方式

在根部可达中,哪些对象可以作为根

1栈中引用的对象,2方法区变量,3方法区常量,4JNDI中引用的对象

 

垃圾回收的方式有哪些,以及各自的优缺点

1复制:适用于大部分对象都不再引用

2 标记清除:效率相对低,容易产生碎片

3标记清除整理:效率相对低,不会产生碎片

4并发标记清除:产生碎片,效率相对高些,减少业务暂停时间

 

是不是内存分配的越大,效果就越好

对于需要减少暂停业务,内存分配的越大,垃圾回收的时间就越长,业务暂停时间就越长

对于需要充分发挥吞吐量的业务,内存分配的大,垃圾回收时间随长,但整体效率要高

内存分配是一个不断调整、观察的过程,不是一蹴而就、一成不变的

 

为什么要分代

由于存在大部分对象存活时间都很短,根据不同对象存活时间分割在不通区域,提高回收效率,降低回收时间

 

新生代为什么要有Eden、S0、S1,而不采用两个大小一样的内存分配区域

 增加内存空间率用率,减少垃圾回收次数

 

有什么途径来优化垃圾回收

对应用造成卡顿的主要来自于老年代的回收,对程序开发者来说,减少不必要的对象的创建,对于JVM可以使用并行垃圾回收和CMS(并发标记清除)收回器;

对于非逃逸对象,可以采用栈来进行存储,减少垃圾回收次数;

对于垃圾回收,还需要进行内存分配参数的调整,这是一个长时间观察和不断改变的过程。

栈和堆有什么区别

栈:先进后出,堆:先进先出

栈:存储在一级缓存或者二级缓存上,堆:存储在内存上

栈:存储的是cpu要执行的指令和数据,堆:只存储数据

栈:存储空间较小,价格相对贵一些,堆:存储空间大,价格相对便宜

 

为什么不把所有的非逃逸对象分配到栈上

 栈:存储空间较小,价格相对贵一些

posted on 2018-09-12 15:21  李雷  阅读(129)  评论(0编辑  收藏  举报

导航