自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 资源 (1)
  • 收藏
  • 关注

原创 Java Finalization‘s Memory-Retention Issues 及Reference类解析

Effective Java Programming Language Guide》 一书中强烈建议不要使用java的finalize()方法去做对象消亡前的清理。因为jvm调用finalize()方法的时机并不确定,容易导致Memory-Retention Issues。通俗点讲就是内存没办法及时回收。详细的见oracle的官方说明https://www.oracle.com/technical-resources/articles/javase/finalization.html。

2023-11-22 00:53:40 226

原创 ZipInputStream解压报错java.lang.IllegalArgumentException: MALFORMED

使用jdk自带的zip工具ZipInputStream,去读取使用winrar在中文windows制作出来的zip文件报错。从报错信息“MALFORMED”,第一反应就是文件名解码失败,因为使用winrar制作的zip肯定是符合zip标准格式的,唯一有疑点的就是文件名是中文,然后存储时的编码和解码是的编码不一致。查看ZipInputStream构造函数可以传编码,因此使用。

2023-11-07 20:33:38 1308

原创 spring cloud config升级闭坑-InvalidConfigDataPropertyException: Property ‘spring.profiles.active‘ import

spring cloud config server从远古版本升级到3.1.2(对应的spring cloud版本为2021.0.2)后,客户端读取配置失败,服务端报错google报错后发现,对于激活profile的配置包括(spring.profiles.active、spring.profiles.include等),从spring boot2.4开始,不在支持在xx-{profile}.properties( profile-specific document)中配置。详细参考。

2023-08-05 15:08:06 424

原创 jvm相关命令汇总

现网内存告警时,可以使用命令对垃圾进行清理,以确认到底是垃圾没回收,还是确实运行需要这么多内存。

2023-06-09 19:30:00 91

原创 logback日志级别设置无效

项目同事在定位定时任务没执行时发现,定时任务中的日志没有打印(INFO级别),改成WARN后能够正常打印,检查logback.xml中发现对应的日志级别为INFO级别,后面翻阅资料发现,logging.level.xx配置的日志级别,能够覆盖logback.xml中配置的日志级别。以下是源码分析。

2023-05-22 20:59:35 1571

原创 redis命令汇总

通过执行monitor命令,可将客户机更改为监视器,实时打印出 Redis 服务器接收到的命令。可以通过这个命令去捕获意料之外的命令是从哪里发过来的。格式:sec.usec [db_id 客户端ip:端口] 命令及参数。如果想导出到文件中进行分析,可以使用。

2023-03-27 20:28:05 447

原创 linux常用命令-进程控制

linux常用命令,进程控制

2023-03-15 16:36:13 57

原创 java正则表达式反向字符集避坑

系统导出功能会将自己的信息导出到excel中,为了防止CSV注入攻击,在录入这些字段时需要对内容做校验。CSV注入攻击主要是通过“+、-、@、=”构造一些特殊内容,这个内容导出到excel中,当有人打开这种带攻击的excel时,就可以执行任意命令,详细的攻击方法,大家可以搜索“CSV注入攻击”。

2023-03-04 12:13:57 168

翻译 POI处理大excel

POI常规的api(Workbook、Sheet等)在处理excel时,会将整个excel的内容加载到内存,碰到大excel时容易OOM。这里“大”并不是单纯的指文件size,一是因为excel是经过压缩,虽然size不大,但是实际内存可能很多;二是excel实际上是使用XML描述的,XML完整的加载到内存,映射成对象时,除了字段的值占内存外,字段本身(指针)也占内存(参考容纳同样的信息,Map比Vo占内存),有些excel比较复杂,会包含大量的元数据,也会造成excel加载到内存后,占用空间较大。基于上

2022-12-06 20:18:38 543

原创 linux-Too many open files排查及修复

在Linux下有时会遇到socket/file: can’t open so many files的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024。在生产环境中很容易达到这个值,因此这里就会成为系统的瓶颈。

2022-11-30 21:18:53 1316

原创 linux系统优化措施汇总-持续更新

当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。

2022-11-12 11:25:32 372

原创 一次现网问题定位-java.lang.OutOfMemoryError: Direct buffer memory

sun.nio.ch.IOUtil#read(java.io.FileDescriptor, java.nio.ByteBuffer, long, sun.nio.ch.NativeDispatcher)读try {return n;} }IOUtil取文件内容时,会分配DirectByteBuffer作为字节容器,并且分配的DirectByteBuffer会被缓存下来,因此要避免传入的ByteBuffer过大。IOUtil引用的地方如下,使用这些类或方法时,要特别注意。

2022-09-22 21:00:56 707

原创 redis集群模式下key过期事件监听

项目组准备将自建的redis切到公司云平台的redis服务;自建的redis用的是哨兵模式,而云平台的提供的redis服务用的是集群模式。切换前先分析redis用到了那些功能,redis集群模式下是否兼容。分析代码时发现,用到了RedisMessageListenerContainer,该类用于监听redis发出的消息(redis的发布订阅功能)。我们使用到了redis键过期通知的特性,来实现超时处理异步任务的。

2022-09-19 17:52:54 2510 5

原创 spring、tomcat是如何配合完成websocket

像IM这一类web系统,需要有机制知道是否有新消息。没有websocket前都靠轮训。轮训频率设得过高,有效轮训率很低,不仅消耗网络资源,还占用cpu资源;轮训频率设得过低,又会造成消息延时较大。为此诞生了websocket,消息可以由服务端主动推送到客户端,不仅实时性高,效率也是拉满。为了尽量减少对现有系统进行改造,websocket是在建立在http的基础之上的,这样不仅可以复用http的端口,服务端及客户端的改造都更小。

2022-08-20 17:54:51 1118

翻译 【redis官方文档翻译系列】-Redis keyspace notifications

空间通知对每个影响redis数据的操作会发送2个不同的事件。例如,针对database 0 中名为 mykey 的键的 DEL 操作将触发两条消息的传递,完全等同于以下两个 PUBLISH 命令。第一种在通道中带有 keyspace 前缀的事件称为 Key-space 通知,而第二种带有 keyevent 前缀的事件称为 Key-event 通知。第一个通道监听所有针对键 mykey 的事件,另一个通道仅监听键 mykey 上的 del 操作事件。可以只启用一种通知,以便只传递我们感兴趣的事件子集。

2022-08-19 21:16:52 522

原创 ES报错处理-mapper [xx.xx] of different type, current_type [text], merged_type [keyword]

我司有一套开源使用规范,衰退期的软件或版本需要升级到GA版本。我们ES服务端是6.8.x的,根据ES官方推荐版本,springdataelasticsearch使用的是3.2.x,配套的springboot版本为2.2.x.我们当前使用的版本已经比较老了,我们需要将springboot升级到2.6.x,并将springdataelasticsearch升级到4.3.x。........................

2022-07-19 20:09:21 3631

原创 Jedis分析一-Pipeline is currently not supported for JedisClusterConnection.

项目组最近准备将Redis由哨兵模式组网切换到集群组网,切换后应用访问redis时报错,“Pipeline is currently not supported for JedisClusterConnection.”。初步定为Jedis在集群模式下不支持pipeline。org.springframework.data.redis.connection.jedis.JedisClusterConnection#openPipelinepipeline解析pipeline并不是redis的设计,只要

2022-07-08 17:51:16 2947

原创 浏览器跨域详解

当前流行前后端分离,很多时候前端域名与后端域名不一致,导致请求跨域被浏览器拦截。浏览器控制台出现以下提示页面发起跨域请求后,浏览器会先发起预检请求,预检通过后,在发起正式请求。如果预检请求不过,浏览器就会停止后面的业务请求,导致访问失败。解释跨域拦截是浏览器的行为与服务端无关,浏览器仅仅只是检查服务端的响应中是否包含跨域头,至于这个头是java服务生成的,还是nginx生成的都可以。我们的组网如上,nginx做负债均衡,因为我们微服务较多,所以在nginx这一层做了配置来支持跨域,避免每个服务都去

2022-06-01 18:29:49 2816

原创 spring日志配置文件路径规则

背景项目之前是通过命令行参数-Dlogging.config指定日志配置文件的路径的,后面应用docker化时,需要将这个配置文件打到应用包中,因此翻了下spring boot源码,看都支持哪些路径。spring boot初始化入口如之前文章的分析,spring boot是通过LoggingApplicationListener监听到ApplicationEnvironmentPreparedEvent后开始初始化日志系统的。从源码可以看到,spring boot有三种方式去获取日志配置,优先级如下:

2022-05-19 18:05:21 1299

原创 Context Path + servlet path + path info

综述目前微服务大行其道,各种中台应运而生,中台处理部分业务时需要透传请求,这就涉及到对url的处理。一般透传的接口都会保持path路径不变,因此需要从前端的url中提取公共部分。这就需要理解Context Path、servlet path、path info,目前servlet提供了对应的方法去方便获取它们。不过这3个到底对应url中的那一段,还是需要好好研究一下,不然很可能得到错误的url。可以肯定的是 request uri = Context Path + servlet path + path

2022-05-07 19:28:14 1280

原创 nginx proxy_pass转发规则解析

综述nginx官方网站讲解proxy_pass时,只给了规则的说明,并没有给出具体的示例辅助理解。对于英语不太好的人,理解起来真的很头痛,只能通过测试来验证对英文意思的猜测。nginx对proxy_pass的官方说明见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass其将proxy_pass的转发规则分为3类:url中带path路径url中不带path路径nginx无法确认url的替换规则url中带path

2022-05-03 20:18:51 9289

原创 spring-cloud-consul-discovery避坑

背景背景如上一篇文章《request.getRequestDispatcher().forward()的妙用以及DispatcherType 对Filter配置的影响》,项目要将服务从虚拟机从迁入docker中,方便自动化部署以及弹性扩容等。闭坑一-应用看到的ip及port是docker的内部ip、端口,外部无法访问应用看到的是docker内部ip及端口,这个是宿主机虚拟出来的,对外部不可见;如果不做任何处理,应用会拿着这个ip及docker去注册服务,导致外部调用方调用失败。处理方法这个是所

2022-04-26 21:25:40 1507

原创 request.getRequestDispatcher().forward()的妙用以及DispatcherType 对Filter配置的影响

背景我们应用如上图所示,Nignx做负债均衡,微服务间使用feign进行调用。为了方便鉴权Filter配置拦截的url以及nginx配置对外暴露的url,我们为所有服务设计了统一的url规范类型用途v1/xx给前端用的urlv5/xx内部接口,服务间调用因此所有服务都未配置server.servlet.context-path那么问题来了,现在我们要把服务从虚拟机迁移到docker中。使用公司的docker需要有用于分发的文根,因为docker服务提供了公共域名

2022-04-22 20:32:35 2951

原创 An invalid domain [xx] was specified for this cookie

背景spring boot项目将jetty改成tomcat后,登录接口报错An invalid domain [xxxx] was specified for this cookie全局搜索代码后,发现该提示来自tomcat-/tomcat-embed-core/9.0.46/tomcat-embed-core-9.0.46-sources.jar!/org/apache/tomcat/util/http/LocalStrings.properties。进一步找到引用该提示语的地方为org.apac

2022-04-06 15:27:40 1269

原创 sleuth原理分析

背景微服务模式下,一次请求可能会经过多个服务。如果没有日志链将单次请求的日志串起来,定位问题时很容易陷入海量的日志中,无法快速定位问题。sleuth是spring cloud中日志链(调用链解决方案),引入该依赖后,日志中会自动添加(traceid,spanid)。当获取到traceid后,可以在kibana或者其他日志收集系统中,精确定位到本次的所有日志。sleuth基本原理很简单,就是在入口生成(traceid,spanid),并在调用中将traceid传递下去。但是在基本原理之上,还是有些东西

2022-03-29 00:03:54 5791

原创 nginx配置文件目录

背景想把服务器上nginx配置文件下载到本地使用vscode打开看的时候,发现进程参数中未指定配置文件目录。于是查看nginx官网,nginx默认配置文件目录为 /usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx.然后去上述目录都看一下还是没找到。解决方案nginx -t可以查看配置文件实际使用的目录nginx: the configuration file /xxxx/nginx.conf syntax is okngin

2022-03-23 09:04:38 11988

原创 导出CSV后,时间字段无法自动识别-0xEF,0xBB,0xBF

背景项目组做csv导出时,发现有些行的日期字段没办法自动识别,如下图所示即使手工调整格式也不行后面写了一个测试代码,对比问题行的二进制,发现有问题的行比没有问题的行多了3个字节;-17,-69,-65,转换成16进制就是0xEF,0xBB,0xBF。(问题行日期字段里面的值因为多了这三个字节,不能很好的被识别成日期。)然后百度这三个字节,发现这个三个字节放在文件头可以解决csv中文乱码问题。0xEF,0xBB,0xBF在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPA

2022-03-12 16:33:16 1075

原创 java.lang.OutOfMemoryError: Java heap space的思考

背景excel文件内容较多时,使用poi非流式api处理,很容易造成OOM;OOM后系统日志发现大量报错ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled taskjava.lang.IllegalStateException: Connection pool shut down at org.apache.http.ut

2022-03-09 20:47:58 1098

原创 大文件下载避坑-FileReader#readAsDataURL window.URL#createObjectURL

背景随着互联网的发展,目前国内越来越重视安全问题,后端除了身份认证外,还会进行csrf攻击防护;导致下载文件的时候不能通过一个指定url的a标签下载文件。因为csrf防护一般是加一个固定头,浏览器访问的时候只能自动带上cookie及其他一些浏览器内置的头,csrf-token没办法自动带过去,无法通过服务端的校验。目前常规的方法,是通过ajax请求后端内容,然后动态生成a标签进行下载。 var xhr = new XMLHttpRequest(); xhr.open("GET", "ht

2022-02-22 14:53:53 3227 5

原创 log4j-slf4j-impl cannot be present with log4j-to-slf4j

背景项目使用@slf4j注解,注入日志组件进行日志打印。POM中引入了spring-boot-starter-logging、spring-boot-starter-log4j2、log4j2、slf4j、logback等多种日志组件。某次修改业务代码后,系统无法启动,并报错log4j-slf4j-impl cannot be present with log4j-to-slf4j。SLF4J: Class path contains multiple SLF4J bindings.SLF4J: F

2022-01-26 20:00:31 5121

原创 浏览器非活动页定时器执行频率下降问题

背景客服系统需要检测坐席是否下线,否则服务端将进线分配给离线的坐席,消费者得不到坐席的回应,影响消费者体验。系统为了检测消费者是否下线,增加了心跳逻辑,页面每2秒上报一次心跳。服务端30秒内未收到心跳,就认为坐席下线。现网偶发坐席不断切换状态(上线->下线->上线->下线…)经定位现代浏览器为了省电,当页面切到后台(非当前活动页),5分钟后浏览器会降低js定时器的执行频率(1分钟一次)。导致心跳机制受到影响。该设计具体可以google(Throttling Javascript T

2022-01-21 20:00:05 2580

原创 连接池剖析及连接泄漏定位思路

背景最近连续解决两起连接泄漏的问题,期间阅读了大量开源源码,发现开源软件中设计的连接池,用的也都是一些常规手段,本文为大家揭开这层神秘的面纱。概述大多数应用中应该都是用的TCP协议,TCP连接在建立阶段会经过3次握手,销毁阶段会经过4次握手。标准网络是分7层的,每一层都有各自的协议头,应用层拿到的有效数据,在整个报文中占比没这么大。TCP握手阶段的报文,对应用层来讲都是额外的负担。所以很多客户端都会设计连接池,来复用已建立的连接。减少创建连接带来的消耗。连接池本身不复杂,如果不想做的通用,少量的代码

2022-01-12 11:56:05 1171 2

原创 java命令报:Unable to open socket file

背景现网问题有时候,需要使用jstack、jmap等命令去查看进程当前状态。有时候会报[xxxx@xxxx ~]# jstack xxxxxxxx: Unable to open socket file: target process not responding or HotSpot VM not loadedThe -F option can be used when the target process is not respondingjava进程启动的时候,默认会在/tmp/hsperf

2021-12-30 16:28:05 4847

原创 YYYY-MM-dd时间格式跨年的bug

今天系统出现查询数据失败的问题,查询日志发现查询条件中,时间错误。今天是2021年12月27日,但是日志中的时间却变成了2022-12-27 18:16:05,414。然后查询JDK源码的注释发现,“yyyy-MM-dd HH:mm:ss”中大小写代表不同的含义,以前写oracle时间转换的时候,oracle是忽略大小写的,没想到经验带到java里面翻了车。大家可以去查看SimpleDateFormat这个类的源码,里面对每个字母简写的意义做了说明。尤其是对于“年”,有如下注释y表示正常的年Y

2021-12-27 18:37:31 960 1

原创 一次现网问题定位-Redis连接不断增长

背景系统原来是使用(HAProxy+Sentinel+redis)做的高可用方案,该方案HAProxy无法感知到主从切换,导致写操作失败。具体可参考之前的文章。为了解决这个问题,拿掉了HAProxy,然后使用Jedis的Sentinel模式。# 代码有删减RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(sentinel.getMaster(), sentinelHostAnd

2021-12-24 17:09:35 2620

原创 linux常用命令-网络命令

查询进程打开的网络连接lsof -i pid该命令最后一列Name显示了连接信息。有时候端口显示的不是数字,而是一个名字,比如:localhost:fmtp->localhost:62309 (ESTABLISHED)这个是因为linux内置了常见的端口及服务名,我们可以查询这个映射表,知道该名字代表那个端口该映射表为 cat /etc/services...

2021-12-18 11:25:20 606

原创 Linux常用命令-查询进程工作目录

1.通过命令查询pwdx pid2.通过进程信息查询ll /proc/{pid}/cwd

2021-12-17 12:00:34 979

原创 java反射高阶用法

获取泛型上注解hibernate validator可以对容器的元素进行校验,比如List<@length(max = 50) String>。很好奇校验器是如何获取到@length这个注解,并对容器里面的元素进行校验的。通过google发现可以通过如下方式获取。详细见https://stackoverflow.com/questions/66241813/how-to-parse-java-annotation-in-generic-typeclass Test { L

2021-11-20 18:07:45 270

原创 spring扩展-EnvironmentPostProcessor

EnvironmentPostProcessor

2021-10-11 15:29:09 334

原创 linux免密登录

linux免密登录linux免密登录是利用非对称加密,然后在服务端和客户端之间进行握手。其原理与https类似,非对称加密是一对,当把公钥放在服务端时,只有持有私钥的客户端才能完成握手。步骤生成秘钥对-ssh-keygen,秘钥对默认存储在~/.ssh下面。将公钥传输到服务端,ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip.传输时会要求填写密码。ssh-copy-id命令是个快捷方式,除了帮你把公钥传输到服务端,还会让服务端将公钥写入到authorized_

2021-09-01 17:03:04 192

DPSK光调制系统

大学毕业论文,属于原创,可以放心参考,本论文除基础理论参考的书本外,其他程序,以及仿真分析全部出自于自己

2012-05-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除