GC

1、请简单描述一下垃圾回收器的基本原理?它是马上回收内存吗?怎么去通知虚拟机进行垃圾回收?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆中的所有对象。通过这种方式确定哪些对象是可达的,哪些是不可达的。当GC确定确定一些对象为不可达的时候,GC就有责任回收这些内存空间。
可以马上回收内存。
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

2、Java中内存泄漏

通俗一点说就是不在会被使用的对象内存不能被回收,就是内存泄漏。如果长生命周期的对象持有短时间周期对象的引用,就很快可能出现内存泄露i。Java garbage collector自动释放哪些内存里面程序不再需要的对象,以此避免大多数的程序上下文的内存泄漏。有两类主要的Java内存泄漏:
1.不再需要的对象引用
2.未释放的系统资源
1.1非必要对象引用
Java代码常常保留对于不再需要的对象引用,并且这阻止了内存的垃圾收集器的工作。Java对象通常被其它对象包含引用,为此一个单一对象可以保持整个对象树在内存中,会导致如下问题:
1.1.1在向数组添加对象以后遗漏了对于他们的处理。
1.1.2直到我再次使用对象的时候都不释放引用。比如一个菜单指令可以插件一个对象实例引用并且不是放便于以后再次调用的时候使用,但是也许永远不会发生。
1.1.3在其他引用依然需要旧有状态的时候,贸然修改对象状态。比如为了在一个文本文件里面保存一些属性而是用一个数组。诸如字符个数等字段在不在需要的时候依然保留在内存中。
1.1.4允许一个长久执行的线程所引用的对象。设置引用为NULL也没用,因为在线程退出和空闲之前,对象不会被收集释放。
2.1未释放的系统资源
Java方法可以定位Java实例以外的堆内存,例如针对视窗和位图的内存资源;Java通常通过JNI调用c/c++子程序定位这些资源

3、垃圾回收的优点以及原理

Java语言中一个显著的特点就是引入了垃圾回收机制,使得c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不爱需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不在具有“作用域”的概念,只有对象的引用才有作用域。垃圾回收可以有效的防止内存泄漏,有效地使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

4、什么是GC?为什么要开发GC?

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

5、简述一下GC算法

1.GC的对象是对空间和永久区(方法区)
2.GC算法包含:引用计数法,标记清除法,标记压缩,复制算法。
2.1引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的计数器加1.当引用失效的时候,引用计数器减1.只要对象A的引用计数器的值为0,则对象A就不可能在被使用
2.2标记清除算法是现代垃圾回收的思想基础。标记清除算法将垃圾回收分为两个阶段:标记阶段清除阶段。在标记阶段,标记所有从根节点开始的可达对象。因此未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
2.3标记整理算法是在标记清除的基础上做了一些优化。首先也是从根节点开始对所有可达对象做一次标记,但之后它并不简单的清除未标记的对象,他是将所有标记的对象压缩到内存的一端,之后清理边界外所有的空间。这种方法避免了碎片的产生,又像复制算法不需要两块相同的内存空间,性价比高。
2.4复制算法是一种相对高效的回收方法不适用于存活对象较多的场合,如老年代。它是将原有的内存空间一分为二,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存中,然后清除之前内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值