编年史队列减少内存映射文件以避免垃圾回收?

时间:2019-03-10 18:31:59

标签: memory-mapped-files chronicle chronicle-queue

我对《编年史》队列如何避免垃圾收集有疑问:

我了解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);
    }

}

1 个答案:

答案 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); 也被合并以减少垃圾。

这样,您可以编写和读取数百万条消息,但只能创建一个或两个对象。