今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题。程序主要是读取分析 midi ,然后用波形模拟 midi 中的信息,最后记录相应内容,创建 wav 文件。在使用 WaveFileWriter 写文件的时候,因为波形数据较多,使用 new byte[139708800] 创建了一个大小约为134M的 byte 数组,导致程序抛出 java.lang.OutOfMemoryError: Java heap space。

  起初我想到可能原因是 JVM 的 HeapSize 大小不够,在 cmd 中查看,发现初始大小是下图这样的。也就是初始堆大小为 16777216 bits,也就是16M;堆的最大值是268435456 bits,也就是256M。而我需要创建的byte数组是134M,很可能heap space会不够。于是我就在系统变量里添加了"_JAVA_OPTIONS",将值设为"-Xmx1024m"。

  起初我以为经过这样的设置,应该就没有问题了。但是事实情况是,我重新运行了几次程序,有时候不会OOME,有时候会OOME。于是我就用jconsole去监控JVM内存使用情况,发现不管是否抛出OOME,堆内存都分配了134M的空间给我的byte数组。(jconsole是安装jdk时候自带的,如果配置了java环境变量,可以直接在cmd中输入"jconsole"即可启动)

  于是我猜想,是不是因为没有将 -Xms 和 -Xmx 设置为一样,从而导致垃圾回收之后,虚拟机重新分配内存不及时,导致错误率先抛出?按照 Java SE hotspot 的说明文档,如果 InitialHeapSize 和 MaxHeapSize 不一样,那么在运行过程中 JVM 会自动调整内存大小,默认值是上升20%。(具体值可在cmd中查看)这样的话,为了分配134M的内存,需要经过多次增长,所以有时内存重新分配快,就没有OOME,有时候重新分配慢,就会有OOME。不管怎样,为了避开这个问题,我就将"_JAVA_OPTIONS"系统变量的值设定为"-Xms1024m -Xmx1024m"。不过这次出现了新的问题,也是OOME,但是不是java heap space,而是outputstream.write(byte[]) (native method) 出现了OOME。原因是我将JVM的内存设置太大,导致Direct Memory不够了,执行本地方法的时候内存不足。于是我重新调整JVM的内存大小为512M,最终解决了问题。

  解决问题的关键点在三处:

  1. OutOfMemoryError: java heap space ,可以通过上调Xmx解决。
  2. OutOfMemoryError 如果是由于本地方法产生的,应该下调Xmx。这种解决问题的技巧在周志明的《深入理解java虚拟机》中有讲到。
  3. 学会用jconsole去监控内存使用情况。

  这次最终还残留了一个问题没有解决,为什么只设置-Xmx参数之后,OOME会间歇性出现。我只是猜想原因,真正的原因还有待验证。并且我还没有想到好的验证方法,希望有经验的朋友能帮忙指出!

转载于:https://www.cnblogs.com/rickyuu/p/error_solve_OutOfMemoryError.html

调整JVM堆内存解决OutOfMemoryError相关推荐

  1. JVM 堆内存设置原理

    堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  2. JVM堆内存与垃圾收集器

    3.1 谈谈Java中不同的引用类型? Java里有不同的引用类型,分别是强引用.软引用.弱引用和虚引用; 强引用:Object object = new Object();即使内存溢出了也不会回收这 ...

  3. JVM堆内存介绍、垃圾收集算法、垃圾回收器汇总

    目录 1. JAVA堆内存是如何划分的 1.1 为什么移除永久代? 1.2 分代概念 1.3 为什么分代? 1.4 为什么survivor分为两块相等大小的幸存空间? 1.5 JVM堆内存常用参数 2 ...

  4. 官方指定Jmeter配置JVM堆内存方式

    官方指定Jmeter配置JVM堆内存方式 文章目录 官方指定Jmeter配置JVM堆内存方式 1.概述 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmeter在windows环境 ...

  5. JVM堆内存(heap)详解

    很好的一篇文章,转载了http://blog.51cto.com/lizhenliang/2164876?wx= JAVA堆内存管理是影响性能主要因素之一. 堆内存溢出是JAVA项目非常常见的故障,在 ...

  6. JVM堆内存与非堆内存(heap)官方详解

    JVM堆内存与非堆内存(heap)官方详解 JAVA堆内存管理是影响性能主要因素之一. 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的. 先看下JAV ...

  7. JVM堆内存(新生代,老年代,Xms,Xmx)学习整理

    JVM堆内存 jvm堆内存主要分为新生代和老年代,当垃圾收集器触发GC的时候会对堆内存长时间没用的对象分代进行回收,新生代和老年代内存占比为1:2. 文章目录 JVM堆内存 新生代 1.Eden区 2 ...

  8. Elasticsearch JVM 堆内存使用率飙升,怎么办?

    1.引言 本系列文章介绍如何修复 Elasticsearch 集群的常见错误和问题. 这是系列文章的第四篇,主要探讨:Elasticsearch JVM 堆内存使用率飙升,怎么办? 第一篇:Elast ...

  9. 压测工具Ab(ApacheBench)使用入门,JVM堆内存调优及GC优化

    压测工具AB Ab(ApacheBench) 测试工具是 Apache 提供的一款测试工具,具有简单易上手的特点,在测试 Web 服务时非常实用. ab 一般都是在Linux上用. 安装非常简单,只需 ...

最新文章

  1. spring入门(二) 使用注解代替xml配置
  2. 你知道那些JVM性能调优
  3. Material Designer的低版本兼容实现(十)—— CheckBox RadioButton
  4. IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器
  5. hashmap的各种问题及答案
  6. 事件相关去同步 (ERD) 和事件相关同步化 (ERS)在脑电信号研究中的应用
  7. poj 1679: The Unique MST【次小生成树】
  8. 不思议迷宫c语言基础,不思议迷宫——新手入门所学
  9. .NET领域驱动设计—初尝(原则、工具、过程、框架)
  10. c语言 list 使用数组来实现_C|用数组或链表来实现队列这种抽象数据类型
  11. 面试题--------7、Files的常用方法
  12. 数据结构与算法分析(C++语言版)张琨版 课后答案———第一章
  13. 【wpa_supplicant】driver如何告诉supplicant自己做的一些事情以及结果
  14. 虚拟机安装win10提示operating system not found
  15. Lipschitz常数、Lipschitz条件
  16. Disturbed People_CodeForces1077B
  17. win10+macOS双系统时间不同步解决方案
  18. 小米开源框架MACE 源码阅读笔记 1
  19. Http系列---HTTP/1.1全面分析
  20. Ubuntu常用工具安装方法及地址

热门文章

  1. 国内拉取google Kubernetes镜像
  2. 10000字的Pandas核心操作知识大全!
  3. Transformer新玩法登Nature子刊
  4. 让你的博士经历更加轻松愉快的10个tips
  5. 2840 页的计算机毕业论文,这位华人小哥的博士论文究竟写了啥?
  6. 顶会paper越来越多,我该怎么看?
  7. Spring基础专题——第三章(反转控制与依赖注入)
  8. Redis的rdb格式学习
  9. 后退N帧协议中的滑动窗口
  10. python中yield的认识与学习|生成器