在Java中删除C ++和垃圾回收

时间:2015-08-25 03:48:37

标签: java c++ garbage-collection jvm

C ++中的delete与Java中的垃圾收集的工作方式相同吗?我的意思是,内部的内存管理部分(在两种情况下堆中真正发生了什么?)。

4 个答案:

答案 0 :(得分:2)

在C ++中,"themeth""the meth"delete运算符的功能可以通过运算符重载来定义,因此您可以根据需要使其工作。

在Java中,堆行为由JVM定义,通常,只要内存中不存在对对象的引用,它最终将由垃圾收集器清除。有关Java垃圾收集的更多详细信息,请参阅this

答案 1 :(得分:1)

在C ++中删除调用使用new运算符释放由变量占用的Free Store(堆)上的内存。我们手动完成所有这些(直到我们使用智能指针,C ++ 11等),对于每个新的我们必须做相应的删除。垃圾收集器仅存在于C ++ 11及更高版本中。 其他语言的垃圾收集(Java,C#)自动释放变量占用的内存。在场景后面垃圾收集器保持变量的引用计数,当引用计数达到0(或变量超出范围)时,它释放该变量占用的内存。

答案 2 :(得分:0)

实际垃圾收集是自动化的。 VM正在自动执行此操作。您可以使用System.gc()强制VM进行垃圾回收。

答案 3 :(得分:0)

在堆上发生分配和释放。我们来这里举个例子吧。在C ++中,STL容器使用一个名为A的对象来执行内存管理。它在堆上分配内存(假设它进入任何未被占用的随机位置),然后释放它。现在,分配器可以有一个映射,一个数组或某种数据结构,它可以告诉它是否有一些空闲的内存,即它之前分配和释放的一些内存。它可以跟踪这个本身,它是如何实现定义的。所有程序员和标准指定的是它只是执行此操作(以及其中的一些限制),因此作为程序员,您通常不应该担心堆分配是如何完成的。编译器可以优化代码并使其在不同情况下的行为不同。

现在回到你关于C ++中的删除和Java中的垃圾收集的问题。 C ++编译为原始机器可执行代码,即由机器本地运行的代码(汇编代码),而Java编译为“字节码”,“字节码”由Java虚拟机(JVM)执行,它本身就是一个程序。 C ++中的allocator使机器在堆上释放内存。在java中,当对象没有任何引用并且发生垃圾收集时,会自动发生删除。这里的JVM就像delete它“释放”内存。

因此内存被标记为已取消分配。它可以重复使用。在机器级别如何发生这种情况可能会有很大差异。你甚至可以通过重载它们让操作员做你想做的事!希望有所帮助:)