用户在上传图片的时候,系统会报异常 insufficient memory case 4,追踪代码发生在jdk中 image.io 的 read() 方法。这是一个耽搁了很久的bug,客户反馈了好几次,找了几次方向都没处理好,搞得客户很不耐烦,我自己也很伤脑筋,差点就投降了。

我尝试过本地测试复现,但是也只是在多线程同时并发才会出现,线上出现该异常的时候,只有一个人在使用,所以当时也是很疑惑。对于内存不足来说,这个和内存溢出OutOfMemoryError是不一样的,后者往往是分配给JVM的内存不足,前者实际上可能更多是物理本地内存不足(当然,这是后来才知道的)

在找寻解决方案的过程中,看到了 github 上的一个issue:Exception generating thumbnail image: Insufficient memory (case 4)

其中有段回复是这样说明的:“Summing it up, I'm going to guess that the situation is that the JVM has enough memory allocated to it by the OS, but the JPEG decoder which is (probably) calling native code of libjpeg, and libjpeg is unable to obtain more free memory from the OS. You may want to look at how much (virtual) memory that the OS has free at the time you encounter this error. If my guess is correct, it would mean that you'll need to reduce the amount of parallel processing, and adding more heap (-Xmx) to the JVM probably isn't going to alleviate the situation.”

可以看到,他说可能的原因在于JVM的内存是足够的,但是在调用一些其他非Java代码的接口,即native方法时,这些方法无法从系统中获取到足够使用的物理内存,于是造成了该异常。方向有了,看看服务器整体物理内存的使用情况。

于是我在客户告知我异常时,登陆服务器查看了内存的使用,服务器是8G内存,当时显示已使用内存高达7.9G(吃惊,怎么这么高),其中有个进程占用高达5G以上,是谁呢?sqlserver.exe(当时就惊了)

这是因为sqlserver.exe默认使用的策略是用多少内存占多少内存,只有服务器内存不足才会释放一些。这些内存多用来进行 “查询出的数据缓存” 和 “执行命令缓存”,所以解决方法其实很简单,调整sqlserver的可使用物理内存即可(图来自网络):

我把sqlserver的内存使用限制在了3G,之后问题便迎刃而解。那句话怎么说来着,改代码两分钟,DEBUG两小时,说得真没错,关键是我DEBUG了好几天  : )

关于 insufficient memory case 4 的解决记录的更多相关文章

  1. [转]解决百度统计 gzdecode(): insufficient memory

    百度统计API gzdecode($preLogin->retData, strlen($preLogin->retData)) 这段代码会造成一个PHP警告内存不足,解决办法只要换个解压 ...

  2. SQL执行SQL语句提示 "内存不足"(insufficient memory....)的解决方法

    由于本地执行的sql script的文件太大但是本地sql的运行内存有限,当我在MSSql的工具上运行这份178M左右的脚本的时候 它会提示 如下错误(Insufficient memory to c ...

  3. insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)

    vritualbox上安装redhat 6.4 32位系统 在安装完成重启后开始进行一些初始化的配置,在最后一项是配置Kdump 看到这个"没有足够的内存配置kdump"(在英文界 ...

  4. ORA-12801/ORA-12853: insufficient memory for PX buffers: current 274880K, max needed 19722240K/ORA-04031解决方法

    近日,现场一台服务器在运行时出现下列异常: ORA-12801: error signaled in parallel query server P139 ORA-12853: insufficien ...

  5. 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.

    =========================================================================================== 环境: linu ...

  6. idea Error: java: OutOfMemoryError: insufficient memory处理

    在更新项目代码或者运行项目时报错 OutOfMemoryError: insufficient memory,解决方式如下: 方式1: 点击file,选择Invalidate Caches 进行清理一 ...

  7. CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录

    CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录   问题起源:手贱yum upgrade,重启服务器后无法使用vnc viewer远程连接 查看状态 # system ...

  8. idea Error: java: OutOfMemoryError: insufficient memory 的处理

    idea Error: java: OutOfMemoryError: insufficient memory处理 在更新项目代码或者运行项目时报错 OutOfMemoryError: insuffi ...

  9. ie6,ie7,ie8 css bug兼容解决记录

    ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...

随机推荐

  1. 你所不知道的 CSS 阴影技巧与细节

    关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow 的用法. 最近一个新的项目,CSS-Ins ...

  2. JNI实战(三):JNI 数据类型映射

    在JNI实战(二):Java 调用 C 我们了解了JNI的静态注册和动态注册.也知道我们应该使用动态注册来进行JNI函数与Java方法之间的映射. 示例的映射表的数组为如下: static JNINa ...

  3. Linux 使用 free 命令查看内存使用情况

    1.free 命令的选项 使用 free 命令查看服务器内存使用情况. free [-b|-k|-m|-g|-h] [-l] [-o] [-t] [-s delay] [-c count] [-V] ...

  4. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  5. 腾讯短信服务精简版(PHP )

    短信视乎已经被慢慢淡出平常的交流工具队列,但始终抹不去它的存在,短信验证码视乎从未被取代,此外在重要的信息通知的地位也是不可取的的.所以了解短信的使用是开发中很有必要的一环. 腾讯云的短信服务提供有1 ...

  6. 从壹开始微服务 [ DDD ] 之六 ║聚合 与 聚合根 (下)

    前言 哈喽大家周二好,上次咱们说到了实体与值对象的简单知识,相信大家也是稍微有些了解,其实实体咱们平时用的很多了,基本可以和数据库表进行联系,只不过值对象可能不是很熟悉,值对象简单来说就是在DDD领域 ...

  7. Identity Server 4 - Hybrid Flow - MVC客户端身份验证

    预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...

  8. 【TensorFlow篇】--Tensorflow框架初始,实现机器学习中多元线性回归

    一.前述 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,T ...

  9. Openresty编写Lua代码一例

    1.前段时间纠结了很久,一直弄不清lua和tomcat的联系.一直认为是lua调用tomcat的接口才可使用,后面才明白过来,进入了一个误区,lua本身就是一门独立的脚本语言.在openresty里面 ...

  10. 机器学习——交叉验证,GridSearchCV,岭回归

    0.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set) ...