繁体   English   中英

有没有一种相对简单的方法可以从Java中的Objective-C实现保留/释放内存管理机制?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM