内存溢出

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

半城伤御伤魂 提交于 2019-11-30 05:55:36
一,java开发中: java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 使用的第三方软件中的BUG; 启动参数内存值设定的过小; 此错误常见的错误提示: tomcat:java.lang.OutOfMemoryError: PermGen space tomcat:java.lang.OutOfMemoryError: Java heap space weblogic:Root cause of ServletException java.lang.OutOfMemoryError resin:java.lang.OutOfMemoryError java:java.lang.OutOfMemoryError 解决java.lang.OutOfMemoryError的方法有如下几种: 一、增加jvm的内存大小。方法有: 1)在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa

JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法

我与影子孤独终老i 提交于 2019-11-30 05:44:29
一、问题原因 用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。 原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。 概念补充: 内存泄露: 应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源。 内存溢出: 应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃。 通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。 对JMeter而言也是如此,JMeter测试过程中,如果内存溢出的话,一般会出现上图中的提示:java.lang.OutOfMemoryError: Java heap space : 意思就是堆内存溢出,不够用了 二、解决方法 知道了报错出现的原因是因为堆内存大小不足引起的,自然而然就会想到内存溢出的解决方法: 调整堆内存大小。 步骤(以Windows系统为例,Linux系统类似): 1、打开jmeter.bat文件,按关键字“HEAP”搜索,把原来的配置改为如下: 修改前: if not defined HEAP ( rem See the unix startup file for the rationale of the following parameters, rem

内存溢出问题分析与解决

耗尽温柔 提交于 2019-11-30 02:12:11
大型项目中会遇到内存溢出的问题,而项目中的代码数量往往是十万百万行,因此很难定位该类问题;这里我们需要借助内存分析工具---JProfiler。 该工具使用时需要激活码,激活码这里就不提供了,度娘搜索一大堆。。。 官网下载地址为 https://www.ej-technologies.com/download/jprofiler/files 工具安装好了之后,编写一段代码模拟内存溢出: 创建一个空类Test public class Test { }   接着创建一个主类Main public class Main { public static void main(String[] args) { List<Test> testList = new ArrayList<>(); while (true) { testList.add(new Test()); } } }   运行程序,并监控电脑内存占用,发现内存占用率不断升高,直到一个限定值 最后看到程序抛出内存溢出异常;那么该类问题如何定位呢?这里需要借助上述的内存分析工具以及java虚拟机调参一起定位问题所在。如下所示: -XX:+HeapDumpOnOutOfMemoryError -Xms20M -Xmx20M -XX:HeapDumpPath=D:\\liuxu 可以看到堆内存快照保存到指定目录: 接下来

jvm内存溢出问题的定位方法

允我心安 提交于 2019-11-30 01:30:54
jvm内存溢出问题的定位方法 今天给大家带来JVM体验之内存溢出问题的定位方法。 废话不多说直接开始: 一、Java堆溢出 测试代码如下: import java.util.*; public class A { public static void main(String[] args) { List<String> strList = new ArrayList<>(); while(true) { strList.add(""); } } } 运行过程如下所示: 我们在这里可以看到内存在不断的上涨,而Java在到一定时候会爆出OOM异常。 如下: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:265) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239) at java.util.ArrayList.ensureCapacityInternal

Java堆内存溢出的解决方案

北城余情 提交于 2019-11-30 00:29:42
JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。 先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。 年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。 堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。 非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。 在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。 元空间有注意有两个参数: MetaspaceSize :初始化元空间大小,控制发生GC阈值 MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存 为什么移除永久代? 移除永久代原因:为融合HotSpot JVM与JRockit VM(新JVM技术)而做出的改变

Tomcat中JVM内存溢出及合理配置

自作多情 提交于 2019-11-29 23:33:44
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。 一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的 内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中,它和堆不同,运行期内GC不 会释放其空间。 (1). 堆内存分配 JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC 后调整堆的大小。可以利用JVM提供的-Xmn -Xms

tomcat内存溢出解决

女生的网名这么多〃 提交于 2019-11-29 23:24:53
建议您创建一个名为setenv的文件。 蝙蝠和地点在Tomcat bin目录。 与这个文件(这是由卡特琳娜。 蝙蝠和卡特琳娜。 sh脚本),您可以更改以下Tomcat环境设置JAVA_OPTS变量: 你可以设置最小和最大内存堆大小 JVM xms和- xmx参数 。 最好的限制取决于许多条件,如转换,积分器ETL应该执行。 发现的信息转换,建议最多1 GB。 例如,将最小堆大小设置为128 MB,最大堆大小为1024 MB,使用 JAVA_OPTS=-Xms128m -Xmx1024m 你应该设定的最大极限PermGen(永久代)内存空间大小大于默认。 默认的64 MB是不够的企业应用程序。 一个合适的内存限制取决于不同的标准,但256 MB在大多数情况下将使一个不错的选择。 如果PermGen空间最大太低,OutOfMemoryError:PermGen空间可能会犯错误。 你可以设置JVM PermGen最大限度地使用以下参数 -XX:MaxPermSize=256m 由于性能原因,建议应用程序是运行在服务器模式。 Apache Tomcat不运行在默认服务器模式。 你可以设置使用JVM - Server服务器模式参数。 你可以设置JVM参数JAVA_OPTS变量在setenv环境变量文件。 The following is an example of a setenv.bat