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

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

问题二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. MySQL学习笔记:like和regexp的区别

    一.like关键字 like有两个模式:_和% _:表示单个字符,用来查询定长的数据 select name from table where name like '陈__'; %:表示0个或多个任意 ...

  2. BFC 从了解到放弃

    最近工作中我突然产生了一个想法,就如我们人类面临的终极问题一般,我从哪里来?我到哪里去?在撸代码进行CSS布局的时候,我会去想,我为什么这么做?,为什么浮动的元素要用overflow?,为什么要用cl ...

  3. Storm(一)Storm的简介与相关概念

    一.Storm的简介 官网地址:http://storm.apache.org/ Storm是一个免费开源.分布式.高容错的实时计算系统.Storm令持续不断的流计算变得容易,弥补了Hadoop批处理 ...

  4. ava包(package)的命名规范,java中package命名规则

    Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...

  5. 本机ip和127.0.0.1的区别

    简介 连接上因特网的每一台计算机都会有一个IP地址, 在linux下可以使用命令ifconfig来查看本机的ip地址(windows为ipconfig), 比如我当前电脑的ip地址为192.168.0 ...

  6. matlab .fig转化成pdf 缺失

    1. 在matlab figure里面,Edit -> Copy Figure 2. 粘贴到ppt中即可

  7. List元素为泛型时的注意事项

    最近的项目赶得非常紧,这节奏跟最近的天气一点也不搭调. 编码的过程,遇到一个关于List的小问题. 在调用List.add(E e)的时候范了一个小毛病,很自然地认为list中存储的是 E  对象的另 ...

  8. Sass 和 SCSS 有什么区别?

    Sass 官网上是这样描述 Sass 的: Sass 是一门高于 CSS 的元语言,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法, ...

  9. 02-c#基础之01-基础语法(二)

    1.变量的存储以及变量的几种类型 变量:用来在计算机当中存储数据. 存储变量的语法: 变量类型 变量名: 变量名=值: int number=100: 2.赋值"=" " ...

  10. 【BZOJ 3036】 3036: 绿豆蛙的归宿 (概率DP)

    3036: 绿豆蛙的归宿 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 491  Solved: 354 Description 随着新版百度空间的下线 ...