java中的内存回收机制_Java中的垃圾回收机制&内存管理&内存泄漏

1.

Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存。

为什么呢?

因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所使用的内存。

垃圾收集器是自动运行的,无须显式地请求垃圾收集器,程序运行时,垃圾收集器会不时检查对象的各个引用,并回收无引用对象所占用的内存。

可以调用System类中的静态gc()方法来运行垃圾收集器。

2.

Java语言并不要求JVM有gc,也没有规定gc如何工作。

Java垃圾回收机制是为所有的Java应用程序服务的,而不是为某个特定的进程服务的,因此,任何一个进程都不能命令垃圾回收机制做什么,怎么做,做多少。

Java提供了默认机制终止化该对象来释放资源,这个方法就是finalize();

栗子:

Object sobj=new Object();

Object sobj=null;

Object sobj=new Object();

sobj=new Object();

第几行的sobj符合垃圾回收机制的标准?

答案:第1行和第3行

原因:因为第2行将sobj赋值为null,所以第1行符合。第4行也相当于将sobj赋值为null。

判断一块内存空间是否符合垃圾收集器收集标准的原则:

(1)给对象赋予了空值null,以后再也没有调用过。

(2)给对象赋予了新值,即重新分配了内存空间。

一块内存空间符合了垃圾收集器的收集原则,并不意味着这块内存就一定会被垃圾收集器收集。

垃圾回收不是一个独立的平台

栗子:关于JAVA的垃圾回收机制,下面哪些结论是正确?B

A.程序可以任意指定释放内存的时间

B.JAVA程序不能依赖于垃圾回收的时间或者顺序

C.程序可明确地标识某个局部变量的引用不再被使用

D.程序可以显式地立即释放对象占有的内存

解释:java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。

当对象的引用变量被赋值为null,可能被当成垃圾。

3.Java是如何管理内存的?

Java的内存管理就是对象的分配和释放问题。

在Java中,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆中分配空间。

对象的释放是由gc决定和执行的。对象释放的根本原则就是该对象不再被引用。

也就是说内存分配由程序完成,内存释放由gc完成。

4.内存泄漏

下面给出一个简单的内存泄漏的栗子:

Vector v=new Vector(10);

for(int i=0;i<100;i++){

Object o=new Object();

v.add(o);

o=null;

}

//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。

原因:因为这个对象加入到了Vector中,还必须从Vector中删除

可以再加一句:v=null;

总结引起内存泄漏原因(一句话):保留下来却永远不再使用的对象的引用。

具体原因:(1)全局集合(全局的数据储存库,要有机制使得从储存库中移除不需要的数据)

(2)缓存

(3)classLoder

解决内存泄漏的方法:

将对象字段设置为null或者从集合(collection)中移除对象而完成的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值