什么是实时系统的良好日志库(快速没有对象创建)?

时间:2012-03-28 17:47:42

标签: java linux optimization garbage-collection real-time

我尝试了回归,但它造成了大量的垃圾。有没有人听说过实时Java的好东西?


@Bernie:我做了一个循环记录1M缓存的消息,GC疯了。

3 个答案:

答案 0 :(得分:15)

我有一个可以在微秒内记录文本或二进制数据的库,而不会产生垃圾甚至是系统调用。

https://github.com/peter-lawrey/Java-Chronicle

日志也可以通过任意数量的读取过程实时读取,为您提供一个持久化队列,每秒可以处理超过500万条消息。

答案 1 :(得分:2)

您可以查看由Coral Blocks(我所属的)设计的CoralLog产生零垃圾,并且在记录64字节消息时平均延迟为53纳秒。就吞吐量而言,它可以记录每秒260万条64字节消息时间戳和每秒350万条64字节消息没有时间戳。可以看到完整的基准测试结果here

如果将邮件大小减少到16个字节,那么您可以每秒记录520万条消息而无需时间戳。

以下是简单的吞吐量测试:

package com.coralblocks.corallog.bench;

import java.io.File;
import java.nio.ByteBuffer;

import com.coralblocks.corallog.AsyncThread;
import com.coralblocks.corallog.Log;
import com.coralblocks.corallog.Logger;

public class PerformanceTest4 {

    public static void main(String[] args) throws Exception {

        int batchSize = Integer.parseInt(args[0]);
        int passes = Integer.parseInt(args[1]);
        int msgSize = Integer.parseInt(args[2]);

        byte[] msgBytes = new byte[msgSize];

        // build a dummy message:
        for(int i = 0; i < msgBytes.length; i++) {
             msgBytes[i] = (byte) String.valueOf(i % 10).charAt(0);
        }

        ByteBuffer bb = ByteBuffer.wrap(msgBytes);

        Log.setIncludeTopHeader(false);

        String dir = ".";
        String filename = "throughput.log";

        Logger logger;
        boolean isMmap = System.getProperty("logMemoryMappedFile", "true").equals("true");

        if (isMmap) {
            logger = Log.createMemoryMappedLogger(dir, filename, null /* no timestamps */, false /* not synchronized */, true /* asynchronous */);
        } else {
            logger = Log.createLogger(dir, filename, null, false, true);
        }

        int count = 0;

        while(count < passes) {

            long start = System.nanoTime();

            for(int i = 0; i < batchSize; i++) {
            bb.position(0);
            logger.log(bb);
            }

            long time = System.nanoTime() - start;

            double seconds = (((double) time) / 1000000000L);

            System.out.println("Batch " + (count + 1) + " took: " + seconds + " s");

            count++;
        }

        logger.drainCloseAndWait();

        boolean deleteFile = System.getProperty("deleteFile", "true").equals("true");

        if (deleteFile) {
            File f = new File(dir, filename);
            f.delete();
        }

        AsyncThread.drainAndDie(); // just so the vm will exit... (async thread is not daemon)
    }
}

答案 2 :(得分:0)

Javolution提供日志记录功能。

来自LogContext javadoc:

  

使用system out / err,标准日志记录可以运行相同的代码   (java.util.logging),Log4J甚至OSGI日志服务。选择即可   通过configuration)在运行时完成。

('configuration'指的是Javolution类。)