java的清理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的清理相关的知识,希望对你有一定的参考价值。

java的创建

http://www.cnblogs.com/maying3010/p/5866128.html

java的作用域

作用域一般是最近的一个花括号内部出了作用域,该对象仍继续占据内存空间,但我们无法访问该对象

java的回收

1. 当一个对象离开了作用域或者为null时,java的垃圾回收机制会认为该对象可以回收(不一定回收)。

2. 垃圾回收器准备释放内存的时候,会先调用finalize()并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存

3. System.gc()方法:该方法只是向垃圾回收器建议回收内存,不一定会真正回收内存。

test1:

public class TestClass {
    int flage = 0;
    TestClass(int flage){
        System.out.println("new Object TestClass");
        this.flage = flage;
    }
    @Override
    protected void finalize() {
        System.out.println("run this method:finalize() And this flag is " + flage);
    }
    public static void main(String[] args) {
        TestClass t = new TestClass(2);
        System.gc();
    }
}output:
new Object TestClass

test2:

public class TestClass {
    int flage = 0;
    TestClass(int flage){
        System.out.println("new Object TestClass");
        this.flage = flage;
    }
    @Override
    protected void finalize() {
        System.out.println("run this method:finalize() And this flag is " + flage);
    }
    public static void main(String[] args) {
        TestClass t = new TestClass(2);
        t = null;
        System.gc();
    }
}output:
new Object TestClass
run this method:finalize() And this flag is 2

test3:

public class TestClass {
    int flage = 0;
    TestClass(int flage){
        System.out.println("new Object TestClass");
        this.flage = flage;
    }
    @Override
    protected void finalize() {
        System.out.println("run this method:finalize() And this flag is " + flage);
    }
    static void test(){
        TestClass t = new TestClass(3);
    }
    public static void main(String[] args) {
        TestClass t = new TestClass(2);
        test();
        System.gc();
    }
}output:

new Object TestClass
new Object TestClass
run this method:finalize() And this flag is 3

垃圾回收机制触发的条件

JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:

①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。

②Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。

由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。

原理

先立一个flag在这里,等看了jvm后再写

reference

http://www.blogjava.net/wilesun/archive/2007/10/08/150955.html




以上是关于java的清理的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

导航上的片段生命周期重叠

如何使用事件侦听器来加载动画片段的循环

java代码在片段活动中不起作用

vue项目微信端清理缓存问题解决

创建片段而不从 java 代码实例化它