oom2

thinkingme2023年1月31日
大约 1 分钟

oom2

前言

需求来了,说是要给图片加水印,如果用户登录了,就用用户id当水印,没有登录就用用户的ip当水印。

这不是很简单吗,很快啊就写完了,调样式到是调的比较久,什么透明度啊,大小啊,密度啊。

第二天悲剧了,测试发现水印图片加载不出来。

排查

嗯,先看日志,一看oom了。一想就是昨天的图片加水印,因为是在内存里操作的。一查确实buffimage对象大几百m。一张图10m不到,加载到对象就翻了几倍。

解决

其实想说加完水印扔到本地去保存,这样就不用每次都要在内存里操作了。但是这样就要占用很多的额外空间了,一张图,一个用户就要额外一张了。

事情变得复杂起来了。我把对象及时清理掉,然后用visualVM看内存表,多来几个并发内存就直接炸了,虽然回收也挺快,但是jmeter的成功率低了。

那咋办,图片10m不到,但是可以说还是太大了,我建议他们压缩后再存储。嗯,效果还可以。能承受更多了。一个对象变成几m左右,这样就不会轻易oom了吧。

再看下用的是jdk8默认的垃圾回收器,改成G1。再设置一下60%就回收,图片对象一用完就刷新。应该能承受更大点了吧。

总结