Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何显式执行垃圾收集_Java_Android_Garbage Collection - Fatal编程技术网

Java 如何显式执行垃圾收集

Java 如何显式执行垃圾收集,java,android,garbage-collection,Java,Android,Garbage Collection,通过内置的垃圾回收,Java允许开发人员创建新对象,而无需明确担心内存分配和释放,因为垃圾回收器会自动回收内存以供重用 AFAIK垃圾收集器通常在应用程序内存不足时运行。它包含一个表示对象之间链接的图形,可以释放孤立对象 虽然我们有System.gc(),但是如果您在 代码Java虚拟机可能在运行时决定是否执行垃圾处理 正如这篇文章所解释的那样 所以我对java的垃圾收集过程有些怀疑 我想知道java中是否有类似C语言中的free()这样的方法,当我们明确地想要释放new操作符分配的内存部分时

通过内置的垃圾回收,Java允许开发人员创建新对象,而无需明确担心内存分配和释放,因为垃圾回收器会自动回收内存以供重用

AFAIK垃圾收集器通常在应用程序内存不足时运行。它包含一个表示对象之间链接的图形,可以释放孤立对象

虽然我们有
System.gc()
,但是如果您在 代码Java虚拟机可能在运行时决定是否执行垃圾处理 正如这篇文章所解释的那样

所以我对java的垃圾收集过程有些怀疑

  • 我想知道java中是否有类似C语言中的
    free()
    这样的方法,当我们明确地想要释放
    new
    操作符分配的内存部分时,我们可以调用这种方法

  • new
    是否执行与执行
    malloc()
    calloc()
    相同的操作

  • java中的
    delete()
    free()
    malloc()
    calloc()
    sizeof()
    方法是否有替代方法


  • 不,没有。Java不是c,您不应该显式地管理内存

    AFAIK垃圾收集器通常在应用程序内存不足时运行

    对此几乎没有异议。否。它异步运行并收集引用的内存位置

    我想知道在java中是否有这样的方法,比如C语言中的free(),当我们显式地想要释放由新操作符分配的部分内存时,我们可以调用它

    同样,
    System.gc()
    是您的调用,但不能100%确定内存是否立即清除

    new是否执行与do malloc()或calloc()相同的操作

    如果你的意思是分配内存,那么这个对象是

    java中是否有delete()、free()、malloc()、calloc()和sizeof()方法的替代方法

    AFAIK没有直接的功能可以这样做

    在我看来,你不必担心这些事情,现代的JVM很聪明,能够处理这些事情

    一个,当GC决定运行时。希望能有所帮助。

    在Java中,我们有System.gc(),它基本上用于显式调用垃圾收集。但是,人们应该潜在地避免这种情况,因为这表明差距尚未填补。 您可能会看到以下内容:


    但是,当系统内存不足时,Java会自行执行垃圾收集任务。在应用程序级别,您所能做的就是为所有未使用的变量和对象分配null,这使得它们不可用,并允许JVM执行垃圾收集

    我没有专门研究过这方面的内容,但我把它作为对java nio的增强阅读。 在nio中,我们有一个bytebuffer,在我看来,它可能是malloc的java版本

    缓冲区本质上是一块内存,您可以将数据写入其中,然后再读取。此内存块包装在NIO缓冲区对象中,该对象提供了一组方法,使使用内存块更容易。

    语法:

    ByteBuffer buf = ByteBuffer.allocate(24);
    

    更多阅读。

    Java处理一切。。。关于内存管理,如果不造成严重的问题,您几乎无法做到这一点。只要确保所有的引用都为空,gc就会完成它的工作。如果你需要自己管理内存,那么Java不是适合你的技术。如果您只是想自己管理内存,那么您应该首先确定您是否真的需要它。对于大多数应用程序,您不需要这样做。我会提到
    finalize()
    ,但不应该使用它。+1很好,但是如果您能提供一些关于System.gc()何时应该执行垃圾收集的解释,那就更好了。@CPUTerminator
    finalize
    不会释放内存。它执行在释放对象内存之前需要对其执行的任何操作。
    new
    malloc()
    完全不同;它更轻。我记得
    newobject()
    在现代JIT上编译成八条机器指令–与
    malloc()
    相比,后者需要数百条指令。@Cruncher-Hmm好的。。。我认为这是gc用来清理内存的方法。是的,这就是为什么有时避免使用System.gc()。但是,将null赋值给未使用的变量是否可以保证垃圾收集器在那个时候会被调用?嗨,Sahil,不,这不能保证垃圾收集器会被调用。只要说,当垃圾收集器运行时,它使一个对象有资格被抛出内存。@SahilMahajanMj:不,它实际上是不相关的。但您可能很幸运,JVM可以发现对象只在方法调用期间存在,并在堆栈上分配它。并不是每个JVM都这样做,而且也不能保证。你可以根据问题提供一些解释吗?虽然你提供了一个很小但很好的答案,但这件事我已经知道了。这就是为什么我发布这个问题是为了了解如何管理它,因为它们可能是一些内存至关重要的应用程序。但无论如何,感谢您可以通过JVM和GC配置间接管理内存。但是你不应该以一种明确的方式来做。是的,但是它与
    新字节[24]
    新数组列表(24)
    没有太大区别。您不能释放
    ByteBuffer
    内存,它不是“通用内存”,例如,您不能将其用于对象。我们可以使用直接ByteBuffer,然后使用
    Cleaner
    来释放内存。如果我错了,请纠正我?