<legend id='VIBgv'><style id='VIBgv'><dir id='VIBgv'><q id='VIBgv'></q></dir></style></legend>

  • <i id='VIBgv'><tr id='VIBgv'><dt id='VIBgv'><q id='VIBgv'><span id='VIBgv'><b id='VIBgv'><form id='VIBgv'><ins id='VIBgv'></ins><ul id='VIBgv'></ul><sub id='VIBgv'></sub></form><legend id='VIBgv'></legend><bdo id='VIBgv'><pre id='VIBgv'><center id='VIBgv'></center></pre></bdo></b><th id='VIBgv'></th></span></q></dt></tr></i><div id='VIBgv'><tfoot id='VIBgv'></tfoot><dl id='VIBgv'><fieldset id='VIBgv'></fieldset></dl></div>

        <bdo id='VIBgv'></bdo><ul id='VIBgv'></ul>

      <small id='VIBgv'></small><noframes id='VIBgv'>

      <tfoot id='VIBgv'></tfoot>
      1. Java 中何时以及如何收集类垃圾?

        时间:2023-07-13

        1. <small id='Yc7Ax'></small><noframes id='Yc7Ax'>

            • <legend id='Yc7Ax'><style id='Yc7Ax'><dir id='Yc7Ax'><q id='Yc7Ax'></q></dir></style></legend>
                <bdo id='Yc7Ax'></bdo><ul id='Yc7Ax'></ul>
              • <i id='Yc7Ax'><tr id='Yc7Ax'><dt id='Yc7Ax'><q id='Yc7Ax'><span id='Yc7Ax'><b id='Yc7Ax'><form id='Yc7Ax'><ins id='Yc7Ax'></ins><ul id='Yc7Ax'></ul><sub id='Yc7Ax'></sub></form><legend id='Yc7Ax'></legend><bdo id='Yc7Ax'><pre id='Yc7Ax'><center id='Yc7Ax'></center></pre></bdo></b><th id='Yc7Ax'></th></span></q></dt></tr></i><div id='Yc7Ax'><tfoot id='Yc7Ax'></tfoot><dl id='Yc7Ax'><fieldset id='Yc7Ax'></fieldset></dl></div>

                    <tbody id='Yc7Ax'></tbody>
                1. <tfoot id='Yc7Ax'></tfoot>
                  本文介绍了Java 中何时以及如何收集类垃圾?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我在这个主题.但我得到的答案,给了我另一个问题.

                  有人提到垃圾收集器也可以收集类.这是真的?

                  如果这是真的,这是怎么回事?

                  解决方案

                  Java 中的类可以在没有任何引用的情况下被垃圾回收.在大多数简单的设置中,这永远不会发生,但在某些情况下可能会发生.

                  有很多方法可以使类可访问,从而阻止它符合 GC 条件:

                  • 该类的对象仍然可以访问.
                  • 表示该类的 Class 对象仍然可以访问
                  • 加载该类的 ClassLoader 仍然可以访问
                  • ClassLoader 加载的其他类仍然可以访问

                  none 为真时,ClassLoader 及其加载的所有类都符合 GC 条件.

                  这是一个构建的示例(充满了不良做法!),应该展示这种行为:

                  在目录(不是包!)x中创建一个字节码文件GCTester.class.它的源代码是:

                  公共类 GCTester {公共静态最终 GCTester INSTANCE=new GCTester();私人 GCTester() {System.out.println(this + "created");}公共无效finalize(){System.out.println(this + "finalized");}}

                  然后在x的父目录下创建一个类TestMe:

                  import java.io.File;导入 java.net.URL;导入 java.net.URLClassLoader;导入 java.lang.reflect.Field;公共类TestMe {公共静态 void main(String[] args) 抛出异常 {System.out.println("in main");testGetObject();System.out.println("第二次 gc() 调用 (in main)");System.gc();线程.sleep(1000);System.out.println("main 结束");}公共静态无效 testGetObject() 抛出异常 {System.out.println("创建类加载器");ClassLoader cl = new URLClassLoader(new URL[] {new File("./x").toURI().toURL()});System.out.println("加载类");类<?>clazz = cl.loadClass("GCTester");System.out.println("获取静态字段");字段字段 = clazz.getField("INSTANCE");System.out.println("读取静态值");对象对象 = field.get(null);System.out.println("得到的值:" + object);System.out.println("第一次 gc() 调用");System.gc();线程.sleep(1000);}}

                  运行 TestMe 将产生这个(或类似的)输出:

                  <上一页>主要是创建类加载器加载类获取静态字段读取静态值GCTester@1feed786 已创建得到值:GCTester@1feed786第一次 gc() 调用第二次 gc() 调用(在 main 中)GCTester@1feed786 定稿主线结束

                  在倒数第二行中,我们看到 GCTester 实例已完成,这仅意味着该类(和 ClassLoader)符合垃圾回收条件.

                  I asked a question about Garbage Collection in Java in this topic. But the answer I got, gave me another question.

                  Someone mentioned that classes can be collected by the garbage collector too. Is this true?

                  And if it is true, how does this work?

                  解决方案

                  A class in Java can be garbage-collected when nothing references it. In most simple setups this never happens, but there are situations where it can occur.

                  There are many ways to make a class reachable and thus prevent it from being eligible for GC:

                  • objects of that class are still reachable.
                  • the Class object representing the class is still reachable
                  • the ClassLoader that loaded the class is still reachable
                  • other classes loaded by the ClassLoader are still reachable

                  When none of those are true, then the ClassLoader and all classes it loaded are eligible for GC.

                  Here's a constructed example (full of bad practices!) that should demonstrate the behaviour:

                  Create a bytecode file GCTester.class in a directory (not package!) x. It's source code is:

                  public class GCTester {
                    public static final GCTester INSTANCE=new GCTester();
                  
                    private GCTester() {
                      System.out.println(this + " created");
                    }
                  
                    public void finalize() {
                      System.out.println(this + " finalized");
                    }
                  }
                  

                  Then create a class TestMe in the parent directory of x:

                  import java.io.File;
                  import java.net.URL;
                  import java.net.URLClassLoader;
                  import java.lang.reflect.Field;
                  
                  public class TestMe {
                    public static void main(String[] args) throws Exception {
                      System.out.println("in main");
                      testGetObject();
                      System.out.println("Second gc() call (in main)");
                      System.gc();
                      Thread.sleep(1000);
                      System.out.println("End of main");
                    }
                  
                    public static void testGetObject() throws Exception {
                      System.out.println("Creating ClassLoader");
                      ClassLoader cl = new URLClassLoader(new URL[] {new File("./x").toURI().toURL()});
                      System.out.println("Loading Class");
                      Class<?> clazz = cl.loadClass("GCTester");
                  
                      System.out.println("Getting static field");
                      Field field = clazz.getField("INSTANCE");
                  
                      System.out.println("Reading static value");
                      Object object = field.get(null);
                      System.out.println("Got value: " + object);
                  
                      System.out.println("First gc() call");
                      System.gc();
                      Thread.sleep(1000);
                    }
                  }
                  

                  Running TestMe will produce this (or similar) output:

                  in main
                  Creating ClassLoader
                  Loading Class
                  Getting static field
                  Reading static value
                  GCTester@1feed786 created
                  Got value: GCTester@1feed786
                  First gc() call
                  Second gc() call (in main)
                  GCTester@1feed786 finalized
                  End of main
                  

                  In the second to last line we see that the GCTester instance is finalized, which can only mean that the class (and ClassLoader) are eligible for garbage collection.

                  这篇关于Java 中何时以及如何收集类垃圾?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:哪个循环的性能更好?为什么? 下一篇:如何使用 Maven 使用 Selenium 3.4.0 启动 FireFoxDriver?

                  相关文章

                    1. <legend id='TiFgc'><style id='TiFgc'><dir id='TiFgc'><q id='TiFgc'></q></dir></style></legend>
                      • <bdo id='TiFgc'></bdo><ul id='TiFgc'></ul>
                      <tfoot id='TiFgc'></tfoot>

                    2. <i id='TiFgc'><tr id='TiFgc'><dt id='TiFgc'><q id='TiFgc'><span id='TiFgc'><b id='TiFgc'><form id='TiFgc'><ins id='TiFgc'></ins><ul id='TiFgc'></ul><sub id='TiFgc'></sub></form><legend id='TiFgc'></legend><bdo id='TiFgc'><pre id='TiFgc'><center id='TiFgc'></center></pre></bdo></b><th id='TiFgc'></th></span></q></dt></tr></i><div id='TiFgc'><tfoot id='TiFgc'></tfoot><dl id='TiFgc'><fieldset id='TiFgc'></fieldset></dl></div>

                    3. <small id='TiFgc'></small><noframes id='TiFgc'>