linux 与 Java 相关

205 阅读1分钟
  1. 问题:数据处理服务点击开始解析直接失败,发现 PDF 服务宕掉了,运维查看因为服务器 oom 被 kill 掉了,而代码没有提示 OOM ,主要原因是最大堆内存设置的是 15G ,而机器的内存是 16G,堆内存还没到达最大设置的值,也不会进行 GC,但服务器却没内存了,服务器自保导致 OOM Killer,把占用内存最大的 Java 进程 kill 掉了。

解决办法:最大堆内存从 15G 调整为 12G,Java 内存到达设置的值后进行 GC,防止内存不释放。

  1. getOutputStream() 报 has already been called for this response异常
    1. OutPutStream只能使用一次,JSON.toJsonString 方法会执行一次,有个全局日志打印的切面,会用 JSON.toString 方法打印入参,获取了一次 OutPutStream

解决办法:将 HttpServletResponse 和 HttpServletRequest 过滤掉,设置日志参数不设置这两种类型的信息

  1. 高负载情况下使用 hutool 下载文件,有时会一直挂起
    1. 场景:多线程下载图片合并成 PDF,由于 PDF 会很大,之前设置的 超时时间是 -1
    2. 堆栈信息如下:
"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 还是会卡死