Java 如何显式执行垃圾收集
通过内置的垃圾回收,Java允许开发人员创建新对象,而无需明确担心内存分配和释放,因为垃圾回收器会自动回收内存以供重用 AFAIK垃圾收集器通常在应用程序内存不足时运行。它包含一个表示对象之间链接的图形,可以释放孤立对象 虽然我们有Java 如何显式执行垃圾收集,java,android,garbage-collection,Java,Android,Garbage Collection,通过内置的垃圾回收,Java允许开发人员创建新对象,而无需明确担心内存分配和释放,因为垃圾回收器会自动回收内存以供重用 AFAIK垃圾收集器通常在应用程序内存不足时运行。它包含一个表示对象之间链接的图形,可以释放孤立对象 虽然我们有System.gc(),但是如果您在 代码Java虚拟机可能在运行时决定是否执行垃圾处理 正如这篇文章所解释的那样 所以我对java的垃圾收集过程有些怀疑 我想知道java中是否有类似C语言中的free()这样的方法,当我们明确地想要释放new操作符分配的内存部分时
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()何时应该执行垃圾收集的解释,那就更好了。@CPUTerminatorfinalize
不会释放内存。它执行在释放对象内存之前需要对其执行的任何操作。new
与malloc()
完全不同;它更轻。我记得newobject()
在现代JIT上编译成八条机器指令–与malloc()
相比,后者需要数百条指令。@Cruncher-Hmm好的。。。我认为这是gc用来清理内存的方法。是的,这就是为什么有时避免使用System.gc()。但是,将null赋值给未使用的变量是否可以保证垃圾收集器在那个时候会被调用?嗨,Sahil,不,这不能保证垃圾收集器会被调用。只要说,当垃圾收集器运行时,它使一个对象有资格被抛出内存。@SahilMahajanMj:不,它实际上是不相关的。但您可能很幸运,JVM可以发现对象只在方法调用期间存在,并在堆栈上分配它。并不是每个JVM都这样做,而且也不能保证。你可以根据问题提供一些解释吗?虽然你提供了一个很小但很好的答案,但这件事我已经知道了。这就是为什么我发布这个问题是为了了解如何管理它,因为它们可能是一些内存至关重要的应用程序。但无论如何,感谢您可以通过JVM和GC配置间接管理内存。但是你不应该以一种明确的方式来做。是的,但是它与新字节[24]
或新数组列表(24)
没有太大区别。您不能释放ByteBuffer
内存,它不是“通用内存”,例如,您不能将其用于对象。我们可以使用直接ByteBuffer,然后使用Cleaner
来释放内存。如果我错了,请纠正我?