我一直在编写一个 Java 客户端,它使用JDI在远程 JVM 中创建和修改对象(通过连接到在远程 JVM 中运行的基于JDWP代理的服务器)。我的项目的要求之一是我不能暂停远程 JVM 中的所有线程,这意味着我创建的对象在我可以在 JVM 中访问它们之前可能会受到垃圾收集的影响。
在某些情况下,我在远程 JVM 中创建对象,但它们是随机被垃圾收集的。例如,如果我通过 在远程 JVM 中创建一个数组ArrayType.newInstance(int)
,有时该数组将被垃圾收集,然后我才能使其从远程 JVM 中的另一个可访问对象“可访问”。
(例如,如果我试图将新数组存储到现有可访问对象的字段中,则调用ObjectReference.setValue(Field, Value)
可能会随机抛出一个. ObjectCollectedException
):
void createAndStoreArray(ObjectReference reachableObj, Field fieldOfObj, ArrayType type, int length)
{
ArrayReference ref = type.newInstance(length);
reachableObj.setValue(fieldOfObj, ref); // Sometimes throws ObjectCollectedException because ref's mirror garbage gets collected before I can store it on the reachable object
}
从理论上讲,aObjectReference
的镜像甚至可以在我能够调用之前被垃圾收集ObjectReference.disableCollection()
(无论如何,由于其他原因,我不想采取这个步骤)。
所以我的问题是,JDI 上是否有任何记录在案Value
的寿命保证?
- 远程 JVM 中原始值的镜像是否免于 GC?(有人认为会是,但方法文档中没有任何说明。)
VirtualMachine
. mirror*()
- 字符串的镜像是否免于 GC?(有人会认为不是,但 JavaDoc 似乎保持沉默。)
- 我假设任何其他人
ObjectReference
都可以随时进行 GC,除非您之前设法在其上禁用 GC?
在此先感谢您的帮助!