当垃圾收集器淘汰了这个对象,那个对象去了哪里?
When the garbage collector eliminates the object, where does that object go?
假设垃圾收集器已识别出 class(一个对象)的实例 - Java 程序未使用该实例。因此垃圾收集器决定消除该对象,因为它没有在代码中的任何地方使用。
现在,当消除一个对象时,该对象在内存中的什么位置?内存中的那个对象到底发生了什么?
一般而言 - 当对象被消除时 - 计算机如何处理消除?消除是如何进行的?
我的问题更多是关于 - 在堆中消除对象后会发生什么。 (在 Java)
我能想到的可能会发生的事情有:
该对象(堆内)的内存现在变得空闲,但该对象仍保留在系统中,并且由于内存可用,新创建的对象可以占用其 space。因此,如果我以二进制格式思考:先前对象的 1 和 0 将被新的 1 和 0 序列(新对象)覆盖。
在您的回答中,请按以下格式提供答案:
- 垃圾收集对象实际上发生了什么?
- 这些进程在 Java 或计算机科学术语中的名称是什么?
注意:我在Whosebug上找过类似的question/answer,但是这个问题比较具体,所以没找到答案,只好post提问
没有任何反应。
一个对象并不是真正的 "living being"。最后,它只是:内存中的字节。 JVM 保留的一些信息:"this object here is 'alive'"(由其他活动对象使用)和 "here is the memory that belongs to that object".
现在,当 GC "collects" 对象时,概念上会发生什么:JVM 只是从其内部数据结构中删除 "I got this object here with memory there"。最有可能的是,像 "x bytes of freed memory at address y" 这样的信息存储在 JVM 中的一些其他数据结构中。这样 JVM 就知道:以前占用的内存现在可以重新用于另一个对象。
这很可能导致:该内存位置坐在那里,很长一段时间都没有变化。直到 JVM 需要更多内存,并决定将 "space" 重新用于其他目的。
1) 分配该对象的内存刚刚被垃圾收集器标记为空闲。 Java 有一个连续的内存 space 在开始时分配(想象一下在 c 或 c++ 中分配一个巨大的指针)当你创建一个对象时,内存管理系统将它放在那里(对象 x 在 n 之间分配)和 m 地址)当对象被删除时,gc 只是将 n 和 m 标记为空闲。
这个过程比较复杂,但是你可以简单地想象成这样(你可以阅读关于生成和压缩的内容以便更好地理解:)
2) 简单来说,gc 在 Java 应用程序的应用程序启动时启动的线程上运行。一些重要的术语:generations(地址spaces的类型),heap(分配内存的地址space)
What actually happens to that object inside the memory? In general
term - when the object is eliminated - how the computer handles the
elimination? how the elimination works?
内存没有直接返还给操作系统。内存现在可以免费用于 JVM 的未来对象分配。这意味着没有显式删除,引用对象的内存现在可以自由使用。因为来自 OS 的内存分配已经由 JVM 完成,所以 仅在某些 GC 内存中返回 给系统,其 frequency/behavior 也可以通过 GC 显式设置params 但它是复杂的操作,因为它带有成本。
正在进行优化此行为的工作,例如:查看 openjdk 12 热点工作:https://openjdk.java.net/jeps/346
您被常用术语“垃圾收集器”误导了,这是用词不当。 “垃圾收集器”不收集垃圾
所以你的问题以错误的前提开始:
Let's say garbage collector has identified an instance of a class (an object) - which is not being used by the Java Program. So the Garbage Collector decides to eliminate that object since it is not being used anywhere in the code.
这两件事都没有发生。垃圾收集器不会识别单个未使用的对象,也不会“销毁”任何对象,因为对象的销毁不是一回事。
垃圾收集器通过确定哪些对象仍在使用来工作,通常是通过遍历所有对象引用,从根集开始,即仍然[=49=的局部变量] 由 bootstrap 加载程序加载的 类 的线程和静态字段。
当它知道哪些对象仍在使用时,这些对象之间的间隙就是可回收内存,而不管之前有多少对象存储在那里。它可能只是将这些内存块添加到可用内存列表中,但大多数现代垃圾收集器会重新定位仍在使用的对象,以获得连续的空闲内存块,以实现快速分配并防止碎片化。
所以
- What actually happens to the garbage collected object?
“收集”的对象没有任何反应。死对象与进程完全无关。
- What are the names of these processes called in Java or in computer science terms?
这个通用术语仍然是“垃圾收集”,即使它的字面意思并没有描述实际过程。有时它被称为“内存管理”,更合适,通常,内存管理器也负责分配,因此也决定了堆的组织方式。
在典型的实现中,您可以将子任务标识为
- 标记
识别仍在使用的对象的过程(也称为跟踪)
- 扫一扫
通过间隙的过程,将它们添加到可用内存列表或为以下过程之一准备它们:
- 正在复制
将特定内存区域的活动对象重新定位到新区域,以便源区域之后完全空闲
- 正在压缩
将特定内存区域的一些活动对象重新定位到同一区域,填充间隙,以便该区域在开始或结束时具有连续的空闲内存
假设垃圾收集器已识别出 class(一个对象)的实例 - Java 程序未使用该实例。因此垃圾收集器决定消除该对象,因为它没有在代码中的任何地方使用。 现在,当消除一个对象时,该对象在内存中的什么位置?内存中的那个对象到底发生了什么? 一般而言 - 当对象被消除时 - 计算机如何处理消除?消除是如何进行的?
我的问题更多是关于 - 在堆中消除对象后会发生什么。 (在 Java)
我能想到的可能会发生的事情有: 该对象(堆内)的内存现在变得空闲,但该对象仍保留在系统中,并且由于内存可用,新创建的对象可以占用其 space。因此,如果我以二进制格式思考:先前对象的 1 和 0 将被新的 1 和 0 序列(新对象)覆盖。
在您的回答中,请按以下格式提供答案:
- 垃圾收集对象实际上发生了什么?
- 这些进程在 Java 或计算机科学术语中的名称是什么?
注意:我在Whosebug上找过类似的question/answer,但是这个问题比较具体,所以没找到答案,只好post提问
没有任何反应。
一个对象并不是真正的 "living being"。最后,它只是:内存中的字节。 JVM 保留的一些信息:"this object here is 'alive'"(由其他活动对象使用)和 "here is the memory that belongs to that object".
现在,当 GC "collects" 对象时,概念上会发生什么:JVM 只是从其内部数据结构中删除 "I got this object here with memory there"。最有可能的是,像 "x bytes of freed memory at address y" 这样的信息存储在 JVM 中的一些其他数据结构中。这样 JVM 就知道:以前占用的内存现在可以重新用于另一个对象。
这很可能导致:该内存位置坐在那里,很长一段时间都没有变化。直到 JVM 需要更多内存,并决定将 "space" 重新用于其他目的。
1) 分配该对象的内存刚刚被垃圾收集器标记为空闲。 Java 有一个连续的内存 space 在开始时分配(想象一下在 c 或 c++ 中分配一个巨大的指针)当你创建一个对象时,内存管理系统将它放在那里(对象 x 在 n 之间分配)和 m 地址)当对象被删除时,gc 只是将 n 和 m 标记为空闲。 这个过程比较复杂,但是你可以简单地想象成这样(你可以阅读关于生成和压缩的内容以便更好地理解:)
2) 简单来说,gc 在 Java 应用程序的应用程序启动时启动的线程上运行。一些重要的术语:generations(地址spaces的类型),heap(分配内存的地址space)
What actually happens to that object inside the memory? In general term - when the object is eliminated - how the computer handles the elimination? how the elimination works?
内存没有直接返还给操作系统。内存现在可以免费用于 JVM 的未来对象分配。这意味着没有显式删除,引用对象的内存现在可以自由使用。因为来自 OS 的内存分配已经由 JVM 完成,所以 仅在某些 GC 内存中返回 给系统,其 frequency/behavior 也可以通过 GC 显式设置params 但它是复杂的操作,因为它带有成本。
正在进行优化此行为的工作,例如:查看 openjdk 12 热点工作:https://openjdk.java.net/jeps/346
您被常用术语“垃圾收集器”误导了,这是用词不当。 “垃圾收集器”不收集垃圾
所以你的问题以错误的前提开始:
Let's say garbage collector has identified an instance of a class (an object) - which is not being used by the Java Program. So the Garbage Collector decides to eliminate that object since it is not being used anywhere in the code.
这两件事都没有发生。垃圾收集器不会识别单个未使用的对象,也不会“销毁”任何对象,因为对象的销毁不是一回事。
垃圾收集器通过确定哪些对象仍在使用来工作,通常是通过遍历所有对象引用,从根集开始,即仍然[=49=的局部变量] 由 bootstrap 加载程序加载的 类 的线程和静态字段。
当它知道哪些对象仍在使用时,这些对象之间的间隙就是可回收内存,而不管之前有多少对象存储在那里。它可能只是将这些内存块添加到可用内存列表中,但大多数现代垃圾收集器会重新定位仍在使用的对象,以获得连续的空闲内存块,以实现快速分配并防止碎片化。
所以
- What actually happens to the garbage collected object?
“收集”的对象没有任何反应。死对象与进程完全无关。
- What are the names of these processes called in Java or in computer science terms?
这个通用术语仍然是“垃圾收集”,即使它的字面意思并没有描述实际过程。有时它被称为“内存管理”,更合适,通常,内存管理器也负责分配,因此也决定了堆的组织方式。
在典型的实现中,您可以将子任务标识为
- 标记
识别仍在使用的对象的过程(也称为跟踪) - 扫一扫
通过间隙的过程,将它们添加到可用内存列表或为以下过程之一准备它们: - 正在复制
将特定内存区域的活动对象重新定位到新区域,以便源区域之后完全空闲 - 正在压缩
将特定内存区域的一些活动对象重新定位到同一区域,填充间隙,以便该区域在开始或结束时具有连续的空闲内存