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

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

问题二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. windows 依赖查看

    使用工具Download Process Explorer查看运行程序所依赖的动态库. 中文说明:适用于 Windows 的 Process Explorer 10.21 版

  2. node模拟socket

    什么是Socket?网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket通信流程 基于net模块实现socket 服务端SocketServer.j ...

  3. Python3中的yield from语法

    Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...

  4. 一步一步学习IdentityServer3 (12) 授权模式

    Idr3中的授权模式也是基于OAuth2 来看看例子中的说明 // // 摘要: // OpenID Connect flows. public enum Flows { // // 摘要: // a ...

  5. iOS模块器截屏闪退

    最近不知道什么原因,iOS模块器截屏命令点击模拟器就闪退,在此记录下在命令行截屏操作: 第一步:打开对应的模拟器 第二步:模拟器缩放比为100% 第三步:输入以下命令,001.jpg为要保存的文件名  ...

  6. bzoj 1263 [SCOI2006]整数划分

    n >= 6 的时候减3, 最后分类讨论, 上个Java import java.math.BigInteger; import java.util.*; public class Main { ...

  7. 【原创】MySQL CPU %sys高的案例分析(二)

    后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压测程序,保持压测程序持续运行,保持innodb_sp ...

  8. sublime text3安装Package Control和Vue Syntax Highlight

    一.下载Sublime3 https://www.sublimetext.com/3 二.安装Package Control 在线安装: https://packagecontrol.io/insta ...

  9. 一台电脑如何安装多个版本的JDK

    1 . 准备两个版本的jdk我的两个jdk路径为:  C:\Program Files\Java\jdk1.6.0_43  C:\Program Files\Java\jdk1.8.0_25 2 . ...

  10. windows下nodejs+npm+bower+git+bootstrap组件环境配置

    1.进入nodejs官方网站下载软件(nodejs.org), 2.下载完成后,双击默认安装.安装程序会自动添加环境变量 3.检测nodejs是否安装成功.打开cmd命令行 输入 node - v 显 ...