标签:
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)给对象赋予了新值,即重新分配了内存空间。
一块内存空间符合了垃圾收集器的收集原则,并不意味着这块内存就一定会被垃圾收集器收集。
垃圾回收不是一个独立的平台
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;
总结内存泄漏原因(一句话):保留下来却永远不再使用的对象的引用。
解决内存泄漏的方法:
将对象字段设置为null或者从集合(collection)中移除对象儿完成。
标签:
原文地址:http://www.cnblogs.com/GumpYan/p/5737460.html