[英]Is there a relatively easy way to implement the retain/release memory management mechanism from Objective-C in Java?
我能想到的唯一方法是创建Object的子类并添加保留/释放方法,以增加/减少计数器,在该计数器上具有观察器,该观察器在调用后调用也位于Object子类中的解构函数解构函数,您将使用本机调用释放内存。
问题是所有对象都必须扩展这个新的子类,而不是向后兼容的,你们能想到一种更好的方法吗?
不知道为什么要这么做,但要使其与每个类一起使用,要有一个全局对象,您将该对象发送给保留和释放方法,以及计划保留/释放的对象。
这个全局对象可以简单地将它们放入具有保留计数的集合中,这与挂接到该对象相同,对吗?
memoryManager.retain(obj);
memoryManager.release(obj);
请记住,如果您模仿的是Objective-C(而不是ARC),则该对象无需跟踪其引用的内容。 相反,程序员会对此进行跟踪,并且“手动”会按要求保留/释放。 无需自动跟踪链接的对象。
真正需要模仿的是一个(咳嗽)单身人士,该人支持retain(Object)
和release(Object)
方法,并在内部管理指向引用计数的对象指针映射。 映射中的对象指针确保该对象将一直存在,直到计数变为零为止(当将删除Map条目时)。 在计数变为零之后,但是在删除Map条目之前,您可以调用对象的dealloc
方法(如果有一个-测试它是否实现Dealloc接口)。
(但我发现这与SomeGuy的建议基本相同。)
您已经知道它是完全没有用的,因为垃圾收集器会处理所有事情。
另外,保留/释放实际上不是垃圾收集机制,而是保留计数器。 Objective-c提供其“垃圾收集器”,但仅在OSX平台上可用,而在iOS上不可用。
要回答您的问题,模仿Objective-C的唯一方法是深入JVM的根源。 看一下sun.misc.Unsafe
类,您可以在其中访问直接内存(有一些限制),然后声明变量并释放它们。 不幸的是,我目前在公司防火墙后面,所以我不能给你任何链接。 稍后再试。 只是谷歌的Java直接内存访问和类似的短语。
一些链接,我将尽快添加更多:
无论如何,我不会花太多时间在此上,而是开始阅读有关JVM和垃圾收集器调优的文章,您将获得很少有人拥有的技能。
好读:-)
我不知道你为什么要这么做,但是我们开始
public class ReferenceCountedObject
{
private int referenceCount;
public ReferenceCountedObject()
{
this.retain();
}
public synchronized ReferenceCountedObject retain()
{
referenceCount++;
return this;
}
public synchronized void release()
{
if (referenceCount == 1)
{
this.dealloc();
}
else
{
referenceCount--;
}
}
protected void dealloc()
{
// memory will be freed by GC
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.