解决:java -jar 在cmd中运行 程序卡顿,卡死的 问题。BIO和NIO案例保存
解决
- 怎么解决,就是 日志别输出到 cmd 就行了。就行了。就行了。
java -jar demo.jar > output.log 2>&1 &
- 最近写东西,遇到了 程序偶尔卡死的情况。是java -jar 启动的。
- 具体卡死为:http请求超级卡顿 或 偶尔反应好多个请求,或 tcp Server 粘包,无法收取消息。
- 直到:我晃了晃 cmd 窗口,最大化,最小化,程序竟然动了,日志又输出了。
- 终于终于明白了,Window cmd 即要保证正常输出,又要保证性能不卡死你的程序
- 那你的程序又输出了很多很多日志,那cmd窗口怎么办呢,只有卡死你的程序了。
怀疑流程
- 因为遇到的是 http请求 和 tcp server 或同时能用,同时不能用,或只能用一个。
- 怀疑1:是 bio tcp server出现了问题,用了 nio 还一样,疯了。
- 怀疑2:spring boot 或 spring框架的问题 或 开线程等等问题,最终各种启动 config配置类,配置bean。在 main方法。使用postConstruct 等等等
- 最后还是没找到问题
//ApplicationContext context//@PostConstruct//@Async@EventListener(ApplicationReadyEvent.class)/*@Componentpublic class TcpServerListener implements ApplicationListener<WebServerInitializedEvent> {@Autowiredprivate UpdateServer updateServer;@Overridepublic void onApplicationEvent(WebServerInitializedEvent event) {//int serverPort = event.getWebServer().getPort();// 在此处添加代码以创建和启动 TCP 服务器updateServer.startServer(8082);}}*/
BIO
//@Component
public class UpdateServer {/*@SpringBootApplicationpublic class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}@EventListener(ApplicationReadyEvent.class)public void startServerSocket() throws IOException {// 创建ServerSocket并绑定端口ServerSocket serverSocket = new ServerSocket(8080);// 启动一个新线程来接受客户端连接new Thread(() -> {while (true) {try {// 接受客户端连接Socket clientSocket = serverSocket.accept();// 处理客户端请求,可以在这里实现自己的逻辑// 关闭客户端连接clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}).start();}}*//*@Componentpublic class TcpServerListener implements ApplicationListener<WebServerInitializedEvent> {@Autowiredprivate UpdateServer updateServer;@Overridepublic void onApplicationEvent(WebServerInitializedEvent event) {//int serverPort = event.getWebServer().getPort();// 在此处添加代码以创建和启动 TCP 服务器updateServer.startServer(8082);}}*//*** TCP升级网关*///@Resource//private TcpUpdateMapper tcpUpdateMapper;/*** Redis*///@Resource//private RedisUtil redisUtil;//new Thread(() -> { }).start();//@PostConstruct//@Async/*public void startServer() throws Exception {//开启TCP ServerServerSocket serverSocket = new ServerSocket(8082);log.info("服务端打开了 Server started on port {}", 8082);while (true) {//等待连接Socket socket = serverSocket.accept();//获取 输入流DataInputStream inputStream = new DataInputStream(socket.getInputStream());DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());log.info("服务端收到了连接:Accepted connection from client: {}", socket.getInetAddress());//读取的字节数byte[] buffer = new byte[380];//1024//真正读取到了多少个int bytesRead;//循环进行读取while ((bytesRead = inputStream.read(buffer)) != -1) {//处理二进制数据processBinaryData(buffer, bytesRead, socket, outputStream);}//循环读取,正常每次都会读取完毕inputStream.close();outputStream.close();socket.close();}//死循环接收连接}//初始化方法结束*///关闭输入流//socket.shutdownInput();//关闭输出流,关闭 Socket//socket.shutdownOutput();//关闭Socket//socket.close();
NIO
@Configuration
public class TcpServerConfig {/*** TCP升级网关*/@Resourceprivate TcpUpdateMapper tcpUpdateMapper;/*** Redis*/@Resourceprivate StringRedisTemplate stringRedisTemplate;@Value("${tcp.ip}")private String tcpIp;//ApplicationContext context//@PostConstruct//@Async@EventListener(ApplicationReadyEvent.class)public void startServer() {// throws IOException//异步执行//ThreadUtil.execAsync(() -> {try {//打开选择器Selector selector = Selector.open();//打开通道ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//非阻塞serverSocketChannel.configureBlocking(false);//本机IPserverSocketChannel.bind(new InetSocketAddress(tcpIp, 8082));//进行注册serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);log.info("===============Server started on port 8082===================");while (true) {//打开通道int readyChannels = selector.select();//校验下if (readyChannels == 0) {continue;}//获取所有的keySet<SelectionKey> selectedKeys = selector.selectedKeys();//取得迭代器Iterator<SelectionKey> keyIterator = selectedKeys.iterator();//如果存在while (keyIterator.hasNext()) {//获取这个keySelectionKey key = keyIterator.next();//如果是个连接if (key.isAcceptable()) {//打开这个通道SocketChannel clientSocketChannel = serverSocketChannel.accept();//非阻塞的clientSocketChannel.configureBlocking(false);//注册为可读clientSocketChannel.register(selector, SelectionKey.OP_READ);log.info("收到连接:Accepted connection from: {}", clientSocketChannel.getRemoteAddress());} else if (key.isReadable()) {//如果是可读,获取通道SocketChannel clientSocketChannel = (SocketChannel) key.channel();//读取数量ByteBuffer buffer = ByteBuffer.allocate(38);//1024//真实读取到了多少个int bytesRead = -1;try {//这里报错了,增加防护,如果防护,这个nio就断了bytesRead = clientSocketChannel.read(buffer);} catch (Exception e) {log.info("未读取到");e.printStackTrace();}//未读取到 关闭if (bytesRead == -1) {clientSocketChannel.close();} else if (bytesRead > 0) {//读取到了buffer.flip();//读到这个字节里byte[] data = new byte[bytesRead];buffer.get(data);//处理逻辑processBinaryData(data, bytesRead, clientSocketChannel);//String message = new String(data).trim();//System.out.println("Received message: " + message);//清理buffer.clear();}//读到了}//是可读的//移除keykeyIterator.remove();}//如果存在}//死循环} catch (Exception e) {e.printStackTrace();}//}, "MyTcpServerThread").start();
}
//有错误,往外层抛private void sendUpdateMessage(SocketChannel clientSocketChannel) {//去空格redisData = redisData.replace(" ", "");//转为bytebyte[] binaryData = hexStringToBytes(redisData);//申请字节ByteBuffer buffer = ByteBuffer.allocate(binaryData.length);//写入buffer.put(binaryData);buffer.flip();//循环写入while (buffer.hasRemaining()) {try {clientSocketChannel.write(buffer);log.info("发送了一次升级的消息");} catch (IOException e) {log.info("发送升级失败");e.printStackTrace();}}}
相关文章:
解决:java -jar 在cmd中运行 程序卡顿,卡死的 问题。BIO和NIO案例保存
解决 怎么解决,就是 日志别输出到 cmd 就行了。就行了。就行了。 java -jar demo.jar > output.log 2>&1 &最近写东西,遇到了 程序偶尔卡死的情况。是java -jar 启动的。具体卡死为:http请求超级卡顿 或 偶尔反应好多个请求&…...
LeetCode第824题 - 山羊拉丁文
题目 解答 String toGoatLatin(String S) {if (S null) {return "";}S S.trim();if (S.isEmpty()) {return "";}StringBuilder sb new StringBuilder();String[] tokens S.split(" ");for (int i 0, j 1, length tokens.length; i <…...

[Python] 什么是逻辑回归模型?使用scikit-learn中的LogisticRegression来解决乳腺癌数据集上的二分类问题
什么是线性回归和逻辑回归? 线性回归是一种用于解决回归问题的统计模型。它通过建立自变量(或特征)与因变量之间的线性关系来预测连续数值的输出。线性回归的目标是找到一条直线(或超平面),使得预测值与观…...

那些不输于乙游男主人设的国漫男主
最近乙游的势头越来越猛,新宠旧爱一起上阵,叫人应接不暇。在二次元的世界里,乙游男主们凭借着超凡的魅力,成为了无数少女心中的理想对象。他们或冷酷、或温柔、或阳光、或神秘,每一个角色都有着独特的性格和故事。 乙游…...

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析,Doris 1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…...

关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式
关于华为应用市场上架过程中出现的【您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(存储、拍照)等权限,不符合华为应用市场审核标准。】 使用方式: 1、引入 import permision from "/m…...
【ElasticSearch】概述
文章目录 ElasticSearch1.基本介绍2.设计理念3.基本架构与核心概念学习参考资料: ElasticSearch 简单整理ES基本概念,设计理念,构建与使用,供回顾。 1.基本介绍 Elasticsearch 是一个基于 Apache Lucene 的开源的分布式搜索引擎…...
十进制转十六进制 C/C++蓝桥杯基础试题BASIC-10
问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是…...

【LVGL环境搭建】
LVGL环境搭建 win模拟器环境搭建一.二.三.四.五. Ubuntu模拟器环境搭建一. 前置准备二. 下载LVGL Source code:三. 安装sdl2:四. 开启VScode执行五. 安装扩展套件六. 按F5执行七. 执行结果 win模拟器环境搭建 一. 二. 三. 四. 五. Ubuntu模拟器环境…...

【c语言】简单贪吃蛇的实现
目录 一、游戏说明 编辑 二、地图坐标 编辑 三、头文件 四、蛇身和食物 五、数据结构设计 蛇节点结构如下: 封装一个Snake的结构来维护整条贪吃蛇: 蛇的方向,可以一一列举,使用枚举: 游戏状态&a…...
2023年09月CCF-GESP编程能力等级认证Python编程六级真题解析
Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…...

Flink中StateBackend(工作状态)与Checkpoint(状态快照)的关系
State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储,每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。另外,Operator state 也保存在机器节点本地。Flink 定期获取所有状态的快照,并将这些快照复制到持…...

【C语言刷题系列】喝汽水问题
文章目录 一、文章简介 1.先买再换 1.1 代码逻辑: 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑: 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…...
[C++] C++ 11的functional模块介绍和使用案例
functional模块介绍 functional模块是C 11提供了一组函数对象和算法,用于增强C的函数式编程能力。该模块中的函数对象和算法可以大大简化代码,并提供了一些有用的工具,例如函数适配器和函数对象的组合。 functional模块中的函数对象包括&am…...

kubernetes基本概念和操作
基本概念和操作 1.Namespace1.1概述1.2应用示例 2.Pod2.1概述2.2语法及应用示例 3.Label3.1概述3.2语法及应用示例 4.Deployment4.1概述4.2语法及应用示例 5.Service5.1概述5.2语法及应用示例5.2.1创建集群内部可访问的Service5.2.2创建集群外部可访问的Service5.2.3删除服务5.…...
20240128周报-网络太杂,Tomcat太难
今天来做个小总结吧,之前说想用几个月的时间将Java生态给整理一遍,该工作已经进入第三周了。先和各位老老板汇报一下上一周的工作,然后说一下本周的计划和后面的计划。 1.上周工作 上周的计划是将网络和Tomcat的内容梳理一番,但…...

DES加密原理
DES加密算法综合运用了置换、代替、代数等多种密码技术,具有设计精 巧、实现容易、使用方便等特点。DES加密算法的明文、密文和密钥的分组长度 都是64位,详细的DES加密算法结构如图6-10所示。 图6-10 DES加密算法结构图 DES加密过程如下所示ÿ…...

react 之 useCallback
简单讲述下useCallback的使用方法,useCallback也是用来缓存的,只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…...

OfficeWeb365 Readfile 任意文件读取漏洞复现
0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 Rea…...
UnityShader(十三)Unity内置的函数
在计算光照模型时我们需要得到许多数据,比如光源方向、视角方向这种基本信息。 在之前的例子中都是自行在代码里计算的,比如: normalize(_WorldSpaceLight0Pos.xyz) 得到光源方向(这种方法实际只适用平行光) normaliz…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...