一.HeapSize OOM(堆空间内存溢出)

A.eg:List.add(" ")在一个死循环中不断的调用add却没有remove。

B.并发导致。

解决方法有:1.代码提速。这样可以使得相同对象的生存时间更短。更快被GC。

2.I/O操作时候,objecft=null可以辅助GC,一旦方法脱离了作用域,相应的局部变量应用就会被注销。

3.程序跑的飞快,还是出现OOM,考虑到去修改参数配置。

eg:堆的大小,堆空间的大小,堆空间要设置的足够大(相对),如果太大,发生FULL GC会很恐怖

4.内存可能在某些情况增加几十字节空间但未能释放,每次被GC,很老的对象被GC的较慢。

eg:Session中放数据,Session回话消失才会被注销,但是会话要很长的时间才会被注销。

不断的FULLGC就是不抛出OOM的现象,出现这种现象通常是一些藏匿的Bug或配置导致。

eg:Tomcat的session导致,session信息保存在全局的currentHashMap中,大量的HTTPClient访问创建的临时session。

但并保存系统中为之分配的SessionKey中和相关的Cookies信息,导致每次请求都创建session(几十个字节),一般看不出来,是一个堆积如山的过程。

二.PermGen OOM(永久代内存溢出)

A.常量池(JDK1.6,JDK1.7以后常量池不会放在永久代中了。)

string常量对象会在常量池(包含类名,方法名,属性名等信息)中以hash方式存储和访问,hash表默认的大小为1009,当string过多时,可以通过修改-xx:stringtableSize参数来增加Hash元素的个数,减少Hash冲突。

eg:不断的循环调用string中的intern()方法,就会导致OOM.

B.class加载

由于class被卸载的条件十分的苛刻,这个class所对应的classLoader下面所有的class都没有活对象的应用才会被卸载。

解决方法:在每次CGlib动态创建时,都重新给它设置一个classLoader,这样在运行代码就不会出现OOM,会发现大量的class被卸载。

三.DirectBuffer OOM(直接内存内存溢出)

Java中普通I/O用输入/输出流方式实现,输入流InputStream(终端—>直接内存->JVM),输出流(JVM->直接内存->终端),这一过程中有kenel与JVM之间的拷贝(很多次),为了使用直接内存,Java是有一块区域叫DirectBuffer,不是JavaHeap而是cHeap的一部分。

eg:设置-xx:MaxDirectMemorysize:256

分配一个ByteBufferallocateDirect(257*1024*1024)就会导致OOM。

四.StackOverflowError(栈内存溢出错误)

1.StackOverflowError,通常都是程序的问题,JVM对栈帧的大小设置已经很大了。

2.程序运行过程中,方法分派时,会分配frame来存放本地变量,栈,pc寄存器等信息,方法再调用方法会导致Java栈空间无止境的增长(死递归),Java的解决方法是:设置一个私有栈(不在堆内存,而是在NativeMemory),这个栈的空间大小,通过-Xss来设置,数量级在256K-1MB。如果使用空间超过了-Xss限制,就会出现StackOverflowError。

3.eg:死递归

死递归和死循环的区别:死循环类似于while(true)的操作,它的线程栈空间使用不会递增。而死递归需要记录退回的路径,递归过程中调用方法,每个方法运行过程中的本地变量。也就是要记录上下文信息。这些信息会随着内容的增加,占用很大的内存空间。

死递归:

eg:1.组件的复用。

2.子类调用父类(复用父类的方法),父类调用子类(达到多态的效果),这中间要经过许多方法,可能形成环,进而形成死递归。

3.三方框架的问题。

五.其他内存溢出

A.unable to creat new native thread

原因:物理内存不够用或者OS限制了单个进程使用的最大内存,大量的线程分配时,就有可能导致占用的Native Memory很多。

eg:死循环中创建线程并启动,线程内部申请变量,本身不退出。而且设置Os对进程内存的限制。

B.request{} byte for {}out of swap

地址空间不够用(不一定是物理地址,还有swap,显卡,网卡)

C.IoException:too many open files

打开太多的文件,也可能是本地的socket打开太多,而没有被关闭,太多没有关闭套接字导致。

更多精彩内容请看:Java特种兵上册,136-146页的内容。

电子版的下载地址为:http://download.csdn.net/detail/lichunlin1994/7986285

内存泄露(OOM)现象及举例的更多相关文章

  1. Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

    . 简介 即 ML (Memory Leak)指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象2. 对应用程序的影响 容易使得应用程序发生内存溢出,即 OOM ...

  2. 解Bug之路-记一次JVM堆外内存泄露Bug的查找

    解Bug之路-记一次JVM堆外内存泄露Bug的查找 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题.此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤 ...

  3. 内存泄露,C++

    内存泄露,C++通常是指new出来的内存没有delete掉.在你的代码里边,new了一块内存,然后马上就delete,自然就没有内存泄露了(呃……其实我也不确定啦,因为你用的是delete,而不是de ...

  4. 内存溢出(Oom)和内存泄露(Memory leak)

    1.概念 内存溢出(Oom):1.内存不够用:2.数据长度短的数据类型存储了一个数据长度较大的数据类型:3.一个结果 内存泄露(Memory leak):1.忘记释放已用内存,内存管理较为常见的现象: ...

  5. Android中内存泄露与如何有效避免OOM总结

    一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...

  6. java内存溢出和内存泄露

    虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...

  7. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  8. Android 性能优化之使用MAT分析内存泄露问题

    我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android ...

  9. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  10. JavaScript 中常见的内存泄露陷阱(摘)

    内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...

随机推荐

  1. **RESTful API版本控制策略

    做RESTful开放平台,一方面其API变动越少, 对API调用者越有利:另一方面,没有人可以预测未来,系统在发展的过程中,不可避免的需要添加新的资源,或者修改现有资源.因此,改动升级必不可少,但是, ...

  2. (12)nehe教程6 纹理映射

    在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多个多边形来构 ...

  3. (11)nehe教程5---3D空间

    3D空间: 我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体. 在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D ...

  4. Android ScaleAnimation类:尺寸变化动画类

    ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类. ScaleAnimation类中的很多方法都与Animation ...

  5. POJ 1904 HDU 4685

    这两道题差不多,POJ这道我很久以前就做过,但是比赛的时候居然没想起来.. POJ 这道题的题意是,N个王子每个人都有喜欢的公主,当他们选定一个公主结婚时,必须是的剩下的人也能找到他喜欢的公主结婚. ...

  6. uses-permission权限列表

    android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问”properties”表在checkin数据库中,改值可以修改上传 android.permiss ...

  7. Linux屏幕录制gif的工具及教程

    准备 要两个工具配合使用.它们可以用命令行安装,也可以用软件管理器安装. 1,byzanz     安装后有两个命令 byzanz-record   录制,既能录制 Gif 动画,又可录制 Ogv 视 ...

  8. Makefile简介

    1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...

  9. linux系统下怎么安装.deb文件

    linux系统下怎么安装.deb文件? deb 是 ubuntu .debian 的格式.rpm 是 redhat .fedora .suse 的格式. 他们不通用(虽然可以转换一下). deb是de ...

  10. jQuery mouseover与mouseenter的区别

    在我们的页面中经常会用到mouseover与mouseout事件来给页面添加更好的渲染效果,但如果触发mouseover事件的元素有子元素的话,会造成闪烁的效果,看着很不舒服,这是因为mouseove ...