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

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

问题二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. 使用文本用户界面(NMTUI)进行网络配置

    NetworkManager 文本用户界面(TUI)工具 nmtui 可提供一个文本界面配置由 NetworkManager 控制的网络.该工具包含在 NetworkManager-tui 子软件包中 ...

  2. 将C++ IplImage 图像用C#读取

    如何将C++ IplImage 图像用C#读取  ? 将opencv 的C++程序做成 dll 动态链接库 用C#调用 当然这里需要安装emgucv  ,也可以自己实现这个类. 下面我把实现贴出来给大 ...

  3. thinkphp中常用的模板变量

    在thinkphp中的模板要加载静态文件如css,js等文件时要经常用到模板常量. 假如项目放在/web/shop中,则如下所示对应常量的输出值: 1 2 3 4 5 6 7 8 9 // 不含域名 ...

  4. 匹配合法IP地址的正则表达式

    IPV4地址分为4段,以点号分隔.如192.168.26.13.要对IP地址进行匹配,首先要对其进行分析,分成如下部分,分别进行匹配: 第一步:地址分析,正则初判 0-9      \d 进行匹配 1 ...

  5. 关于table边框,设置了border-collapse:collapse之后,设置border-radius没效果

    做项目遇到边框需要设置圆角,然后发现在设置了border-collapse:collapse之后,border-radius:10px不起作用了,发现这个是css本身的问题,两者不能混在一起使用. 代 ...

  6. MySQL 关于存储过程那点事

    存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令. 简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完 ...

  7. 【基础知识】.Net基础加强 第二天

    第02天 .Net基础加强 1. 封装 1> 属性的封装: 属性封装字段:把变化封装一下,保留用户的使用方式 2> 把方法的多个参数封装成一个对象 3> 将一堆代码封装到一个方法中 ...

  8. 为什么要使用String

    最近在培训课期间指导初学者.任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作.其中一位学员完成的类中,有如下方法: void dwarwle(HashM ...

  9. [python]一个关于默认参数的老问题和一个有关优化的新问题

    一个老问题: def func(defau=[]): defau.append(1) return defau print(func())#print[1] print(func())#print[1 ...

  10. [leetcode trie]211. Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...