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)给对象赋予了新值,即重新分配了内存空间。
一块内存空间符合了垃圾收集器的收集原则,并不意味着这块内存就一定会被垃圾收集器收集。
垃圾回收不是一个独立的平台
A.程序可以任意指定释放内存的时间
B.JAVA程序不能依赖于垃圾回收的时间或者顺序
C.程序可明确地标识某个局部变量的引用不再被使用
D.程序可以显式地立即释放对象占有的内存
解释:java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。
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)中移除对象而完成的。