我正在处理System.in
中的10 GB的内存,但是在使用gradle应用程序插件时始终会耗尽堆空间。我像mawk -f preprocess-logs.awk logs.txt | ./gradlew run
一样将一个程序的输出传递到Java中,但是在处理了大约200万行时不断遇到以下错误(从htop
看时,大约消耗了1GB的内存)
到期守护进程,因为jvm占用空间已耗尽
我的build.gradle
(不需要的部分除外)如下:
apply plugin: 'application'
mainClassName = "com.PostgresLogLoader"
run {
standardInput = System.in
}
然后我用BufferedReader消耗System.in
BufferedReader csvReader = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = csvReader.readLine()) != null){ /* do work */ }
如果我构建可执行jar并直接使用,则绝不会耗尽堆空间。看来我正在消费standardInput
的方式越来越不受限制。我希望每次运行并继续使用./gradlew run
时都不必构建可执行文件。有什么想法吗?