当我在服务器上启动Java程序时,我遇到了RAM问题。我认为这个问题是因为我写的日志文件非常大(超过100MB)。我正在寻找一种有效的方法来解决这个问题,并且我对可用的不同选项感到困惑。
看了Oracle documentation之后,我已经看到了刷新这条信息流可能会有所帮助,但我不确定哪个不同的类我应该去。我目前正在使用导致内存问题的PrintWriter class,而且我正在寻找最佳替代方案。
我有一个关于刷新流的问题。根据我的理解,字符串被附加到流,然后在调用 print 方法或超出缓存内存后刷新。由于我正在编写日志文件,我认为这不是一个好的解决方案,因为如果程序在某个时候崩溃,我想知道它的最后状态是什么。我是对的吗?
我可以看到 PrintSteam 类有一个构造函数,需要一个 Writer 和一个布尔值,告诉是否应该激活 autoflush 。 FileWriter类(继承自Writer)也有 Write 和 flush 方法,所以我很困惑。当我创建 FileWriter ,将其传递给 PrintSteam ,并将 autoflush 设置为 true 时,会发生什么? EM> PrintStream的? autoflush 是否真的有效,我的意思是它会隐式调用 FileWriter 的 flush 方法吗?
最后,我应该去编写我的日志文件的类是什么?同样,我的首要任务是节省RAM并能够轻松跟踪崩溃/错误。我应该采用非缓冲方式。
由于
编辑:这是我的代码:
output = new PrintWriter(filename, "utf-8");
output.println("Some info");
答案 0 :(得分:1)
我认为这不是一个好的解决方案,因为如果程序在某个时候崩溃,我想知道它的最后状态是什么。我是对的吗?
有点 - 未捕获的异常将最终出现在您的进程的标准错误流中(在linux中),因此您可能会得到一些东西。希望您捕获异常并确保在这些情况下您的日志刷新。所以,如果你小心这种方法,你可以获得所有的信息。
autoflush是否真的有效,我的意思是它会隐式调用FileWriter的flush方法吗?
我相信 - flush会导致java将缓冲区写入磁盘。如果您提供实验结果以及jprofiler或其他堆分析工具中的某些数据,则可以更轻松地提供帮助。
最后,我应该用什么类来编写我的日志文件?
RAM和磁盘之间总会有缓冲区。您描述的这种基本方法应该能够将任意数量的日志写入磁盘,前提是您在退出之前注意刷新缓冲区并关闭编写器。
话虽如此,对于一个非常常见的问题,改进这种低水平的方法很少有好处。我首先查看java.util.logging包。有些人甚至使用基于面向方面编程的注入进行日志记录。日志记录可能是具有低延迟要求的分布式系统的复杂部分。