2023工作中遇到问题一

1、vue中模拟鼠标点击下拉框

<xxx-select
ref="aaa"
:value="form.serviceCharge"
placeholder="请输入"
@add="(value) => getBasGoods(value)"
:configInfo="configInfo"
/>

vue中模拟鼠标点击

this.$refs.aaa.$el.click()

2、springboot服务假死

linux服务器查看cpu和内存

top -c

在这里插入图片描述

可以看到pid为29542的进程占用内存在导出时一直升高,查看进程堆栈信息:

jstack 29542

在这里插入图片描述

在这里插入图片描述

发现有很多线程都在WAITING,同时在堆栈信息中找到基础服务的一个导出相关业务日志,通过top -c命令观察这个导出操作前后的cpu和内存资源变化,发现大数据量导出时内存在持续上升,直至服务假死。

3、linux创建root权限账号并修改密码

sudo useradd -ou 0 -g 0 fox
sudo passwd fox

4、springboot服务假死

实时监控服务内存及gc情况

jstat -gc <java_pid> 5000

在这里插入图片描述

发现进程随着启动时间越来越长,年轻代和老年代内存使用率越来越高,导致频繁gc

通过服务器上安装的arthas工具查看

java -jar arthas-boot.jar 13156

在这里插入图片描述

通过arthas导出dump文件

heapdump /tmp/1/dump.hprof

使用visualvm分析dump文件,发现大对象中排在前面的对象多数都和swagger有关

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

解决方法:正式分支代码去除swagger自动配置

修改后服务重新启动,运行一段时间后观察内存占用稳定,没有出现内存打满的情况。

5、seata死锁问题

业务场景:微服务A和B操作的是同一条数据,A在对数据进行修改后,经过一些列判断调用B,B在经过一些业务处理后对数据进行删除。

现象:A在调用B后进入阻塞等待,B在执行到对数据进行删除的操作时阻塞,日志未打印删除语句,B服务经过近5分钟阻塞后打印删除语句,以及一条SELECT FOR UPDATE 语句,日志显示SELECT FOR UPDATE 语句执行花费近5分钟,此时看A的日志也阻塞结束,异常信息为调用超时

分析:在阻塞之后,看日志打印时间A的调用超时报错信息先出现,B的日志打印删除语句及SELECT FOR UPDATE 语句后出现,猜测是出现死锁,A超时后释放锁以后B才取得锁继续执行。且SELECT FOR UPDATE 语句在整个项目中都不存在,猜测和项目中使用的分布式事物框架seta可能有关。

查看seata官网文档,分析seata事物的流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据官网文档分析阻塞前后的流程:

  • A获取本地锁
  • A执行更新操作
  • 本地事务提交前,尝试拿该记录的全局锁
  • 本地事物提交,释放本地锁
  • A调用B,A进入阻塞等待
  • B获取本地锁
  • B进行删除操作前,先根据删除语句构建出前置镜像 TableRecords,执行sql语句,根据前置镜像的主键id构建出执行sql之后的查询sql语句,根据修改之后记录构建后置镜像(即B日志信息中的SELECT FOR UPDATE 语句)
  • SELECT FOR UPDATE 语句的执行会申请全局锁,如果 全局锁 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。
  • B进入阻塞等待
  • A调用超时,释放全局锁
  • B执行删除操作,打印SELECT FOR UPDATE 语句

6、在node节点执行kubectl命令报错

error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

问题原因:kubectl命令需要使用kubernetes-admin来运行

问题解决:

1.将主节点中的/etc/kubernetes/admin.conf文件拷贝到从node节点相同目录下

2.配置环境变量

[root@node-192-168-137-131 kubernetes]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@node-192-168-137-131 kubernetes]# source ~/.bash_profile

再次执行kubectl命令成功
在这里插入图片描述

这里我们会发现,为何不需要指定api-server地址就可以直接执行相关命令,那是因为刚刚我们从master节点拷贝过来的admin.conf这个配置文件存放的是k8s用户权限相关的配置!

7、远程debug

服务器jar包启动配置

nohup java -jar -Dloader.path=$GLOBAL_PATH/libs/xx -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=192.168.1.xx:5005  $JAVA_OPTS $SPD_WM > $SPD_WM_LOG 2>&1 &

本地idea配置

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

在这里插入图片描述

8、线上服务异常堆栈信息未打印

线上服务报错的时候,我们自然而然想到的是根据日志或者其他手段查看报错的具体异常,但是有些时候我们却发现异常没有堆栈信息。只有短短的异常类信息,例如
在这里插入图片描述

这种行为是JVM为了提升性能,对于JIT编译后的代码,在一定条件下使用预先生成的异常代替真正的异常对象,这些预先生成的异常没有堆栈,抛出速度非常快也无需额外分配内存。

JDK5中引入了-XX:-OmitStackTraceInFastThrow这个参数,具体可以看release note.

The compiler in the server VM now provides correct stack backtraces for all “cold” built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.

接下来,我们继续详细了解下触发异常fastthrow的触发条件和动机和关闭后的潜在影响。

FastThrow动机和触发条件

bool treat_throw_as_hot = false;
  ciMethodData* md = method()->method_data();

  if (ProfileTraps) {
    //如果有太多次,则 treat_throw_as_hot 为 true
    if (too_many_traps(reason)) {
      treat_throw_as_hot = true;
    }
    if (C->trap_count(reason) != 0
        && method()->method_data()->trap_count(reason) != 0
        && has_ex_handler()) {
        treat_throw_as_hot = true;
    }
  }

  if (treat_throw_as_hot
      && (!StackTraceInThrowable || OmitStackTraceInFastThrow)) {
    ciInstance* ex_obj = NULL;
    switch (reason) {
    case Deoptimization::Reason_null_check:
      //对于 NullPointerException 返回对应的空堆栈的内置 NullPointerException 对象
      ex_obj = env()->NullPointerException_instance();
      break;
    case Deoptimization::Reason_div0_check:
      //对于 ArithmeticException 返回对应的空堆栈的内置 ArithmeticException 对象
      ex_obj = env()->ArithmeticException_instance();
      break;
    case Deoptimization::Reason_range_check:
      //对于 ArrayIndexOutOfBounds 返回对应的空堆栈的内置 NullPoArrayIndexOutOfBoundsinterException 对象
      ex_obj = env()->ArrayIndexOutOfBoundsException_instance();
      break;
    case Deoptimization::Reason_class_check:
      if (java_bc() == Bytecodes::_aastore) {
        //对于 ArrayStoreException 返回对应的空堆栈的内置 ArrayStoreException 对象
        ex_obj = env()->ArrayStoreException_instance();
      } else {
        //对于 ClassCastException 返回对应的空堆栈的内置 ClassCastException 对象
        ex_obj = env()->ClassCastException_instance();
      }
      break;
    default:
      break;
    }

当某个 JDK 内置异常通过某一个方法抛出过多次数时(常见是 NullPointerException),自动省略异常堆栈,其实就是 Throwable.getOurStacktrace() 返回空数组。底层实现的方式是当这些异常被抛出时,会记录在方法的 method_data 中。当这些异常被抛出时,检查对应方法的 method_data 是否有过多次数的这些异常被抛出,如果有,则使用不含堆栈的异常对象替换原有异常对象从而实现异常堆栈被忽略。

那么从上面的jdk代码可以看出同时满足以下四个条件,异常才会被预定义的无堆栈异常替换。

  • treat_throw_as_hot, 一般就是hot exception, 该异常已经被抛过很多次了,具体怎么判定可以看你下面代码

    • 同样的异常抛出太多
    • 同样的异常抛出次数不为0以及方法拥有local-exceptionn-handler,那么将抛出的所有同类型异常都认为是hot。local-exception-handler是否存在取决于该方法或者调用路径上的任何一个caller方法是否有exception handler,需要读method的元数据。
  • !StackTraceInThrowable || OmitStackTraceInFastThrow, 由于这两个参数值默认都是true,所以默认整体条件满足。

  • 异常是设定内的五种异常

    • NullPointerException
    • ArithmeticException
    • ArrayIndexOutOfBoundsException
    • ArrayStoreException
    • ClassCastException

但是,我们一般会在 JVM 启动参数中加入 -XX:-OmitStackTraceInFastThrow 将其关闭,主要原因是:

  1. OmitStackTraceInFastThrow 这个参数仅针对某些 Java 内置异常(上面源码已经列出),对于我们自定义或者框架自定义的异常没用。
  2. 分析是否过多,仅对于抛出异常的方法,但是是否是同一调用路径,并没有考虑。
  3. 微服务线程可能会运行很长时间,我们业务日志量非常大,每一个小时产生一个新文件。假设某个方法每天抛出一定量的 NullPointerException 但是不多,并没有及时发现。日积月累,某一天突然就没有堆栈了。之后如果这个方法大量抛出 NullPointerException,我们却看不到堆栈,还得去挨个翻之前的日志,这样太低效率了。

关闭Fast Throw方法,添加启动参数:

-XX:-OmitStackTraceInFastThrow 

异常日志精简手段参考https://zhuanlan.zhihu.com/p/428375711

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/203992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典的回溯算法题leetcode全排列问题思路代码详解

目录 全排列问题 leetcode46题.全排列 leetcode47题.全排列II 对回溯算法感兴趣的朋友也可以多多支持一下我的其他文章。 回溯算法详解-CSDN博客 经典的回溯算法题leetcode组合问题整理及思路代码详解-CSDN博客 经典的回溯算法题leetcode子集问题思路代码详解-CSDN博客 …

AI文章生成器-免费批量原创文章生成的工具

在科技的大潮中&#xff0c;AI技术愈发成熟&#xff0c;文言一心文章生成器悄然崭露头角。这一创新性工具的出现&#xff0c;为广大用户提供了快速、高效的文章生成方式。147SEO的批量原创功能更是锦上添花&#xff0c;让文章创作变得更为轻松。正是在这背后&#xff0c;我们看…

iPhone苹果手机如何将词令网页添加到苹果iPhone手机桌面快捷打开?

iPhone苹果手机如何将词令网页添加到苹果iPhone手机桌面快捷打开&#xff1f; 1、在iPhone苹果手机上找到「Safari浏览器」,并点击打开&#xff1b; 2、打开Safari浏览器后&#xff0c;输入词令官方网站地址&#xff1a;ciling.cn ; 3、打开词令官网后&#xff0c;点击Safari…

数字图像处理(实践篇)十二 基于小波变换的图像降噪

目录 一 基于小波变换的图像降噪 &#xff08;1&#xff09;小波变换基本理论 &#xff08;2&#xff09;小波分析在图像处理中的应用 &#xff08;3&#xff09;小波变换原理 &#xff08;4&#xff09;小波降噪原理 &#xff08;5&#xff09;小波降噪算法的实现 &…

Windows系统IIS服务配置与网站搭建,结合内网穿透实现公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

python文件路径读取提示can‘t open/read file: check file path/integrity

它的意思是“不能打开/读取文件”&#xff0c;让我们检查路径&#xff0c;在查看下路径前是否忘记加r了 python文件路径读取&#xff0c;如果不加r&#xff0c;上述文件路径在代码运行时会报错&#xff0c;因为其会先将双引号”“去掉&#xff0c;然后系统看到了文件路径中有\r…

应用场景丨智慧社区怎么有效预警内涝积水灾害

在繁华的社区中&#xff0c;一场突如其来的暴雨可能会让整个社区陷入“水深火热”。面对这样的困境&#xff0c;社区内涝积水监测系统应运而生&#xff0c;成为社区生命线的重要守护者。 社区内涝积水监测系统是一套高科技预警机制&#xff0c;它运用传感器、数据采集器、通信网…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

卓越进行时 | 市人大常委组织深入赛宁网安考察调研

11月28日&#xff0c;市人大常委会党组书记、主任龙翔来到基层一线&#xff0c;督导江宁区主题教育工作。市委第五巡回督导组组长鲍陈&#xff0c;区领导赵洪斌、任宁等参加。 督导期间&#xff0c;龙翔在网络安全卓越中心听取赛宁网安研发情况汇报&#xff0c;了解公司产品在…

常见的回归测试策略有哪几种?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NVM管理多个nodejs安装步骤

文章目录 NVM安装步骤**二、nvm下载****三、nvm安装**版本安装与切换命令使用 NVM安装步骤 一、nvm说明 nvm 主要是用来管理 nodejs 和 npm 版本的工具&#xff0c;可以用来切换不同版本的 nodejs。 安装nvm之前先卸载node 二、nvm下载 https://github.com/coreybutler/nvm-w…

关于前端学习的思考-内边距、边框和外边距

从最简单的盒子开始思考 先把实际应用摆出来&#xff1a; margin&#xff1a;居中&#xff0c;控制边距。 padding&#xff1a;控制边距。 border&#xff1a;制作三角形。 盒子分为内容盒子&#xff0c;内边距盒子&#xff0c;边框和外边距。 如果想让块级元素居中&#…

MySQL图书管理系统(49-94)源码

-- 九、 子查询 -- 无关子查询 -- 比较子查询&#xff1a;能确切知道子查询返回的是单值时&#xff0c;可以用>&#xff0c;<&#xff0c;&#xff0c;>&#xff0c;<&#xff0c;!或<>等比较运算符。 -- 49、 查询与“俞心怡”在同一个部门的读者的借…

【Docker】安装RabbitMQ

1.拉取镜像 docker pull rabbitmq 2.运行容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq 3.安装管理页面的插件 进入容器内部 dock…

mac安装homebrew/brew遇到443报错

文章目录 问题描述解决方法方法一方法二 参考文献 问题描述 brew 全称Homebrew 是Mac OSX上的软件包管理工具 想在mac终端安装&#xff0c;运行网上提供的指令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quo…

【Android Jetpack】Lifecycle 感知生命周期

文章目录 背景示例LifeCycle的原理LifecycleOwner自定义LifecycleOwnerLifecycleObserver 示例改进使用LifecycleService解耦Service与组件整个应用进程的生命周期ProcessLifecycleOwner 背景 在Android应用程序开发中&#xff0c;解耦很大程度上表现为系统组件的生命周期与普…

Linux学习笔记09、Shell命令之历史命令和自动补全

上一篇&#xff1a;Linux学习笔记08、Shell命令之常用命令缩写及全称 目录 1、历史命令&#xff1a; 1.1、查看所有历史命令列表&#xff1a; 1.2、查看指定历史命令&#xff1a; 1.3、清除历史命令&#xff1a; 2、自动补全 2.1、当字符串唯一时&#xff1a; 2.2、当有多个…

在编程中遇到的问题总结

IDEA空包粘黏问题 创建好目录以后会发现idea自动将空包合并在一起了&#xff0c;而且点击设置里面也没有Compact Middle Package Compact Middle Package如果不在设置的主面板上&#xff0c;则点击Tree Appearance&#xff0c;会发现Compact Middle Package在Tree Appearance里…

【JavaEE初阶】volatile 关键字、wait 和 notify

目录 一、volatile 关键字 1、volatile 能保证内存可见性 2、volatile 不保证原子性 二、wait 和 notify 1、wait()方法 2、notify()方法 3、notifyAll()方法 4、wait 和 sleep 的对比 一、volatile 关键字 1、volatile 能保证内存可见性 我们前面的线程安全文章中&…

【物联网与大数据应用】Hadoop数据处理

Hadoop是目前最成熟的大数据处理技术。Hadoop利用分而治之的思想为大数据提供了一整套解决方案&#xff0c;如分布式文件系统HDFS、分布式计算框架MapReduce、NoSQL数据库HBase、数据仓库工具Hive等。 Hadoop的两个核心解决了数据存储问题&#xff08;HDFS分布式文件系统&#…