问题一什么叫垃圾回收机制

垃圾回收是一种动态存储管理技术它自动地释放不再被程序引用的对象按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象不再被引用的时候内存回收它占领的空间以便空间被后来的新对象使用以免造成内存泄露。

问题二java的垃圾回收有什么特点

JAVA语言不允许程序员直接控制内存空间的使用。内存空间的分配和回收都是由JRE负责在后台自动进行的尤其是无用内存空间的回收操作(garbagecollection,也称垃圾回收)只能由运行环境提供的一个超级线程进行监测和控制。

问题三垃圾回收器什么时候会运行

一般是在CPU空闲或空间不足时自动进行垃圾回收而程序员无法精确控制垃圾回收的时机和顺序等。

问题四什么样的对象符合垃圾回收条件

当没有任何获得线程能访问一个对象时该对象就符合垃圾回收条件。

问题五垃圾回收器是怎样工作的

垃圾回收器如发现一个对象不能被任何活线程访问时他将认为该对象符合删除条件就将其加入回收队列但不是立即销毁对象何时销毁并释放内存是无法预知的。垃圾回收不能强制执行然而Java提供了一些方法如System.gc()方法允许你请求JVM执行垃圾回收而不是要求虚拟机会尽其所能满足请求但是不能保证JVM从内存中删除所有不用的对象。

问题六一个java程序能够耗尽内存吗

可以。垃圾收集系统尝试在对象不被使用时把他们从内存中删除。然而如果保持太多活的对象系统则可能会耗尽内存。垃圾回收器不能保证有足够的内存只能保证可用内存尽可能的得到高效的管理。

问题七如何显示的使对象符合垃圾回收条件

1 空引用 

当对象没有对他可到达引用时他就符合垃圾回收的条件。也就是说如果没有对他的引用删除对象的引用就可以达到目的因此我们可以把引用变量设置为null来符合垃圾回收的条件。

StringBuffer sb = new StringBuffer("hello");

System.out.println(sb);

sb=null; 

2 重新为引用变量赋值

可以通过设置引用变量引用另一个对象来解除该引用变量与一个对象间的引用关系。

StringBuffer sb1 = new StringBuffer("hello");

StringBuffer sb2 = new StringBuffer("goodbye");

System.out.println(sb1);

sb1=sb2;//此时"hello"符合回收条件 

3 方法内创建的对象

所创建的局部变量仅在该方法的作用期间内存在。一旦该方法返回在这个方法内创建的对象就符合垃圾收集条件。有一种明显的例外情况就是方法的返回对象。

public static void main(String[] args) {

   Date d = getDate(); 

   System.out.println("d = " + d); 

}

private static Date getDate() {

  Date d2 = new Date(); 

  StringBuffer now = new StringBuffer(d2.toString()); 

   System.out.println(now); 

   return d2; 

}

4 隔离引用

这种情况中被回收的对象仍具有引用这种情况称作隔离岛。若存在这两个实例他们互相引用并且这两个对象的所有其他引用都删除其他任何线程无法访问这两个对象中的任意一个。也可以符合垃圾回收条件。

public class Island {

  Island i;

  public static void main(String[] args) {

    Island i2 = new Island(); 

    Island i3 = new Island();

    Island i4 = new Island();

    i2.i=i3;

    i3.i=i4; 

    i4.i=i2; 

    i2=null; 

    i3=null; 

    i4=null; 

  }

}

问题八垃圾收集前进行清理 ------finalize()方法

java提供了一种机制使你能够在对象刚要被垃圾回收之前运行一些代码。这段代码位于名为finalize()的方法内所有类从Object类继承这个方法。由于不能保证垃圾回收器会删除某个对象。因此放在finalize()中的代码无法保证运行。因此建议不要重写finalize();

Java 内存释放的更多相关文章

  1. Java内存泄露监控工具:JVM监控工具介绍【转】

    jstack?-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...

  2. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  3. java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型

    1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...

  4. Java String内存释放

    Java String内存释放 这是一个坑,Java对于String对象,不进行内存的回收: 处理大数据量的时候,少用String. 与JDK有关系:jdk1.6环境下,内存只占用10M,jdk1.8 ...

  5. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  6. 《深入理解Java内存模型》读书总结

    概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...

  7. java内存泄漏的几种情况

    转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...

  8. Java内存管理及GC算法

    概述 内存划分 虚拟机规范中将内存分为六大部分,分别为PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量及本地方法栈. 1.PC寄存器:线程独占: 2.JAVA虚拟机栈:线程独有:JAVA虚 ...

  9. Java内存模型深度解析:volatile--转

    原文地址:http://www.codeceo.com/article/java-memory-4.html Volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特 ...

随机推荐

  1. ubuntu14.04 使用传统的netcat

    Ubuntu上默认安装的是netcat-openbsd,而不是经典的netcat-traditional. 网上例子很多都是以netcat-traditional为例. sudo apt-get -y ...

  2. overlay实现容器跨主机通信

    本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...

  3. day6 hashlib模块

        hashlib模块 用于加密相关的文件操作,3.X离代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法 __always_sup ...

  4. jenkins发邮件问题

    1.发送邮件不成功 Sending e-mails to: *******@**.cn    Finished: FAILURE 解决办法     jenkins-->configure glo ...

  5. 使用linux mysql客户端建立表时遇到格式解析的问题

    发现在notepad++写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题. 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了. 解决办 ...

  6. mysql (主从复制)(proxy , Amoeba)

    原址如下: http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中 ...

  7. ES6-const注意

    注意要点 const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动.此时,你可能已经想到,简单类型和复合类型 ...

  8. 使用Generator(小黑鸟)反向生成Java项目(IDEA + Maven)

    一.生成Maven项目 二.配置pom.xml文件 通用代码 <properties> <!-- 设置项目编码编码 --> <project.build.sourceEn ...

  9. 启动win8.1时提示 api-ms-win-crt-runtime-l1-1-0.dll丢失

    电脑里没有安装windows的更新KB2999226 到微软官网 https://www.microsoft.com/zh-cn/download/details.aspx?id=49081 下载对应 ...

  10. http远程调用原生get、post模板

    一.get方法 package lq.httpclient.method; import java.io.BufferedReader; import java.io.IOException; imp ...