文章目錄
- 一、報錯信息
- 二、問題分析
- 1、Windows 命令行的緩沖區機制
- 2、命令記錄設置
- 三、解決方案
- 1、設置 " 命令記錄 " 選項
- 2、將日志重定向到文件
一、報錯信息
Java 程序中 , 設置 無限循環 , 每次循環 休眠 10 秒后 , 再執行程序邏輯 , 在命令行中打印日志信息 ;
for (;;) {try {// 休眠 10 秒鐘Thread.sleep(10000);// 程序邏輯System.out.println("日志內容");} catch (Exception e) {e.printStackTrace();}
}
上述程序 運行了 2 天后 , 突然出現了 循環暫停情況 , 連續暫停了 幾十分鐘 到 數個小時 , 此時 在 命令行敲一下回車 , 程序再次恢復運行 ;
期間打印了大量的日志信息 , 大約有 30MB 左右 ;
二、問題分析
1、Windows 命令行的緩沖區機制
在 Windows 的 Cmd 或 PowerShell 中 , 默認的 屏幕緩沖區 大小有限 , 如果 程序輸出的日志超過 緩沖區容量 , 后續的 System.out.println() 操作會被阻塞 , 直到緩沖區騰出空間 ;
設置 保留的歷史緩沖區數量 , 若 開啟 " 丟棄舊的副本 ( Discard Old Duplicates ) " 選項 , 當 緩沖區滿時 會自動丟棄舊數據 , 避免阻塞 , 如果未開啟該選項 , 則 緩沖區滿后寫入操作會掛起 ;
當 用戶在 命令行窗口 敲擊回車時 , 會強制刷新緩沖區 , 釋放被阻塞的輸出操作 , 程序得以繼續運行 , 但是日志再輸出一些 , 幾小時內又會立刻寫滿 ;
2、命令記錄設置
Windows 命令提示符中的 命令記錄 設置 的 緩沖區大小、緩沖區數量 和 丟棄舊的副本 是控制命令行歷史記錄與顯示的關鍵設置 , 如下圖所示 :
緩沖區大小 ( Buffer Size ) 指 命令行窗口的 屏幕緩沖區 大小 , 即能夠存儲的歷史輸出行數 ;
緩沖區大小 默認值為 50 , 表示最多保存 50 行歷史記錄 , 若輸出內容超過此限制 , 舊內容會被 覆蓋或丟棄 , 取決于 " 丟棄舊的副本 " 選項設置 ;
緩沖區大小 設置為 更大值 可避免長文本被截斷 , 完整查看大量輸出內容 ;
緩沖區數量 ( Buffer Amount ) 是 存儲的歷史命令數量 , 用于控制歷史記錄的存儲容量 ;
丟棄舊的副本 ( Discard Old Duplicates ) 選項 用于 控制 超出緩沖區容量 時是否保留舊數據 ;
- 啟用 : 當輸出內容超出緩沖區大小時 , 自動丟棄 最舊的內容 ;
- 禁用 : 保留緩沖區內的所有內容 , 但新內容可能無法顯示 , 需手動滾動查看 ;
- 適用場景 : 需長期監控大量輸出時建議禁用 , 日常使用可啟用以減少內存占用 ;
三、解決方案
1、設置 " 命令記錄 " 選項
右鍵點擊 命令提示符 標題 , 在彈出的菜單中 , 點擊 " 屬性 " 選項 ;
在 " 命令提示符 " 屬性 對話框 的 選項 面板中 , 設置 命令記錄 選項 ,
設置 緩沖區大小 999 , 緩沖區數量 999 , 勾選 " 丟棄舊的副本 " 選項 ;
2、將日志重定向到文件
通過命令行啟動程序時 , 將 命令行輸出 重定向到文件 ;
java Main > log.txt 2>&1
上述命令 可以 將 Java 程序 Main 的標準輸出和標準錯誤全部重定向到文件 log.txt 中 ;