我对《编年史》队列如何避免垃圾收集有疑问:
我了解Chronicle队列使用内存映射文件,因此它可以将对象保存到主内存或dist中,而不是保存到JVM中。但是,当处理器从主存储器反序列化对象时,它仍需要创建一个新实例。那么编年史队列到底在哪里避免垃圾收集?
请参阅以下来自Chronicle github示例的案例。当执行写/读操作时,它仍然需要使用MyObject创建一个新实例me = new MyObject(),并且“ me”将被垃圾收集。
public class Example {
static class MyObject implements Marshallable {
String name;
int age;
@Override
public String toString() {
return Marshallable.$toString(this);
}
}
public static void main(String[] args) throws IOException {
// will write the .cq4 file to working directory
SingleChronicleQueue queue = SingleChronicleQueueBuilder.builder().path(Files
.createTempDirectory("queue").toFile()).build();
ExcerptAppender appender = queue.acquireAppender();
ExcerptTailer tailer = queue.createTailer();
MyObject me = new MyObject();
me.name = "rob";
me.age = 40;
// write 'MyObject' to the queue
appender.writeDocument(me);
// read 'MyObject' from the queue
MyObject result = new MyObject();
tailer.readDocument(result);
System.out.println(result);
}
}
答案 0 :(得分:1)
您可以重用反序列化的对象。
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div class="w3-padding" data-bind="visible: contacts().length>0">
<div class="w3-container w3-blue">
<p>Title</p>
</div>
<div class="w3-responsive">
<table class="w3-table-all">
<tr class="w3-light-gray">
<!-- ko foreach: fields -->
<th style="width:125px" data-bind="text: name"></th>
<!-- /ko -->
</tr>
<tbody data-bind="template: { name: 'contactTemplate', foreach: contacts }"></tbody>
</table>
</div>
</div>
<script type="text/html" id="contactTemplate">
<tr>
<!-- ko foreach: $root.fields -->
<td><div data-bind="text: $parent[logicalName]"></div></td>
<!-- /ko -->
</tr>
</script>
// created once
MyObject result = new MyObject();
// this can be called multiple times with the same object
tailer.readDocument(result);
也被合并以减少垃圾。
这样,您可以编写和读取数百万条消息,但只能创建一个或两个对象。