- 问题:数据处理服务点击开始解析直接失败,发现 PDF 服务宕掉了,运维查看因为服务器 oom 被 kill 掉了,而代码没有提示 OOM ,主要原因是最大堆内存设置的是 15G ,而机器的内存是 16G,堆内存还没到达最大设置的值,也不会进行 GC,但服务器却没内存了,服务器自保导致 OOM Killer,把占用内存最大的 Java 进程 kill 掉了。
解决办法:最大堆内存从 15G 调整为 12G,Java 内存到达设置的值后进行 GC,防止内存不释放。
- getOutputStream() 报 has already been called for this response异常
- OutPutStream只能使用一次,JSON.toJsonString 方法会执行一次,有个全局日志打印的切面,会用 JSON.toString 方法打印入参,获取了一次 OutPutStream
解决办法:将 HttpServletResponse 和 HttpServletRequest 过滤掉,设置日志参数不设置这两种类型的信息
- 高负载情况下使用 hutool 下载文件,有时会一直挂起
- 场景:多线程下载图片合并成 PDF,由于 PDF 会很大,之前设置的 超时时间是 -1
- 堆栈信息如下:
"pdf-split7" #82 prio=5 os_prio=0 tid=0x0000000025500000 nid=0x13db8 runnable [0x0000000031c2e000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:593)
at sun.security.ssl.InputRecord.read(InputRecord.java:532)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
- locked <0x00000006e5d223e8> (a java.lang.Object)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
解决办法:设置超时时间超时报错,,但在 jdk bugdatabase(JDK-8049846、JDK-8075484) 上说是 jdk8u131 已经解决,而我本地就是 8u131 ,所以比 8u131 版本低不知道会不会设置 timeout 还是会卡死