RTI DDS内存释放
RTI DDS memory release
我听说 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 将无法正常运行,除非通过首先执行复制(因此我没有保留对原始文件的引用)并在 reader 上调用 return_loan 来明确释放它。这对我来说没有意义,因为我希望在清除序列后清除引用。
这是准确的吗?每次 DTO 进来时我真的需要复制吗?我希望尽可能减少开销,因为这些 DTO 将以相对较高的速率发送。
是(copy_from),或提取您要查找的信息然后release_loan。
您在内部使用由中间件管理的数据。
当您在获取(或读取)和 release_loan 之间时,保证数据处于一致状态。
如果您持有对内部 (DDS) 内存的引用,并且 release_loan,您如何知道您查看的数据(稍后)不在更新过程中? (在 Java 中,无论如何都会出现并发内存访问异常)。
请记住,您正在使用的内部结构 不是 Java,它们保存在 c 库(JNI 连接)中。 Connext 确保数据一致和连贯的唯一方法是通过 loan/release_loan 机制。
所以:深拷贝然后放贷
我听说 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 将无法正常运行,除非通过首先执行复制(因此我没有保留对原始文件的引用)并在 reader 上调用 return_loan 来明确释放它。这对我来说没有意义,因为我希望在清除序列后清除引用。
这是准确的吗?每次 DTO 进来时我真的需要复制吗?我希望尽可能减少开销,因为这些 DTO 将以相对较高的速率发送。
是(copy_from),或提取您要查找的信息然后release_loan。
您在内部使用由中间件管理的数据。
当您在获取(或读取)和 release_loan 之间时,保证数据处于一致状态。
如果您持有对内部 (DDS) 内存的引用,并且 release_loan,您如何知道您查看的数据(稍后)不在更新过程中? (在 Java 中,无论如何都会出现并发内存访问异常)。
请记住,您正在使用的内部结构 不是 Java,它们保存在 c 库(JNI 连接)中。 Connext 确保数据一致和连贯的唯一方法是通过 loan/release_loan 机制。
所以:深拷贝然后放贷