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)中移除对象而完成的。

原文地址:https://www.cnblogs.com/GumpYan/p/5737460.html