RTI DDS内存释放

时间:2017-08-03 16:52:41

标签: java data-distribution-service

我告诉DDS维护对使用示例代码时创建的DTO的引用:

 public void on_data_available(DataReader reader) {
        HelloWorldDataReader HelloWorldReader =
            (HelloWorldDataReader)reader;

        try {
            HelloWorldReader.take(
                _dataSeq, _infoSeq,
                ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                SampleStateKind.ANY_SAMPLE_STATE,
                ViewStateKind.ANY_VIEW_STATE,
                InstanceStateKind.ANY_INSTANCE_STATE);

            for(int i = 0; i < _dataSeq.size(); ++i) {
                SampleInfo info = (SampleInfo)_infoSeq.get(i);

                if (info.valid_data) {
                    System.out.println(
                        ((HelloWorld)_dataSeq.get(i)).toString("Received",0));


                }
            }
        } catch (RETCODE_NO_DATA noData) {
            // No data to process
        } finally {
            HelloWorldReader.return_loan(_dataSeq, _infoSeq);
        }
    }
}

在将DTO传递给我的其余代码之前,是否需要使用copy_from方法?给出的解释是RTI保留了对DTO的引用,并且只是在接收到新数据时更新字段而不是创建新的HelloWorld DTO。解释说DTO不会正常运作,除非通过首先执行副本(因此我没有持有对原文的引用)并在阅读器上调用return_loan来明确释放它。这对我来说没有意义,因为我希望清除序列后清除引用。

这准确吗?我真的需要每次DTO进来复制吗?我希望尽可能减少开销,因为这些DTO将以相对较高的速率发送。

1 个答案:

答案 0 :(得分:0)

是(copy_from),或者提取您要查找的信息,然后发布release_loan。

在内部,您使用的是由中间件管理的数据。

当您处于take(或read)和release_loan之间时,保证数据处于一致状态。

如果你持有对内部(DDS)内存和release_loan的引用,你怎么知道你所看到的数据(以后)还没有被更新? (在Java中,无论如何都会获得并发内存访问异常)。

请记住,您使用的内部是而不是 Java,它们保存在c库(JNI连接)中。 Connext确保数据一致和连贯的唯一方法是通过loan / release_loan机制。

所以: 深层复制,然后释放贷款。