java.lang.ref.cleaner包

finalize()//该方法已过时,有风险,慎用

1.对象不可能被垃圾回收

2.垃圾回收并不等于"析构"

只有当垃圾回收发生时finalize()才得到调用,否则对象就会一直保存下来,知道程序结束,将资源交还系统

3.垃圾回收只与内存又关,垃圾回收和终结都不保证会一定发生  //可以使用system.gc() 提醒 虚拟机回收

System.runFinalization(); //强制调用已经失去引用的对象的finalize方法

可以使对象引用指向null强制对象失去引用

//: object/TerminationCondition.java
/**@version 1.0
* @author fei long
*/
package object; class Book {
boolean checkedOut = false;
Book(boolean checkOut)
{
checkedOut = checkOut;
}
void checkIn()
{
checkedOut =false;
}
protected void finalize()
{
if(checkedOut)
{
System.out.println("Error: checked out");
}
}
}
public class TerminationCondition{
public static void main(String[] args)
{
Book novel = new Book(true);
novel.checkIn();
new Book(true);
System.gc(); //提醒虚拟机回收
System.runFinalization();//强制调用已经失去引用的对象的finalize方法 
}
}/* output
Error: checked out
*///~

继承和清理: 通过组合和继承方法来创建新类时,永远不必担心对象的清理为你,子类通常留给垃圾回收器进行处理,如果遇到清理的问题,那么必须为新类创建dispose()方法,并且由于继承的缘故,如果我们有其它作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose方法,当覆盖被继承类的dispose()方法时,务必调用基类版本的dispose()方法,否则基类的清理动作就不会发生,

//: polymorphism/Forg.java
// cleanup an inheritance
package object; import static net.mindview.util.Print.*; class Characteristic{
private String s;
Characteristic(String s)
{
this.s = s;
print("Creating Characteristic " + s);
}
protected void dispose()
{
print("disposing characteristic " + s);
}
}
class Description{
private String s;
Description(String s)
{
this.s = s;
print("Creating Description " + s);
}
protected void dispose()
{
print("disposing description" + s);
}
}
class LivingCreature{
private Characteristic p =
new Characteristic("is alive");
private Description t =
new Description("Basic living creature");
LivingCreature()
{
print("livingcreature");
}
protected void dispose()
{
print("livingCreature dispose");
t.dispose();
p.dispose();
}
}
class Animal extends LivingCreature{
private Characteristic p =
new Characteristic("has heart");
private Description t =
new Description("animal not vegetalbe");
Animal(){print("Animal()");}
protected void dispose()
{
print("Animal dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
class Amphibian extends Animal
{
private Characteristic p =
new Characteristic("can live in water");
private Description t =
new Description("Both water an land");
Amphibian()
{
print("Amphibian()");
}
protected void dispose()
{
print("Amphibian dispose");
t.dispose();
p.dispose();
super.dispose();
}
}
public class Frog extends Amphibian{
private Characteristic p = new Characteristic("Croaks");
private Description t = new Description("Eats bugs");
public Frog()
{
print("Forg()");
t.dispose();
p.dispose();
super.dispose();
}
public static void main(String[] args)
{
Frog frog = new Frog();
print("bye!");
frog.dispose();
}
}/* output: 消费的顺序和初始化的顺序相反
Creating Characteristic is alive
Creating Description Basic living creature
livingcreature
Creating Characteristic has heart
Creating Description animal not vegetalbe
Animal()
Creating Characteristic can live in water
Creating Description Both water an land
Amphibian()
Creating Characteristic Croaks
Creating Description Eats bugs
Forg()
disposing descriptionEats bugs
disposing characteristic Croaks
Amphibian dispose
disposing descriptionBoth water an land
disposing characteristic can live in water
Animal dispose
disposing descriptionanimal not vegetalbe
disposing characteristic has heart
livingCreature dispose
disposing descriptionBasic living creature
disposing characteristic is alive
bye!
Amphibian dispose
disposing descriptionBoth water an land
disposing characteristic can live in water
Animal dispose
disposing descriptionanimal not vegetalbe
disposing characteristic has heart
livingCreature dispose
disposing descriptionBasic living creature
disposing characteristic is alive
*///~

三,当一个成员对象存在于其它一个或多个对象共享的情况时,也许就必须使用引用计数来跟踪仍旧访问着共享对象的对象数量了.

//: polymorphism/ReferenceCounting.java
// Cleaning up shared member objects
package object;
import static net.mindview.util.Print.*; class Shared{
private int refcount =0;
private static long counter = 0; //记录该类总共的对象个数
private final long id = counter++; //final 表示不希望再对象生命周期内ID的值被改变
public Shared()
{
print("Creating " + this);
}
public void addRef(){refcount++;} //记录同一个对象被引用的次数
public void dispose()
{
if(--refcount == 0) //当被引用数只有一个时执行清理
print("Disposing " + this);
}
public String toString(){return "Share " + id;}
}
class Composting{
private Shared shared;
private static long counter = 0;
private final long id = counter++;
public Composting(Shared shared)
{
print("Creating " + this);
this.shared= shared;
this.shared .addRef();
}
protected void dispose()
{
print("disposing " + this);
shared.dispose();
}
public String toString(){return "Composing " + id;}
}
public class ReferenceCounting{
public static void main(String[] args)
{
Shared shared = new Shared();
Composting[] composting = { new Composting(shared),
new Composting(shared),new Composting(shared),
new Composting(shared),new Composting(shared),
};
for(Composting c : composting)
c.dispose();
}
}/* output:
Creating Share 0
Creating Composing 0
Creating Composing 1
Creating Composing 2
Creating Composing 3
Creating Composing 4
disposing Composing 0
disposing Composing 1
disposing Composing 2
disposing Composing 3
disposing Composing 4
Disposing Share 0
*///:~

Java 清理和垃圾回收的更多相关文章

  1. Java编程思想学习笔记_1(Java内存和垃圾回收)

    1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...

  2. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  3. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  4. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  5. 高吞吐低延迟Java应用的垃圾回收优化

    高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...

  6. java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是

    答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...

  7. java虚拟机之垃圾回收算法

    标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...

  8. Java中的垃圾回收

    关于垃圾回收,主要是两个步骤: 垃圾对象的判断 垃圾对象的回收 垃圾对象的判断方法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何 ...

  9. 深入理解java虚拟机【垃圾回收算法】

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

随机推荐

  1. Mysql经典sql语句大全

    DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete,Update,Insert) DCL-数据控制语言(GRANT,REVOK ...

  2. Elasticsearch入门篇

    推荐博客: 阮一峰大神:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html ElasticSearch 权威指南(中文版):https: ...

  3. JAVA记录-SpringMVC+Mybatis几个核心注意的地方

    1.DispatcherServlet   -- 前置控制器 DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet. DispatcherServ ...

  4. java.io.Serializable 序列化问题【原】

    java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...

  5. java实现网页验证码

    Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletExceptio ...

  6. javaBean的相关知识和应用

    javaBean JavaBean 简介 JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一 ...

  7. caffe 中 python 数据层

    caffe中大多数层用C++写成. 但是对于自己数据的输入要写对应的输入层,比如你要去图像中的一部分,不能用LMDB,或者你的label 需要特殊的标记. 这时候就需要用python 写一个输入层. ...

  8. 第15月第22天 libz.dylib

    1. 3.在弹出的对话框中输入"cmd"+"shift"+"g" 4 4.输入/usr/lib https://jingyan.baidu. ...

  9. SpringBoot在IDEA中实现热部署

    gradle构建形式 添加依赖 compile("org.springframework.boot:spring-boot-devtools") 其他设置 步骤1 步骤2 按下 C ...

  10. JavaScript学习 - 基础(三) - 运算符

    js运算符 1.算数运算符 包括 加(+) .减-() .乘(*).除(/).余数(%) 减号 还可以表示为 负号 例如: -1,-3 加号 还可以用于字符串拼接 例如: 'a' + 'b' = 'a ...