Java 写入日志文件时保存RAM

Java 写入日志文件时保存RAM,java,io,filewriter,Java,Io,Filewriter,我在服务器上启动Java程序时遇到RAM问题。我认为问题是因为我正在编写日志文件,日志文件可能非常大(超过100MB)。我正在寻找一种有效的方法来做到这一点,但我对可用的不同选项感到困惑 在看了一眼之后,我发现冲洗溪流是有帮助的,但是我不确定我应该上哪门课。我目前正在使用导致RAM问题的,我正在寻找最好的替代方案 我有一个关于冲洗小溪的问题。据我所知,字符串被附加到流中,然后在调用print方法或超出缓存内存时刷新。由于我正在编写日志文件,我认为这不是一个好的解决方案,因为如果程序在某个点崩溃,

我在服务器上启动Java程序时遇到RAM问题。我认为问题是因为我正在编写日志文件,日志文件可能非常大(超过100MB)。我正在寻找一种有效的方法来做到这一点,但我对可用的不同选项感到困惑

在看了一眼之后,我发现冲洗溪流是有帮助的,但是我不确定我应该上哪门课。我目前正在使用导致RAM问题的,我正在寻找最好的替代方案

我有一个关于冲洗小溪的问题。据我所知,字符串被附加到流中,然后在调用print方法或超出缓存内存时刷新。由于我正在编写日志文件,我认为这不是一个好的解决方案,因为如果程序在某个点崩溃,我想知道它的最后状态是什么。我说得对吗

我可以看到PrintSteam类有一个构造函数,它需要一个Writer和一个boolean来判断是否应该激活autoflush。这个类(从Writer继承)也有Write和flush方法,所以我很困惑。当我创建一个FileWriter,将其传递给PrintSteam,并在PrintStream上将autoflush设置为true时会发生什么?autoflush是否真的处于活动状态,我的意思是它是否会隐式调用FileWriter的flush方法

最后,我应该选择什么类来编写日志文件?同样,我的首要任务是保存RAM,并能够轻松跟踪崩溃/错误。我应该采用非缓冲区方法吗

谢谢

编辑:以下是我的代码:

output = new PrintWriter(filename, "utf-8");
output.println("Some info");
我认为这不是一个好的解决方案,因为如果程序在某个时候崩溃,我想知道它的最后状态是什么。我说得对吗

某种未捕获的异常将最终出现在进程的标准错误流中(在linux中),因此您可能会得到一些东西。希望您能够捕获异常并确保在这些情况下刷新日志。因此,如果你小心使用这种方法,你可以得到所有的信息

autoflush是否真的处于活动状态,我的意思是它是否会隐式调用FileWriter的flush方法

我相信so-flush会导致java将缓冲区写入磁盘。如果您提供了实验结果,可能还提供了来自jprofiler或其他堆分析工具的一些数据,那么就更容易提供帮助

最后,我应该选择什么类来编写日志文件

RAM和磁盘之间总是有一个缓冲区。您描述的这种基本方法应该能够将任意数量的日志写入磁盘,前提是您在退出之前要小心刷新缓冲区和关闭写入程序


尽管如此,对于一个非常常见的问题,改进这样一个低级别的方法很少有好处。我首先查看java.util.logging包。有些人甚至使用基于注入的面向方面编程来记录日志。日志记录可能是分布式系统的一个复杂部分,具有低延迟要求

您需要使用探查器来确保问题是因为您正在记录日志。我无法想象日志记录是真正的问题,除非您使用某种异步日志记录,将日志保存在内存中。@Augusto我发现当程序被系统终止时,日志文件不存在,这使我认为它是在执行结束时或一段时间后生成的。另外,程序在一个循环中一遍又一遍地做同样的事情,直到半个小时后它才被杀死。唯一改变的是记录数据的大小,因为相同的指令会重复。你认为呢?除非做了一些疯狂的事情(例如,一个巨大的缓冲区),否则写入文件不会导致内存问题。你能给我们看一下有问题的代码吗?@SlavaImeshev我正在更新我的帖子。