我尝试了回归,但它造成了大量的垃圾。有没有人听说过实时Java的好东西?
@Bernie:我做了一个循环记录1M缓存的消息,GC疯了。
答案 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类。)