精华内容
下载资源
问答
  • java内存溢出的几种原因和解决办法是什么?java内存溢出的几种原因和解决办法是:第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出:那什么样的情况就是堆栈溢出呢?当你看到下面的关键字...

    b8b0fc3614348c7116794d02eccd7fcd.png

    java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是:

    第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出:

    那什么样的情况就是堆栈溢出呢?当你看到下面的关键字的时候它就是堆栈溢出了:

    java.lang.OutOfMemoryError: ......java heap space.....

    也就是当你看到heap相关的时候就肯定是堆栈溢出了,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过一定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,自然不会去回收了;主意这个溢出之前,可能系统会提前先报错关键字为:

    java.lang.OutOfMemoryError:GC over head limit exceeded

    这种情况是当系统处于高频的GC状态,而且回收的效果依然不佳的情况,就会开始报这个错误,这种情况一般是产生了很多不可以被释放的对象,有可能是引用使用不当导致,或申请大对象导致,但是java heap space的内存溢出有可能提前不会报这个错误,也就是可能内存就直接不够导致,而不是高频GC.

    第二类内存溢出,PermGen的溢出,或者PermGen 满了的提示,你会看到这样的关键字:

    关键信息为:

    java.lang.OutOfMemoryError: PermGen space

    原因:系统的代码非常多或引用的第三方包非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀,虽然JDK 1.5以后可以通过设置对永久带进行回收,但是我们希望的是这个地方是不做GC的,它够用就行,所以一般情况下今年少做类似的操作,所以在面对这种情况常用的手段是:PermGen的溢出和-XX:MaxPermSize的大小。

    第三类内存溢出:在使用ByteBuffer中的allocateDirect()的时候会用到,很多javaNIO的框架中被封装为其他的方法

    溢出关键字:

    java.lang.OutOfMemoryError: Direct buffer memory

    如果你在直接或间接使用了ByteBuffer中的allocateDirect方法的时候,而不做clear的时候就会出现类似的问题,常规的引用程序IO输出存在一个内核态与用户态的转换过程,也就是对应直接内存与非直接内存,如果常规的应用程序你要将一个文件的内容输出到客户端需要通过OS的直接内存转换拷贝到程序的非直接内存(也就是heap中),然后再输出到直接内存由操作系统发送出去,而直接内存就是由OS和应用程序共同管理的,而非直接内存可以直接由应用程序自己控制的内存,jvm垃圾回收不会回收掉直接内存这部分的内存,所以要注意了哦。

    如果经常有类似的操作,可以考虑设置参数:-XX:MaxDirectMemorySize

    第四类内存溢出错误:

    溢出关键字:

    java.lang.StackOverflowError

    这个参数直接说明一个内容,就是-Xss太小了,我们申请很多局部调用的栈针等内容是存放在用户当前所持有的线程中的,线程在jdk 1.4以前默认是256K,1.5以后是1M,如果报这个错,只能说明-Xss设置得太小,当然有些厂商的JVM不是这个参数,本文仅仅针对Hotspot VM而已;不过在有必要的情况下可以对系统做一些优化,使得-Xss的值是可用的。

    第五类内存溢出错误:

    溢出关键字:

    java.lang.OutOfMemoryError: unable to create new native thread

    上面第四种溢出错误,已经说明了线程的内存空间,其实线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外的区域,无法为线程分配一块内存区域了,这个要么是内存本身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了,说明了原因,如何去修改,不用我多说,你懂的。

    第六类内存溢出:

    溢出关键字

    java.lang.OutOfMemoryError: request {} byte for {}out of swap

    这类错误一般是由于地址空间不够而导致。

    六大类常见溢出已经说明JVM中99%的溢出情况,要逃出这些溢出情况非常困难,除非一些很怪异的故障问题会发生,比如由于物理内存的硬件问题,导致了code cache的错误(在由byte code转换为native code的过程中出现,但是概率极低),这种情况内存 会被直接crash掉,类似还有swap的频繁交互在部分系统中会导致系统直接被crash掉,OS地址空间不够的话,系统根本无法启动,呵呵;JNI的滥用也会导致一些本地内存无法释放的问题,所以尽量避开JNI;socket连接数据打开过多的socket也会报类似:IOException: Too many open files等错误信息。

    展开全文
  • 这篇文章主要介绍了JAVA内存溢出解决方案图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1.在apache-tomcat-7.0.70\bin\catalina.bat(Linux 系统则在...

    这篇文章主要介绍了JAVA内存溢出解决方案图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    1.在apache-tomcat-7.0.70\bin\catalina.bat(Linux 系统则在catalina.sh) 文件下的 echo Using CATALINA_BASE: "%CATALINA_BASE%" 上面插入以下代码

    set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256M -XX:MaxPermSize=512m

    2.在eclispe 中的window-->Preferences-->java-->Installed JRES-->Edit-->Defalut VM arguments 下添加:-Xms64m -Xmx256m

    259aa2fe7db3857cdaa14234f18c828d.png

    736195678dc4576b700345ac59f69d05.png

    3.在eclispe 下的run-->Debug Configurations--> Apache Tomcat-->Arguments 添加:-XX:PermSize=128m -XX:MaxPermSize=256m

    05u33dvnur2.jpg

    4.在eclispe 下的Run-->Debug Configurations如图所示 添加:Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

    fnyupzhuoha.jpg

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

    展开全文
  • 引起内存溢出的原因有很多种,列举一下常见的有以下几种:1....5.启动参数内存值设定的过小内存溢出解决方案:第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)第二步,...

    引起内存溢出的原因有很多种,列举一下常见的有以下几种:

    1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

    2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

    3.代码中存在死循环或循环产生过多重复的对象实体;

    4.使用的第三方软件中的BUG;

    5.启动参数内存值设定的过小

    内存溢出的解决方案:

    第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

    第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

    第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

    重点排查以下几点:

    1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

    2.检查代码中是否有死循环或递归调用。

    3.检查是否有大循环重复产生新对象实体。

    4.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

    第四步,使用内存查看工具动态查看内存使用情况

    展开全文
  • Java常见的几种内存溢出解决方法【情况一】:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环;如果是java堆内存不够的话,...

    Java常见的几种内存溢出及解决方法【情况一】:

    java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环;

    如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决:

    -Xms3062m

    -Xmx3062m

    【情况二】

    java.lang.OutOfMemoryError:GCoverheadlimitexceeded

    【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。

    【解决方案】:

    1、查看系统是否有使用大内存的代码或死循环;

    2、通过添加JVM配置,来限制使用内存:

    -XX:-UseGCOverheadLimit

    【情况三】:

    java.lang.OutOfMemoryError:PermGenspace:这种是P区内存不够,可通过调整JVM的配置:

    -XX:MaxPermSize=128m

    -XXermSize=128m

    【注】:

    JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。

    【情况四】:

    java.lang.OutOfMemoryError:Directbuffermemory

    调整-XX:MaxDirectMemorySize=参数,如添加JVM配置:

    -XX:MaxDirectMemorySize=128m

    【情况五】:

    java.lang.OutOfMemoryError:unabletocreatenewnativethread

    【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。

    【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms-Xmx两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。

    【情况六】:

    java.lang.StackOverflowError

    【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。

    【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。

    展开全文
  • Java内存溢出详解

    2021-03-03 16:08:39
    Java内存溢出详解一、常见的Java内存溢出有以下三种:1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间...
  • 模拟Java内存溢出

    2021-03-16 21:38:10
    本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8)。修改虚拟机启动参数这里我们使用的是IDEA集成开发环境,选择Run/Debug Configurations然后选择Configuration,修改VM options配置,就可以...
  • 1、 内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc ...
  • java内存溢出怎么解决

    2021-03-04 05:52:47
    java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。导致OutOfMemoryError异常的常见原因有以下几种:内存中加载...
  • java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用...
  • 一 调整 虚拟机参数二 立即 释放无用的对象三 利用序列化和反...import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IO...
  • 本篇文章小编给大家分享一下Java内存溢出的几种情况代码实例解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。JVM(Java虚拟机)是一个抽象的计算模型。就如同一台...
  • IDEA内存溢出解决办法

    2021-03-16 04:00:58
    1、不要通过idea.exe启动,而是通过idea64.exe启动IDEA2、修改参数文件为idea.exe.vmoptions原文件为:-server-Xms128m-Xmx1024m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=128m-ea...Djava.net.preferIPv4Stac...
  • 容易引起内存溢出的直接原因可以归结为代码质量问题,在内存中存在大量的对象,垃圾回收器不能回收,随着程序的不断运行,程序会创造更多的对象,这些对象之间存在一定的内联关系,所以不容易造成被java垃圾回收器...
  • java内存溢出问题调试

    2021-03-08 19:32:28
    java程序时大家一定对一下两条异常并不陌生:java.lang.OutOfMemoryError: Java heap space...好的编码实践可能会大大降低内存溢出的产生。本文并不是写如何规避内存溢出,但是我还是要介绍一下如何能够尽量规避内...
  • Tomcat内存溢出分析及解决方法更新时间:2012年11月21日 15:41:43 作者:堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的,本文将详细介绍Tomcat内存溢出,需要了解...
  • 1.JVM Heap(堆)溢出java.lang.OutOfMemoryError: Java heap spaceJVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion...
  • Java 内存溢出排查

    2021-03-13 17:29:35
    Java OOM 毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免 OOM。 因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。...而且还束手无策,每次都只能重启服务解决。准备服务使用 jett...
  • Java内存溢出示例

    2021-02-27 20:49:11
    按照java内存的结构,发生内存溢出的地方常在于堆、栈、方法区、直接内存。一、堆溢出堆溢出原因莫过于对象太多导致,看代码:/*** java 堆溢出* VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError* @...
  • Java内存溢出详解一、常见的Java内存溢出有以下三种:1.java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间...
  • 什么是内存泄露,因为执行程序指令,引入数据,装载数据等等,都是需要内存空间的,内存空间也是有限的。 正常的程序执行,肯定是开辟内存空间,运行程序指令(输入、输出),程序结束,释放空间。这样可以保证内存的...
  • 解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java...
  • Java 内存溢出分析

    2021-02-27 12:21:00
    相关Java内存分配知识描述方法区保存装载的类信息类的常量池字段、方法信息方法字节码通常和永久(Perm)关联在一起Java堆和程序开发密切相关应用系统对象都保存在Java堆中所有线程共享Java堆对分代GC来说,堆也是分代...
  • 相信有一定java开发经验的人或多或少...在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Hea...
  • 但最近出现了内存溢出的情况,频繁的out of memory。先盲目尝试在启动脚本中增加-XX:-UseGCOverheadLimit。因为根据原因未找到,依然频繁的out of memory,只能一直观察jstat -gcutil ,看到老生代内存降不下来时,...
  • 1.首先这里先说一下内存溢出和内存泄露的区别:内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存...
  • 1. 传统方式:在内存中读取文件内容读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:Files.readLines(new File(path), Charsets.UTF_8);FileUtils.readLines...
  • 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;java.lang.OutOfMemoryError,是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError。原因...
  • java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。导致OutOfMemoryError异常的常见原因有以下几种:内存中加载...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,244
精华内容 42,897
关键字:

java内存溢出怎么解决

java 订阅