当前位置: 首页 > news >正文

【错误记录】Windows 命令行程序循环暂停问题分析 ( 设置 “ 命令记录 “ 选项 | 启用 “ 丢弃旧的副本 “ 选项 | 将日志重定向到文件 )

文章目录

  • 一、报错信息
  • 二、问题分析
    • 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 中 ;

http://www.xdnf.cn/news/63469.html

相关文章:

  • 利用WSL2的镜像功能访问Windows下的所有网卡
  • SpringBoot自定义验证器:企业级参数校验架构设计与实践
  • 每日学习Java之一万个为什么
  • 用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置
  • 学习海康VisionMaster之垂线查找
  • 【大数据分析】Apache Doris高性能实时分析数据库:MPP架构下的多场景应用与优势分析以及部署应用
  • Spark-SQL连接Hive全攻略
  • (mamba_ssm)安装踩坑指南
  • JavaScript与TypeScript
  • Buildroot、BusyBox与Yocto:嵌入式系统构建工具对比与实战指南
  • 【C++教程】C++中为什么优先使用 cout/cin流
  • 【自然语言处理与大模型】模型压缩技术之剪枝
  • 可穿戴无线生理信号采集贴片产品市场需求简析
  • 关于ORM
  • numpy、pandas内存优化操作整理
  • 【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(上)
  • Web 前端打包工具与构建系统的进阶指南
  • Kafka 生产者的幂等性与事务特性详解
  • 归一化对C4.5决策树无效的数学原理与实证分析
  • 配置 VS Code 使用 ESLint 格式化
  • 利用课程编辑器创新教学,提升竞争力​
  • VSCode连接服务器跑深度学习代码相关问题(研0大模型学习第八天)
  • 【软件工程】软件测试基础知识
  • 在springboot3.4.4和jdk17环境下集成使用mapstruct
  • 使用Postman调测“获取IAM用户Token”接口实际操作
  • 性能比拼: Nginx vs Apache
  • nn.LayerNorm():对输入张量的最后一个维度(特征维度)进行归一化
  • 【目标检测】目标检测综述 目标检测技巧
  • 全球首个人形机器人半程马拉松技术分析:翻车名场面背后的突破与挑战
  • DeepSeek赋能Nuclei:打造网络安全检测的“超级助手”