- 博客(157)
- 资源 (2)
- 收藏
- 关注
原创 Apng文件判断
背景:在图片压缩中,根据文件头判断png和jpg文件进行了压缩,但是对apng文件,文件头的前14个字节都一样(89504E470D0A1A0A0000000D4948),导致对apng图片进行压缩,图片白了。
2024-07-05 17:53:54
295
原创 java图片压缩库调研
1. 6.6.14版本中的image包,是抠了JDeli的代码,其它版本都没有,所以实际是收费软件的压缩效果;本地SDK,JPG压缩可以做到60%以上,可以控制压缩后分辨率是否变化。2. API接入,申请appid,每天50张免费,后续收费,实际是到。类似thumbnailator,不过对有透明度的PNG压缩后会有黑底。附:png压缩对比(0%说明是负优化,代码中对负优化的不压缩)本地SDK,直接调用,对PNG实际是用quant算法进行优化。1. 网站在线压缩免费,单张,手工;不修改分辨率压缩效果一般。
2023-06-10 11:21:33
1180
原创 png图片压缩后黑底问题解决
问题到这基本就清晰了,黑底的原因是png压缩过程中alpha通道值没了,用黑色补充,为什么alpha通道会丢失呢?因为按jpg处理了,所以我们只需要处理png时,识别到真实png,保证其后缀名为.png即可。判断文件类型为jpg还是png,对后缀名不对的,强行补充.png等。用白的背景重画,就会有类似如下问题:左边为原图,右边为重绘后的图。压缩,保证压缩率,但是不修改目标文件后缀名。图片开始压缩的大小,对较小的。两个字节,容易混淆,如果是补。支持的文件后缀,以逗号分割。压缩必要不大,可能是无用功。
2023-05-30 20:12:40
2618
1
原创 使用异步HttpClient时线程hang住
某次处理问题,发现线上的某个线程池全部hang住,jstack发现堆栈如下"pool-3-thread-50" #70 prio=5 os_prio=0 tid=0x00007fa451317800 nid=0x5f23 in Object.wait() [0x00007fa44e6e5000] java.lang.Thread.State: WAITING (on object mo...
2019-12-07 14:23:38
1225
1
原创 一次kafka堆积问题解决
我们从kafka获取数据,如下图,有两步,第一步是从dmq获取出来放到一个队列里;第二步是我们消费线程从队列里获取内容。对第一步,业务作为dmq客户端,启动N个连接去连接dmq,连接数由配置项mq.consumer.connections指定,一般模块都没配置(目前小组内框架设置的默认值是2)对第二步,消费线程数是由配置项 consumer.thread.num 决定(出现问题时为10)...
2019-01-11 10:24:03
16608
4
原创 记一次ssl方式导致的堆外内存泄露
在巡检的时候突然发现现网某业务使用内存大约6G,问题是我们配置的-Xmx=2G,metaspace没配置,从GC日志看第一次提交的最大metaspace为1G,假设都使用了,堆外内存最小也有3G了定位步骤1.查看/proc/${pid}/smaps文件(pmap命令也类似)发现20来个65536KB的块而且连续观察到64M块和内存增长量也符合,搜到案例 http://blo...
2019-01-07 17:34:24
2731
原创 记录下并行优化时的一个问题
最近在做模块性能优化时,尝试将请求外部模块和操作数据库这种耗时操作又非前后关联的动作改为并行,用到了CompletableFuture.runAsync,遍历复杂集合时修改为parallelStream; 实际上parallelStream和CompletableFuture.runAsync的并行都是使用了Fork/join的线程池来处理,可以参考http://blog.dyn...
2018-11-26 21:32:13
769
原创 记录一个证书校验的问题
突然同事找我说我们测试环境的app无法登录了,重新部署了rabbitmq也没用,怀疑是rabbitmq插件问题。决定抓包分析,我们的认证是用rabbitmq_auth_backend_http插件,往mqtt模块发送认证请求,首先在mqtt模块抓包看是否收到http请求,抓到包,确认收到了,那插件应该是没问题的,查看包发现握手错误,不过恰好是部署在同一台服务器上看不出是谁报的证书校验错误然...
2018-11-20 12:21:29
878
原创 性能提升5000倍,我都不敢信
之前组里人写了个解密工具,用cmd调用jar包里的方法@echo offecho %time%echo.set key=8076yda4404ysh09for /f %%i in (str.txt) do java -jar encrypt.jar aescbc d %%i %key%echo.echo %time%pauseecho %time%为后期加上为了统计时...
2018-11-01 13:03:55
400
原创 记录一个正则表达式 cpu 100%的问题
昨天一个同事找看个问题,请求某个接口在参数长一点的时候总是超时,查看atop信息,发现cpu几乎耗尽,atop信息如下占用cpu最高的是他的进程,怀疑写了死循环,jstack发现如下明显是有循环调用了,cpu爆的原因和 https://yq.aliyun.com/articles/25576 的一样,都是Curly方式,不过连接里很多是源码解析比如type=0,回到我们的问题,我们...
2018-10-31 13:44:46
1178
原创 一个进程里两处日志时间时区不一样的问题
最近发现一个进程里打出来的日志里时区不一样,一个是UTC时间,2018-09-12 10:48:12.278,一个是北京时间2018-09-12 18:48:15.453。北京时间的是log4j输出的,UTC时间的是我们自己输出的,我们自己的时间字符串来源是大概如下两行代码:SimpleDateFormat dateFormat = new SimpleDateFormat("yyy...
2018-09-18 19:04:26
3186
原创 增加一个bean改变spring初始化顺序问题
工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事,但是突然增加了一个C之后,就先初始化B再初始化A导致问题,但是在主干版本上却没问题。 解决这个问题其实很简单,depend-on即可,但是为什么会分支版本上会增加C后就改变AB的初始化顺序?为什么主干版本上同样添加没问题呢?可以看sprin...
2018-06-01 10:02:52
1886
原创 Cannot get a connection, pool error Timeout waiting for idle object
性能测试时,报错org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object,日志中最后的堆栈如下:Caused by: java.util.NoSuchElementException: Timeout waiting for ...
2018-05-28 11:57:33
7932
原创 经典的过时言论——使用StringUtils.split替代普通split方法提升性能
经常能听到这个说法,甚至编程规范也会约束不让用String的split方法,那么是不是真的就很慢呢?测试代码如下 public static void main(String[] args) { String str = "abc:abc:drdf:dfw:da"; System.out.println(System.currentTimeMillis...
2018-05-17 20:41:21
2719
原创 coverity清零——missing call super
问题原因:期望我们调用super.xxx()方法但是我们没有调用除去部分误报,需要注意修改的是Servlet的init(ServletConfig servletConfig)方法中,是必须要加上super.init(servletConfig)调用的。首先,为什么我们重写的不是init()而是带参数的呢?因为我们有直接从web.xml里读取配置项的操作this.path = servletCon...
2018-04-03 11:08:28
2392
原创 部分业务从Tomcat6升级到Tomcat7后,访问部分jsp报错
升级tomcat后,访问jsp报错500,错误信息如下:org.apache.jasper.JasperException: … … The JSP specification requires that an attribute name is preceded by whitespace问题原因:Tomcat7增加了个参数 org.apache.jasper.compiler.Parser.S...
2018-03-31 17:20:48
2256
原创 coverity 清零Bad choice of lock object —— 常量字符串做锁对象
参考如下代码,在BadLockA和BadLockB中我们使用了BADLOCK字符串作为锁对象(这个字符串对象我们加不加static final修饰都一样)public class Test{ public static void main(String[] args) throws Exception { BadLockA lockA = new BadLoc...
2018-03-28 11:51:02
799
原创 coverity清零Bad choice of lock object——集合做锁
当我们尝试synchronized一个集合时,coverity扫描时会有提示Bad choice of lock object,那么为什么呢?参考如下代码:public class Test{ public static void main(String[] args) throws Exception { Integer in = new Integer(123...
2018-03-27 19:08:33
901
2
原创 Ant: Class not found: javac1.8
ant版本 1.8.3,jdk版本1.8.0_101在ant时报了这个错,在网上搜都让升级ant到1.9以上配套jdk8即可。实际上我们由于是从jdk6升级到jdk8,所以当时有另一种解决方式,指定compiler="javac1.6" <javac source="${javac.source}" srcdir="${src}"
2017-11-01 11:22:17
979
原创 线程未设置daemon导致shutdown无法及时退出
某次停止tomcat后,使用jps查看进程依然存在;直接jstack查看目前后台的哪些进程还在运行,发现main线程已经没有了,说明main线程已经执行完毕,我们自己的线程依旧存在,如:CONFIG-WATCHER。 那在什么情况下,会主线程运行完了,虚拟机还没退出呢?参考 https://stackoverflow.com/questions/7416018/when-does-
2017-09-13 16:05:06
902
转载 使用TCP同时进行上传和下载的吞吐量为什么比单独进行时要低
TCP的发包一般是由收到TCP ACK触发的,没有收到TCP ACK时TCP发送端一般是不会发包的(超时重传的情况除外)。下面示意图就是在描述:没有收到接收端发来的TCP ACK包时,发送端停止发送数据包。左边是接收端,右边是发送端,-号表示发送端待发的数据包,=号是TCP ACK。 | ---- ---- |假设有8个包要发送---- | ----
2017-08-21 15:01:19
1075
原创 LineIterator中文乱码问题
业务中某功能最开始是用文件读取,类似如下 RandomAccessFile raf = new RandomAccessFile(new File("daily.log"), "rw"); String line = null; StringBuffer sb = new StringBuffer(); while((line =
2017-08-17 19:45:10
2791
原创 无界队列导致内存耗尽问题一例
某个边缘的功能,需要将某些数据存入数据库,由于功能边缘且数据较少,存入频率为5秒保存一次,一次保存10条;保存的数据用Vector保存,往集合里放,正常情况下量极少也没出问题。然后在某一天,突然发现服务容灾状态了,根据经验,不是数据库挂了就是后端某应用挂了,查看日志,发现是这个数据量过多,结果数据入库又这么慢,于是内存就爆的了怎么解决?1.队列别光加入,超过10000时放弃,以
2017-08-17 19:22:59
6233
原创 tomcat connectionTimeout 问题
问题现象在某个时刻,后端收到了平时4-6倍的请求(保密起见,略去产品和事件),在10分钟后居然没有请求可以接进来问题原因经过分析,首先,是后端服务器的线程池满了,线程池满的原因:1.server.xml中maxThread=512,导致超过512的之后的请求只能排队,等待有线程释放后,才能被处理;2.connectionTimeout配置为10000,这个配置导致建立一个soc
2017-08-15 10:20:53
75052
10
原创 vsftpd版本引起的下载失败
问题背景:应用启动时去某机器上下载文件,但是其中某一台总是下载失败,但是手动是可以的问题过程:首先,我们怀疑是vsftpd配置问题,比如主被动模式配置错误,发现ftp都是vsftpd的独立模式模式,没有用xinetd代理,而且模式都是一致,那为什么会有的机器行,有的机器不行呢?添加jsp模拟下载,类似如下代码(使用的ftp类来自于commons-net-3.1.jar) FT
2017-08-07 19:27:49
1706
原创 从修改.cshrc导致无法进入用户到删库跑路
某同事新建了用户,在修改.cshrc并source后退出当前用户,而且无法再通过su -切换过去; 首先,查看用户shellcat /etc/passwd |grep xx 发现用户是cshrc,于是查看用户家目录下的的.cshrc文件,最后有一行source ${HOME}/.cshrc 于是清楚了,su - xx的时候会自动运行source .cshrc,
2017-08-04 16:28:36
1845
原创 LD_LIBRARY_PATH设置不当导致的自动安装失败
问题现象某天自动安装的时候,发现安装出错,最后定位到是自动安装脚本执行时会有如下报错./cfg_utility: error while loading shared libraries: libxerces-c.so.26: cannot open shared object file: No such file or directory我们自动安装时会修改xml中配置项,因为在安装脚本
2017-07-04 09:07:27
1507
原创 SHELL脚本并发问题一则记录
问题背景使用自动安装框架进行业务安装,调用SHELL脚本来修改权限等操作,包括修改server.xml配置等信息,某天两个安装任务一起运行时,发现密码字段为空,单独运行命令或单个安装任务则不会出现问题。问题原因SHELL代码出问题段代码类似如下逻辑:passwd=""passwd=`encrypt xxx`modXmlPasswd $passwd在第一个任务跑完第二行时,第
2017-06-19 08:32:43
554
原创 400 Bad request 一例
某次定位请求,发现400 bad request,抓包发现请求头如下POST /xx/xx/user/default/subscribe HTTP/1.1Authorization: xxHost: http://100.40.205.122:8080Content-Type: application/json;charset=utf-8Content-Length: 248
2017-04-17 16:01:30
2343
原创 JDK1.6在SUSE11下问题跳变定时任务失效问题记录
问题现象:使用ScheduleExecutorService部署定时任务,在时间向过去跳变比如当前11点跳变为10点后,定时任务突然失效,然后再次到11点时所有积压的定时任务(10-11点)一起执行,可能导致业务压力过大问题原因:POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装:CLOCK_REALTIME和CLOCK_MONOTONIC,第一种绝对时间,第二种是相对时
2017-04-14 09:36:00
744
原创 tomcat keepAliveTimeout=0问题
最近升级了tomcat上线,之后几天服务端句柄很高,定位后发现是应用服务上有很多连接,但是实际没有这么多用户在线,在测试环境上重现,抓包发现在keepAliveTimeout=0的情况下,是客户端发起FIN包,而改为2000之后,则是服务端发FIN包,参考https://tomcat.apache.org/tomcat-7.0-doc/config/http.html,keepAliveTimeo
2017-04-12 16:56:30
10753
原创 CAS锁为什么是乐观锁呢
参考AtomicInteger类如下方法 public final int incrementAndGet() { for (;;) { int current = get();//1 int next = current + 1;//2 if (compareAndSet(current, next
2017-03-28 16:47:33
836
原创 java字符串拼接小结
早期的版本中,字符串拼接是会在常量区创建对象的,比如如下代码 String str1 = "tom"; String str2 = "cat"; String str5 = str1 + str2;第三行是会在常量区创建一个String对象tomcat的,所以不少编程规范都会说不要直接用加号去拼接字符串,因为老是去常量区创建对象的话,开销也不小,而
2017-03-10 08:15:52
8928
原创 crontab原理
详细解释见https://www.quora.com/How-does-cron-work crontab实际上是启动服务后读取所有配置文件,然后睡一段时间(一般也是一分钟)后运行下一个任务,从链接里看,是半小时监控一次crontab文件是否有改动。对suse而言,crontab服务启动后,会检查/var/spool/cron/tabs下所有用户的定时任务,然后加载到内存的队列中,然
2017-03-09 08:33:05
4234
原创 Enum 修复findbugs问题记录一则,List想表示不可变集合
问题描述:目前业务中可能对某些参数只支持某些固定的字符串,比如dot/cat,最初的实现很简单朴素private static final List SUPPORT_ANIMAL = Arrays.asList("dog","cat","bear");用的时候直接判断SUPPORT_ANIMAL.contains(xx); 其实能够表示这些是一个整体问题在于,这个List别人可以随便修改,
2016-12-24 11:47:28
395
原创 ftp配置模式问题导致下载失败
问题现象:某部件下发到我们部件的内容,去ftp下载的时候失败,报错无权限,ftp 550550错误,一般有如下几种可能:1. 路径错误2. 路径下文件不存在3. 文件所在目录对于ftpvrpv8用户无执行权限由于代码一直运行良好,目前是在测试环境测试,所以路径错误排除;检查了下权限依然正常;无招,问了下之前的维护,才知道原因:代码里用了port模式去连接ftp服务器,但
2016-11-25 09:58:32
5810
原创 Caused by: java.io.IOException: CreateProcess error=87, The parameter is incorrect
问题现象:搭建CI服务时,自动构建使用ant脚本编译时报错:Caused by: java.io.IOException: CreateProcess error=87, The parameter is incorrect,搜索发现https://community.oracle.com/thread/2245134?tstart=0 说这个问题是因为classpath 太长,考虑到这么ja
2016-08-27 17:31:06
3959
原创 执行shell脚本报错 cannot execute binary file
现象:我本地编写了shell脚本,拷贝到某台SUSE11服务器上执行正常,到suse10机器上就报错了通常情况下这个个错误的原因有以下几个1、可能是没有执行权限;2、可能是32位机器跑了64位写的程序;3、可能用了ARM机器跑X86生成的代码。然而我这个就是个shell,不至于啊,一Google也没有类似案例,用file命令一查,清楚了# file newMemEnv.sh
2016-07-30 15:12:46
23411
原创 A simpleContent extension must define a base type
问题起因:tomcat做soap开发,从服务器上下载了wsdl后,发现soapui导入报错,报错内容见标题;问题原因:wsdl中定义有问题,在simplecontent中必须有extension或者restriction内容,见http://blog.youkuaiyun.com/caolaosanahnu/article/details/7962735;全文搜索simplecontent,发现问题wsd
2016-07-26 09:11:52
1064
原创 The content of element type "web-app" must match "
导入工程,eclipse中报错:The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-
2016-06-13 15:34:11
961
一个聊天室,支持文件传输
2011-08-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人