php面试垃圾回收怎么答,面试-垃圾回收详解

Java垃圾回收详解

GC(Garbage Collection)的历史比java还要久远,1960年诞生的Lisp语言当时就在考虑三个问题:

哪些内存需要回收

什么时候回收

如何回收

下面就分别回答这三个疑问,这也是Java面试中常考的知识点

JVM简介

先简单看一下JVM运行时候的内存分布,看起来很复杂,但是一般就简单记成堆(分成新生代和老生代,新生代又分成eden和survivor,后续会讲到)、栈、方法区(当然还有其它,只是为了方便记忆)可以通过一行代码体现出来

Object object = new Object();

在这里,Object object是在栈中, new Object()在堆中申请,而一些类型信息会存储到方法区中。这也对于了下面这个图:

format,png

GC三个问题

介绍完上面的基本名词,下面就可以回答GC的三个问题了。

哪些内存需要回收

在GC工作流程中,为防止内存的浪费,GC有两种策略来回收内存

- PC:程序计数器

 引用了对象+1,引用失效-1,虽然简单高效,但是因为不能解决大部分对象之间循环引用的问题,所以大部分JVM没有采用这种方法。

- 可达性分析算法

 简单来说,就是自顶向下不断搜索引用,判断对象是否需要回收,具体有:堆,栈,方法区这些。

什么时候回收

大多数情况下,在eden空间不足的情况下,就会触发(eden在上面有),jdk1.6之前策略都不同,这里我们不考虑老版本了。

如何回收

新生代和老生代都在堆中。

-新生代GC:大部分java对象创建回收更新快

-老生代GC:长期存在的对象,会进入老生代,所以一般避免大对象(长字符,长数组等。)

内存泄漏和内存溢出

一般在Java内存分配中也有两种情况,叫内存泄漏和内存溢出

内存泄漏:是指为一个对象分配内存之后,在对象已经不在使用时未及时的释放,导致一直占据内存单元,使实际可用内存减少,就好像内存泄漏了一样

内存溢出:通俗的说就是内存不够用了,比如在一个无限循环中不断创建一个大的对象,很快就会引发内存溢出

小结

主要介绍了GC中的流程和面试常见的三个问题,基本上内存分配和各类名词都介绍到了,具体详细流程可能更复杂,这里不做深入探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值