内存溢出

内存溢出之PermGen OOM深入分析

不羁的心 提交于 2019-11-29 08:19:14
现在,网上关于讨论PermGen OOM的资料很多,但是深入分析PermGen区域内存溢出原因的资料很少。本篇文章尝试全面分析一下PermGen OOM的原因,其中涉及到了Java虚拟机运行时数据区、类型装载、类型卸载等,测试代码涉及到了JMX协议。相关前提知识如下: 1、Java类加载的基本原理 2、Java类型卸载相关的知识, http://www.blogjava.net/zhuxing/archive/2008/07/24/217285.html 3、简要了解JMX协议,有关JMX协议可以参加sun公司发布的技术规范,对JMX协议做一定的了解对理解Java性能监控和调优功能的实现原理有很大帮助。 【虚拟机运行时数据区介绍】 本部分将对Java虚拟机运行时数据区做一个简单的介绍,着重说明PermGen区域(永久存储区)存放的内容,并对运行时数据区的访问方式做一个归纳说明,为后面深入分析类型卸载和PermGen OOM做铺垫。为了更具有通用性,本部分将更多关注虚拟机协议本身,可能和具体的虚拟机实现有少许的出入。 【运行时数据区分类】 Java虚拟机的运行时数据区一般分类如下(不一定是物理划分): 堆:主要存放对象实例,线程共享 栈:主要存储特定线程的方法调用状态,线程独占 本地方法栈:存储本地方法的调用状态,线程独占 PC寄存器:学过操作系统课程的都知道,线程独占 方法区

异常体系

梦想的初衷 提交于 2019-11-29 05:46:33
我们在编译时不可避免会出现java异常,以下我会好好解释一下什么是异常 Throwable 是所有异常的父类,他有两大模块,error和exption eroor java本身无法处理的异常,也就是我们常说的错误 内存溢出 栈溢出 :无限递归导致栈溢出 堆溢出 :堆满了,垃圾回收不及时导致堆溢出 方法区溢出 :原因:内存不足,垃圾回收不及时 内存泄漏 没有及时关闭流、数据库没有及时关闭,泄漏最后也会导致内存溢出 exption: java可以处理的异常 运行异常 :程序启动时的异常 常见的有:空指针、内存溢出等异常 需要自己手动处理的异常,如果有报错了可以进行捕获或修改 检查异常 java代码直接报错,并且可以处理 来源: https://blog.csdn.net/chen196/article/details/100526526

JVM内存分析及导致内存溢出的不健壮代码及解决办法

試著忘記壹切 提交于 2019-11-29 04:38:35
转自:http://hi.baidu.com/fvsd3/blog/item/9baec09a301bdebcc9eaf4a2.html 一、JVM内存区域组成 java 把内存分四种: 1、栈区(stack segment)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源 2、堆区(heap segment) — 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收 3、静态区(data segment)— 存放全局变量, 静态变量 和字符串常量,不释放 4、代码区(code segment)— 存放程序中方法的二进制代码,而且是多个对象 共享一个代码空间区域 在方法(代码块)中定义一个变量时, java 就在栈中为这个变量分配内存空间,当超过变量的作用域后, java 会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由 java 虚拟机的自动垃圾回收器来管理,堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。 java 堆由Perm区和Heap区组成,Heap区则由 Old区 和New区组成

jvm 内存溢出 在myeclipse中加大tomcat的jvm内存

丶灬走出姿态 提交于 2019-11-29 04:34:14
使用myeclipse启动两个SSH2的部署在tomcat6下的项目 报出java.lang.OutOfMemoryError: PermGen space 解决办法: 在myeclipse中加大jvm内存方法: Window->Preferences->Myeclipse->Services->Tomcat->Tomcat 6.x->JDK,在Optional Java VM arguments:下边的输入框里输入: -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m 上边的数值看起来不大,但是我的项目运行很稳定了,可以先不要急着改掉上边的数值,先用上边的数值运行试试,如果还是溢出的话再适当调整 下边是直接调整jdk/jre的jvm的方式 Window->Preferences->Java->Installed JREs,在右侧双击当前使用的jdk/jre,在Default VM Arguments中输入 -Xms128m -Xmx512m 来源: oschina 链接: https://my.oschina.net/u/113523/blog/160032

myeclipse6.5内存溢出解决办法

大憨熊 提交于 2019-11-29 04:33:54
1、老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能 这个问题的解决办法是关闭自动更新 Windows > Preferences > MyEclipse Enterprise Workbench > Community Essentials, 把选项 "Search for new features on startup"的前勾去掉即可。 2 、关闭updating indexes Window > Preferences > Myeclipse Enterprise Workbench > Maven4Myeclipse > Maven> 禁用Download repository index updates on startup 。 3 、关闭MyEclipse的自动validation validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下, 只是需要的时候才会手工校验一 下,速度立马提升好几个档次 windows > perferences > myeclipse > validation 将Build下全部勾取消 如果你需要验证某个文件的时候,我们可以单独去验证它。方法是: 在需要验证的文件上( 右键 -> MyEclipse -> Run Validation 。

java OutOfMemoryError排查

佐手、 提交于 2019-11-29 03:34:12
一,什么是OOM,原因有哪些 OOM也叫内存溢出,导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 使用的第三方软件中的BUG; 启动参数内存值设定的过小; 二,通过一个案例定位排查 首先,看一下产生OOM的代码,它的语义是无限往集合中添加元素 import java.util.*; public class OomTest{ public static void main(String [] args){ List<String> list = new ArrayList<String>(); while(true){ list.add(new String("test")); } } }   首先介绍下用到的日志的概念以及工具: Heap Dump是什么? Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。 IBM heapAnalyzer:

connect ECONNREFUSED 127.0.0.1:80错误解决

倾然丶 夕夏残阳落幕 提交于 2019-11-29 02:41:43
  spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启。   最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory 1、复现结果:   采用Jmeter做压力测试,1s50次,持续请求,观察node进程占用内存情况   经过观察发现持续请求,node进程占用内存一直升高,最后达到1.4G左右,就不会再升,因为64位系统默认分配给node进程的上线就是1.4G,32位系统好像是0.7G。   达到1.4G之后,持续1/2分钟左右,进程就挂,报错堆内存溢出:FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory 2、解决过程   起初一直不知道原因,由于之前一直有上篇报错: connect ECONNREFUSED 127.0.0.1:80错误解决 ,的问题,所以刚开始以为是这个拒绝导致大量连接堆积导致,所以先解决了上述问题。   但是解决了上述问题之后,依然没有用,还是会报错。考虑到是页面的问题,所以换了一个纯静态页面请求,看是否因为页面代码的问题导致内存溢出,结果请求纯静态页面也是一样情况

spark 内存溢出处理

对着背影说爱祢 提交于 2019-11-28 12:43:38
简介 Spark中的OOM问题不外乎以下两种情况 map执行中内存溢出 shuffle后内存溢出 map执行中内存溢出代表了所有map类型的操作。包括:flatMap,filter,mapPatitions等。 shuffle后内存溢出的shuffle操作包括join,reduceByKey,repartition等操作。 后面先总结一下我对Spark内存模型的理解,再总结各种OOM的情况相对应的解决办法和性能优化方面的总结。如果理解有错,希望在评论中指出。 Spark 内存模型 Spark在一个Executor中的内存分为三块,一块是execution内存,一块是storage内存,一块是other内存。 execution内存是执行内存,文档中说join,aggregate都在这部分内存中执行,shuffle的数据也会先缓存在这个内存中,满了再写入磁盘,能够减少IO。其实map过程也是在这个内存中执行的。 storage内存是存储broadcast,cache,persist数据的地方。 other内存是程序执行时预留给自己的内存。 execution和storage是Spark Executor中内存的大户,other占用内存相对少很多,这里就不说了。 在spark-1.6.0以前的版本,execution和storage的内存分配是固定的,使用的参数配置

poi导出excel解决内存溢出

。_饼干妹妹 提交于 2019-11-28 07:52:21
解决方法 写excel时使用 SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook , 1000);只在内存中留1000行,不会占用过多的内存。下面只贴了部分代码。 public static void createExcelByTrade(List<String[]> mergeCellConfigList , Map<String, String[]> cellConfMap , List dataList ,String tempPath , String fileName ) { try { int excelRowNum = 0; short fontSize = 12; // 创建新的Excel 工作簿 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook , 1000); Sheet sheet = workbook.createSheet(fileName); // 设置合并表头 setMergeHeaderCellByTrade( workbook, sheet, mergeCellConfigList , excelRowNum, fontSize );

JVM——内存结构

血红的双手。 提交于 2019-11-28 05:59:07
一、程序计数器/PC寄存器 ( Program Counter Registe )   用于 保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址) ,由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置, 每个线程都需要有一个独立的程序计数器 ,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,是线程安全的。    特点: 1.线程私有 2.不会存在内存溢出 二、虚拟机栈(Java Virtual Machine Stack)    虚拟机栈总是与线程关联在一起的, 每当创建一个线程,JVM就会为该线程创建对应的虚拟机栈 ,在这个 虚拟机栈中又会包含多个栈帧(Stack Frame) ,这些栈帧是与每个方法关联起来的, 每运行一个方法就创建一个栈帧 ,每个栈帧会含有一些局部变量、操作栈和方法返回值等信息。每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧, 虚拟机栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向该地址。(只有一个活动栈)