JVM垃圾回收问答
Posted lilei2blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM垃圾回收问答相关的知识,希望对你有一定的参考价值。
为什么要有垃圾回收
内存资源是有限的,当所需内存不能满足时,需要把不再使用的对象清除掉,否则JVM将无法运行下去
怎么判断对象是否是垃圾
判断对象是否是垃圾,有两种方式:1是标记引用计数,2是根部可达,第一种存在环形引用问题,第二种是JVM目前采用的方式
在根部可达中,哪些对象可以作为根
1栈中引用的对象,2方法区变量,3方法区常量,4JNDI中引用的对象
垃圾回收的方式有哪些,以及各自的优缺点
1复制:适用于大部分对象都不再引用
2 标记清除:效率相对低,容易产生碎片
3标记清除整理:效率相对低,不会产生碎片
4并发标记清除:产生碎片,效率相对高些,减少业务暂停时间
是不是内存分配的越大,效果就越好
对于需要减少暂停业务,内存分配的越大,垃圾回收的时间就越长,业务暂停时间就越长
对于需要充分发挥吞吐量的业务,内存分配的大,垃圾回收时间随长,但整体效率要高
内存分配是一个不断调整、观察的过程,不是一蹴而就、一成不变的
为什么要分代
由于存在大部分对象存活时间都很短,根据不同对象存活时间分割在不通区域,提高回收效率,降低回收时间
新生代为什么要有Eden、S0、S1,而不采用两个大小一样的内存分配区域
增加内存空间率用率,减少垃圾回收次数
有什么途径来优化垃圾回收
对应用造成卡顿的主要来自于老年代的回收,对程序开发者来说,减少不必要的对象的创建,对于JVM可以使用并行垃圾回收和CMS(并发标记清除)收回器;
对于非逃逸对象,可以采用栈来进行存储,减少垃圾回收次数;
对于垃圾回收,还需要进行内存分配参数的调整,这是一个长时间观察和不断改变的过程。
栈和堆有什么区别
栈:先进后出,堆:先进先出
栈:存储在一级缓存或者二级缓存上,堆:存储在内存上
栈:存储的是cpu要执行的指令和数据,堆:只存储数据
栈:存储空间较小,价格相对贵一些,堆:存储空间大,价格相对便宜
为什么不把所有的非逃逸对象分配到栈上
栈:存储空间较小,价格相对贵一些
以上是关于JVM垃圾回收问答的主要内容,如果未能解决你的问题,请参考以下文章