近来在系统的运行过程中碰到了一位老朋友,它正是大家所熟悉的OutOfMemory*,不过跟以前那位不太一样,它托着一个Error的尾巴,另外则是系统在抛出该例外时,并没有退出JVM实例。
那么这位改头换面的朋友究竟是何许人也,Google了一下居然也有一大片的介绍,甚至有些Blog已经探索到JVM寻址技术。这里赞一下,很好很强大,但如同我老大所说,精确到这层面,那么我们所能做的优化工作还剩多少?
Okay,看一下JDK的specification中对OutOfMemoryError 的描述:
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.
Umm, 这意思是在说由于没有更多的可用内存给GC或内存已经溢出,导致JVM无法分配新的对象,所以抛出OutOfMemoryError。我觉得这似乎在说Heap的内存溢出, 然而OutOfMemoryError完全是Stack中无法启动线程而抛出的异常。(大伙觉得java对outofmemoryerror的描述有没有问题?
看了这段简单的描述,我立马想到了JVM 的Xmx参数,难道由于Heap size 太小, 导致无法新生对象?
事实上,我的Heap Size 设置为2047M, 系统的日志记录着在OutOfMemory时, 已使用内存才300+M, 问题越来越离奇,难道是内存泄露么。为此,我通过Linux的pmap查到系统进程中,每个对象地址的使用内存大小, 以及通过jmap查看JVM的Heap 中对象的内存占用情况,都表明内存占用很正常。最后只能无功而返.
继续Google, 看到Sun的一个论坛里也有人提到:
http://forums.sun.com/thread.jspa?threadID=605782&messageID=3360044
贴子里一个叫unsavory的人,他的解决方案是Threadpool, 意思是我们在生成销毁线程时,部分内存未被回收。最终导致了溢出,当然sun还有其他贴子说的更加离谱,说是在我们的项目中使用了RMI对象导致内存溢出。(摊手, 浪费了我不少时间.
事实上, 回到主题, 该异常由栈中抛出, 表明栈中无可用内存来服务线程。而JVM的内存大致可分为(这里不够严谨)内存数据区(包括Stack)+对象堆区,由于JVM实例进程寻址是一定的。所以两者此消彼涨的关系,对于32位的机子, JVM整个实例可用内存不到3G,加上我的Heap Size 设置了2G,留给数据区只有1G不到, 当时系统跑了大概500+的线程, 按照JDK1.5以来, 每个线程栈的大小为1M, 这样算出溢出就差不多了. 解决方案是减小Heap Size 的大小给数据区留下内存, 或是增加CPU位数。
分享到:
相关推荐
jvm-mon:基于控制台的JVM监视
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
jvm-study 方法执行过程 jvm申请内存 初始化运行时数据区 方法区:存放 class;静态变量:常量 堆:实例对象 栈:栈帧(对象的引用,方法) 类加载 执行方法 创建对象 堆空间分代划分 outOfMemory异常 ...
jvm内存详解,理解 JVM 如何使用 Windows 和 Linux 上的本机内存
Micrometer-jvm-extras 用于一组其他JVM流程度量标准。动机获得JVM超出其托管部分的“实际”内存使用率在您无法从外部进行检测的环境(例如PaaS)中,从JVM内部获取该信息用法< dependency> < groupId>io.github....
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
<jvm-arg>-Xms512m</jvm-arg> <jvm-arg>-Xss128k</jvm-arg> <jvm-arg>-Xmn184m</jvm-arg> <jvm-arg>-XX:ParallelGCThreads=20</jvm-arg> <jvm-arg>-XX:+UseConcMarkSweepGC</jvm-arg> <jvm-arg>-XX:+UseParNewGC</...
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
nginx-upstream-jvm-route 支持nginx版本1.15 解决nginx: [emerg] invalid parameter "srun_id=tomcat1" 问题
jvm-serializers:比较JVM上的序列化库的基准
kotlinx-coroutines-io-jvm-0.1.1.jar
是生态体系下的重要模块,它具备了JVM-Sandbox的所有特点,插件式设计便于快速适配各种中间件,封装请求录制/回放基础协议,也提供了通用可扩展的各种丰富API。 目标人群 - 面向测试开发工程师 线上有个用户请求一直...
苹果系统brew install jvm-monLinux / MacOS 下载并解压缩设置JAVA_HOME环境变量: export JAVA_HOME=/path/to/your/jdk8 从解压缩的目录中执行./bin/jvm-mon用法选择一个JVM进程,然后按Enter进行监视按q或Ctrl + C...
jvm-juc:jvm学习笔记
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用,更多对比参考。 使用场景 你...
代码如下:failed to create jvm error code -4 这一般应是内存不够用所致,解决方法参考如下。 打开 Android Studio 安装目录下的bin目录,查找并打开文件 studio.exe.vmoptions,修改代码: 代码如下:-Xmx512m 为...
| :----: | :-----: | :--: | :---: | :---: | :---: | :-------: | :---: | :----: | :---: | | Spring | MyBatis | Solr | Dubbo | Netty | Kafka | Zookeeper | Nginx | Tomcat | Redis | ## Java - JAVA基础 ...
jvm-services:Java(JVM)语言和生态系统
关于内存溢出报错的处理及解决方案: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemory 堆内存、非堆内存都描述
jvm-rs是受启发而在Rust中编程的玩具JVM(远未完成)。 该项目的主要目的是学习Rust和JVM。 因此,该项目的首要目标是代码的可读性。 基本思想是仅实现核心JVM,并使用rt.jar (来自OpenJDK)作为其类库。 我的开发...