【发布时间】:2015-08-08 02:33:22
【问题描述】:
当垃圾收集器运行并释放内存时,这些内存是返回给操作系统还是作为进程的一部分保留。我的强烈印象是,内存实际上从未释放回操作系统,而是保留为内存区域/池的一部分,以供同一进程重用。
因此,进程的实际内存永远不会减少。 An article 提醒我的是,Java 的运行时是用 C/C++ 编写的,所以我想同样的事情也适用?
更新
我的问题是关于 Java 的。我之所以提到 C/C++,是因为我假设 Java 的分配/解除分配是由 JRE 使用某种形式的 malloc/delete 完成的
【问题讨论】:
-
即使使用 C 或 C++ 中的标准堆分配方法也不必释放回操作系统,并且操作系统本身可以保持新分配的页面映射到进程(因此它不会似乎是免费的)。
-
Java’s Runtime is written in C/C++ so I guess the same thing applies?Java 的 GC 也是用 C++ 编写的……它不是“低于”C++ -
到目前为止,没有堆内存释放给操作系统。如果仍未达到最大堆大小,则仅占用额外的内存。这与 C 中的相同,而 C 有一个额外的问题,即内存重用受到内存碎片的阻碍(尽管 C 可以自己管理分配的内存)。
-
JVM 以最小堆大小开始,我们可以将最大和最小堆大小设置为相同的值。如果最大和最小堆大小相同,它将预先分配 JAVA 堆,实际上可能只有少数 Java 对象使用该堆,在这种情况下,GC 不会将内存释放回操作系统。 GC 实际上声称使用的内存是未引用的对象,因此它们可以用于其他对象。它不会直接转化为将内存释放回操作系统。它可以通过从 C 库中调用 free 来释放内存。但是malloc在内部也可能不会立即将内存释放给OS。
-
@JoopEggen:所以进程永远不会缩小以帮助操作系统?
标签: java memory-management garbage-collection