精华内容
下载资源
问答
  • 内存溢出排查手册.pdf

    2021-05-14 17:01:48
    内存溢出排查手册.pdf
  • java 内存溢出排查

    千次阅读 2018-05-26 20:28:16
    1,Java内存溢出包括:堆内存溢出和栈内存溢出 首先说下:内存溢出和内存泄露 内存溢出:out of memory 是指程序申请内存时没有足够的空间了 内存泄露: memroy leak,是指程序申请内存后,无法释放已申请的内存...

    1,Java内存溢出包括:堆内存溢出和栈内存溢出

    首先说下:内存溢出和内存泄露

    内存溢出:out of memory 是指程序申请内存时没有足够的空间了

    内存泄露: memroy leak,是指程序申请内存后,无法释放已申请的内存空间。

    内存泄露-》内存溢出

    堆内存溢出:

    排查方法:mat(memory analyzer tool)

    -vmargs:后面跟VM参数

    -Xms20M     -Xmx20M 堆内存的设置

    -XX:PermSize = 40M 非堆内存

    -XX:HeapDumpOnOutOfMemoryError :让虚拟机出现内存溢出时dump出此时的堆内存转储快照。

    -XX:HeapDumpOnCtrBreak

    -xss 设置栈内存

    获取转存储文件的方法:

    1.任务管理器

    2.jvisiualVM工具

    3.jmp,jconsole,jhat工具

    mat 查看内存使用情况

    (1)整体内存的消耗情况(overview)

    (2)分析可以对象

     

    优化从两个层面上来优化:

    (1)非代码层面:-Xms  -Xmx

    (2)代码层面

    内存溢出的几种方式:

    一. java堆溢出

    创建对象没有及时回收,

    1. dump出来堆转储快照 2. 使用MAT工具对dump出来的堆转储快照进行分析,重点是确认内存中得对象是否必要的,这样可以分清楚到底是出现了内存泄露(Memory Leak)还是内存溢出(Memory Overflow) 

    3. 如果是内存泄露,进一步通过MAT工具分析泄露对象到GC Roots的引用链。找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收的。 4. 如果不存在泄露,那么就是内存中得对象却是都还必须活着,就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大

    二. 虚拟机和本地方法栈溢出

     

    在单线程下,无论是由于栈帧太小还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常。 在多线程下,通过不断的建立线程的方式可以产生内存溢出OutOfMemoryError异常。

    在多线程情况下,给每个线程分配的内存越大,越容易产生内存溢出异常。由于操作系统分配给每个进程的内存是有限的,32位的Windows限制为2GB。虚拟机提供了参数来控制Java堆和方法区的这两部分内存的最大值。剩余的2GB减去Xmx,再减去MaxPermSize,忽略掉很小的程序计数器内存。如果虚拟机进程本身耗费的内存不计算,剩下的内存就是有虚拟机栈和本地方法栈瓜分了。此时如果每个线程分配到的虚拟机栈容量越大,可以建立的线程数量自然就越少,建立线程时就越容易把剩下的内存耗尽。 如果建立过多线程导致的内存溢出,在不能减少线程数或者更换64位虚拟机的情况下,就只能通过减少最大堆或者减少栈容量来获取更多的线程。

    出现StackOverflowError的时候有错误堆栈可以读,即时加入+HeapDumpOnOutOfMemoryError也不会dump异常堆内存。

     

    三.   运行时常量池溢出(PermGen space)

     

     

    如果要项运行时常量池中添加内容,最简单的方法就是使用String.intern()这个Native方法。

    异常信息:

    四. 方法区溢出

     

    方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。当大量的类产生时填满方法区,会造成方法去溢出。

    方法区溢出也是一种常见内存溢出异常,一个类如果要被垃圾收集器回收,判断条件非常苛刻。

      

     

    展开全文
  • jvm内存溢出区域和排查方法

    千次阅读 2019-01-17 13:50:09
    目录 1.堆溢出 2.栈溢出 3.方法区和运行时常量池溢出 4.本机直接内存溢出 首先我们需要掌握什么是内存溢出和内存泄漏 ...内存泄漏:即声明的对象...内存溢出(OOM)会出现在jvm内存的各个区域,程序计数器区是唯一不...

    目录

    1.堆溢出

    2.栈溢出

    3.方法区和运行时常量池溢出

    4.本机直接内存溢出


    首先我们需要掌握什么是内存溢出和内存泄漏

    内存泄漏:即声明的对象无法被回收,一直存在于内存中,使得占用的内存就像被泄漏消失了一样

    内存溢出:即剩余可用的内存空间过小,无法分配出下一步工作需要的内存。

    内存泄漏过多必然会导致内存溢出

    内存溢出(OOM)会出现在jvm内存的各个区域,程序计数器区是唯一不会发生OOM的地方。这些区域包括:栈、堆、方法区和运行时常量池、本机直接内存。我们来了解各个区域发生OOM的原因和解决,自然也就知道了如何进行排查。

    1.堆溢出

    堆用于储存对象实例,只要不断的创建对象或者对象无法被回收,达到一定程度必然会产生OOM。产生原因可能有2种情况:

    1.存在内存泄漏 2.堆分配得到的内存过小       异常信息会进一步提示“Java Heap Space”。

    解决方法:2种情况有不同解决方法,因此首先我们需要分清是哪一个原因导致了OOM。通过参数-xx:HeapDumpOutOfMemoryError可以让jvm在OOM时Dump出当前的内存堆快照,利用内存映像分析工具(如Eclipse Memory Analyzer)进行查看。如果是内存泄漏,通过工具查看泄漏对象,定位到对象位置,进行修正。如果不存在泄漏,即就是内存中的对象确实还必须活着,那就应当检查堆参数(-Xmx 和-Xms)是否过小,针对当前机器是否可以调大。

    2.栈溢出

    针对栈溢出,java虚拟机规范中描述了2中异常

    StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度。

    OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的空间。异常信息会进一步提示“。。。。create thread”

    但其实这2种情况描述的是一个事情,即到底是内存太小,还是已经使用的栈空间太大,无法再申请到栈空间。不同的是,OOM在多线程更容易出现。

    解决:StackOverflowError:通过-Xss参数增加栈内存容量(指单个栈容量) 。注意是否有太多的本地变量被定义,减少定义。

                OutOfMemoryError:通过减少最大堆(增加总的栈容量)或减少单个栈容量。此处为何说发生了OOM还要减少单个栈容                                               量呢,多线程OOM发生的原因是因为每个线程申请一个栈,减少单个容量来增加可申请栈的总数,                                                以此避免OOM。

    3.方法区和运行时常量池溢出

    大量的类或者大量的字面量被定义时会导致方法区和运行时常量池OOM,但出现的可能性比堆OOM要低。出现时会进一步提示“PermGen space”。

    解决方法:通过-XX:PermSize 和 -XX:MaxPermSize限制方法区大小

    4.本机直接内存溢出

    程序中直接或者间接的使用了nio,通过DirectByteBuffer请求内存,内存不足时也有可能产生OOM。明显特征是出现OOM时dump下来的文件很小,没有明显的异常信息。

    解决方法: 通过-XX:MaxDirectMemorySize可定义直接内存大小。

     

     

    展开全文
  • tomcat内存溢出原因分析与解决以及java内存溢出、栈溢出的原因与排查方法

    tomcat

    在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。

      这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

      1.OutOfMemoryError: Java heap space

      2.OutOfMemoryError: PermGen space

      3.OutOfMemoryError: unable to create new native thread.

      对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX: PermSize   -XX:MaxPermSize)

      最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

      第一种:是堆溢出

      在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

      没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

      -Xms:初始堆大小

      -Xmx:最大堆大小

      但堆的大小受下面三方面影响:

      1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试 1612M,64为操作系统对内存无限制。)

      2.系统的可用虚拟内存限制;

      3.系统的可用物理内存限制。

      堆的大小可以使用 java -Xmx***M   version 命令来测试。支持的话会出现jdk的版本号,不支持会报错。

      -Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m

      第二种:永久保存区域溢出

      PermGen space的全称是Permanent Generationspace,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGenspace区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGenspace错误。这种错误常见在web服务器对JSP进行precompile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。http://www.javaeye.com/topic/80620?page=1 的帖子有讨论的这个问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,导致内存溢出。

      这一个一般是加大-XX: PermSize   -XX:MaxPermSize 来解决问题。

      -XX: PermSize 永久保存区域初始大小

      -XX: PermSize 永久保存区域初始最大值

      这一般结合第一条使用,比如 set JAVA_OPTS= -Xms1024m -Xmx1024m   -XX: PermSize=128M -XX: PermSize=256M

      有一点需要注意:java -Xmx***M   version 命令来测试的最大堆内存是 -Xmx与 -XX: PermSize的和 比如系统支持最大的jvm堆大小事1.5G,那   -Xmx1024m   -XX: PermSize=768M 是无法运行的。

      第三种:无法创建新的线程。

      这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。

      这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。有人发现,在线程个数很多的情况下,你分配给JVM的内存越多,那么,上述错误发生的可能性就越大。

      产生这种现象的原因如下:每一个32位的进程最多可以使用2G的可用内存,因为另外2G被操作系统保留。这里假设使用1.5G给JVM,那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载,那么真正剩下的也许只有400M,现在关键的地方出现了:当你使用Java创建一个线程,在JVM的内存里也会创建一个Thread对象,但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范),操作系统会在余下的400兆内存里创建这个物理线程,而不是在JVM的1500M的内存堆里创建。在jdk1.4里头,默认的栈大小是256KB,但是在jdk1.5里头,默认的栈大小为1M每线程,因此,在余下400M的可用内存里边我们最多也只能创建400个可用线程。

      这样结论就出来了,要想创建更多的线程,你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。

      给出一个有关能够创建线程的最大个数的估算公式:

      (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

      对于jdk1.5而言,假设操作系统保留120M内存:

      1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads

      1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads

      在2000/XP/2003的boot.ini里头有一个启动选项,好像是:/PAE /3G ,可以让用户进程最大内存扩充至3G,这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。

      因此这种情况需要结合操作系统进行相关调整。

      因此:我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题。

    说完了原因后如何设置呢?

    这里面有两种情况:

    1、当用控制台启动的时候可以在,catalina.bat最前面加入 set JAVA_OPTS=-Xms128m -Xmx350m 。。。。

    2、当用服务启动的时候,设置的方法是不一样的,这点很多人忽视。见图如下,只有在这里设置才生效,这个困扰了我一会。


    当然也可以在注册表中进行配置,注册表的位置如下:

    HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters

    以上内容配置好后,应该不会出现这些问题,当然程序不能有内存泄漏。

    java

     1、 内存溢出的原因是什么?

           内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:

    一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;

    二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)

    三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)

    四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。

    五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。

    六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。

    如String s1 = "My name";

    String s2 = "is";

    String s3 = "xuwei";

    String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的

    但是String str =  "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。

    在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。

    七)使用 DDMS工具进行查找内存溢出的大概位置

    2、栈溢出的原因

          一)、是否有递归调用

    二)、是否有大量循环或死循环

    三)、全局变量是否过多

    四)、 数组、List、map数据是否过大

    五)使用DDMS工具进行查找大概出现栈溢出的位置

    Java Heap分为3个区:

    1.Young 2.Old 3.Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。

    JVM有2个GC线程:
    第一个线程负责回收Heap的Young区;
    第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区,Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

    为什么一些程序频繁发生GC?有如下原因:
    1. 程序内调用了System.gc()或Runtime.gc()。
    2. 一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
    3. Java的Heap太小,一般默认的Heap值都很小。
    4. 频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。

    如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态许多Server端的Java程序每次GC后最好能有65%的剩余空间。

    展开全文
  • 如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现Java内存溢出的问题。本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码。 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存...

    如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题。本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码。

    jvm中除了程序计数器,其他的区域都有可能会发生内存溢出

    内存溢出是什么

    当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出

    内存溢出和内存泄漏有什么区别

    内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。 
    当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用设为null。此时垃圾收集器会认为这个对象是需要的,就不会清理这部分内存。这就会导致这部分内存不可用。 
    所以内存泄漏会导致可用的内存减少,进而会导致内存溢出。

    用到的jvm参数

    下面为了说明溢出的情景,会执行一些实例代码,同时需要给jvm指定参数

    -Xms 堆最小容量(heap min size)

    -Xmx 堆最大容量(heap max size)

    -Xss 栈容量(stack size)

    -XX:PermSize=size 永生代最小容量

    -XX:MaxPermSize=size 永生代最大容量

    堆溢出

    堆是存放对象的地方,那么只要在堆中疯狂的创建对象,那么堆就会发生内存溢出。

    下面做一个堆溢出的实验 
    执行这段代码的时候,要给jvm指定参数










    //jvm参数:-Xms20m -Xmx20m 
    public class HeapOOMTest { 
    public static void main(String[] args){ 
    LinkedList xttblog=new LinkedList();//作为GC Root 
    while(true){ 
    xttblog.add(new HeapOOMTest());//疯狂创建对象 



    -Xms20m -Xmx20m作用是将jvm的最小堆容量和最大堆容量都设定为20m,这样就不会动态扩展jvm堆了 
    这段代码疯狂的创建对象,虽然对象没有声明变量名引用,但是将对象添加到队列l中,这样队列l就持有了一份对象的引用 
    通过可达性算法(jvm判断对象是否可被收集的算法)分析,队列l作为GC Root,每一个对象都是l的一个可达的节点,所以疯狂创建的对象不会被收集,这就是内存泄漏,这样总有一天堆就溢出了。

    运行结果:

    Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at java.util.LinkedList.linkLast(Unknown Source) at java.util.LinkedList.add(Unknown Source) at test.HeapOOMTest.main(HeapOOMTest.java:23) 
    程序发生内存溢出,并提示发生在Java heap space

    分析解决方法

    思路 
    用visualVM工具分析堆快照 
    如果发生内存泄漏: 
    step1:找出泄漏的对象 
    step2:找到泄漏对象的GC Root 
    step3:根据泄漏对象和GC Root找到导致内存泄漏的代码 
    step4:想法设法解除泄漏对象与GCRoot的连接 
    如果不存在泄漏:

    看下是否能增大jvm堆的最大容量

    优化程序,减小对象的生命周期

    前期准备 
    当发生堆溢出的时候,可以让程序在崩溃时产生一份堆内存快照 
    产生堆内存快照的方法: 
    给jvm加上参数XX:+HeapDumpOnOutofMemoryError,这样就会在程序崩溃的时候,产生一份堆内存快照 
    分析堆内存快照我建议用jdk自带的可视化监视工具visualVM,位置在jdk安装目录下的bin,如果是在Linux环境的话,可以把快照传到window。因为分析工具会占用很大的内存,不建议在服务端进行分析。

    实战 
    下面对刚才程序产生的堆内存快照进行分析。 
    打开visualVM,装入刚刚生成的快照,打开类标签页 
    visualVM 
    队列和疯狂创建的对象几乎占满了整个栈,想要让垃圾收集器回收这些对象,要让他们与GC Root断开连接 
    双击HeapOOMTest类,跳转到实例标签页,可以查看这个类的所有实例 
    在实例上右键——显示最近的垃圾回收根节点,可以看到这个对象与根节点的连接 
    StackOverFlowError 
    只要断开HeapOOMTest对象与LinkedList的连接,这些疯狂创建的对象就会被收集了

    栈溢出 
    调用方法的时候,会在栈中入栈一个栈帧,如果当前栈的容量不足,就会发生栈溢出StackOverFlowError 
    那么只要疯狂的调用方法,并且有意的不让栈帧出栈就可以导致栈溢出了。

    下面来一次栈溢出










    10 
    //jvm参数:-Xss128k 
    public class StackSOFTest { 
    public void stackLeak(){ 
    stackLeak();//递归,疯狂的入栈,有意不让出栈 

    public static void main(String[] args){ 
    StackSOFTest s=new StackSOFTest(); 
    s.stackLeak(); 


    jvm设置参数-Xss128k,目的是缩小栈的空间,这样栈溢出“来的快一点” 
    程序中用了递归,让栈帧疯狂的入栈,又不让栈帧出栈,这样就会栈溢出了。

    运行结果:

    Exception in thread “main” java.lang.StackOverflowError at test.StackSOFTest.stackLeak(StackSOFTest.java:17) at test.StackSOFTest.stackLeak(StackSOFTest.java:17) 
    运行时常量池溢出

    这里储存的是一些常量、字面量。如果运行时常量池内存不足,就会发生内存溢出。从jdk1.7开始,运行时常量池移动到了堆中,所以如果堆的内存不足,也会导致运行时常量池内存溢出。

    下面来一次运行时常量池溢出,环境是jdk8 
    只要创建足够多的常量,就会发生溢出










    10 
    11 
    12 
    13 
    14 
    15 
    16 
    /** 
    * jvm参数: 
    * jdk6以前:-XX:PermSize=10M -XX:MaxPermSize=10M 
    * jdk7开始:-Xms10m -Xmx10m 
    * */ 
    public class RuntimePoolOOM { 
    public static void main(String[] args){ 
    int i=1; 
    //保持常量的引用,防止被fullgc收集 
    LinkedList xttblog=new LinkedList(); 
    while(true){ 
    //将常量添加到常量池 
    xttblog.add(String.valueOf(i++).intern()); 



    因为jdk6以前,运行时常量池是在方法区(永生代)中的,所以要限制永生代的容量,让内存溢出来的更快。 
    从jdk7开始,运行时常量池是在堆中的,那么固定堆的容量就好了 
    这里用了链表去保存常量的引用,是因为防止被fullgc清理,因为fullgc会清理掉方法区和老年代 
    intern()方法是将常量添加到常量池中去,这样运行时常量池一直都在增长,然后内存溢出

    运行结果:

    Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

    at java.lang.Integer.toString(Unknown Source)
    
    at java.lang.String.valueOf(Unknown Source)
    
    at test.RuntimePoolOOM.main(RuntimePoolOOM.java:30)
    

    提示在heap区域发生内存溢出,果然运行时常量池被移到了堆中

    方法区溢出

    方法区是存放类的信息,而且很难被gc,只要加载了大量类,就有可能引起方法区溢出 
    这里将不做演示了,想试试的可以用cglib创建大量的代理类

    分析

    工作中也有可能会遇上方法区溢出: 
    当多个项目都有相同jar包的时候,又都存放在WEB-INF\lib\下,这样每个项目都会加载一遍jar包。会导致方法区中有大量相同类(被不同的类加载器所加载),又不会被gc掉。

    解决方案

    在应用服务器中建立一个共享lib库,把项目中常用重复的jar包存放在这里,项目从这里加载jar包,这样就会大大减少类加载的数量,方法区也“瘦身”了
    如果实在不能瘦身类的话,那可以扩大方法区的容量,给jvm指定参数-XX:MaxPermSize=xxxM

    转载于:https://www.cnblogs.com/lvgg/p/6840644.html

    展开全文
  • java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用...
  • 内存溢出排查

    千次阅读 2013-06-14 12:59:54
    出现内存溢出的问题我们要敢于面对,要通过适当的排查方法和相应的解决步骤一步一步找到问题出现的原因并最终解决掉该问题。 本文对使用报表过程中出现内存溢出问题进行简单地分析,给出一些建议性的排查步骤和解决...
  • 内存溢出排查步骤:

    千次阅读 2016-12-02 11:55:58
    内存溢出排查步骤: 确定是哪个内存区域溢出:是年轻代,还是老年代:通过jstat -gcutil在线看(如果年轻代都内存不断上升,并且100%,minor gc, 但是还是不释放的场景),通过gc.log离线看(启动JVM时设置如下...
  • 内存溢出排查

    2020-06-05 16:27:36
    面试官:怎么排查内存溢出呀? 点赞再看,养成习惯,微信搜索【三太子敖丙】关注这个互联网苟且偷生的工具人。 本文 GitHub github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 ...
  • 文档:【Java内存溢出排查】测试环境服务器挂... 链接:http://note.youdao.com/noteshare?id=783e7ec89950f4167867ef3ef33470b6&sub=48AEFC6FDECB4C60869FAA5FABF57AB0 通过以下命令信息可以确定是内存溢出...
  • 内存溢出排查 这是第一次排查内存溢出,梳理了下流程,分享给大家。 1. 常见Linux命令 排序 命令 含义 1 free -m 查看内存情况 2 top 动态查看物理内存及CPU,休眠线程数等 3 ...
  • Java内存溢出排查过程

    2020-04-08 22:52:54
    今天看到了敖丙的一篇关于排查内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识! 首先我使用的是Windows电脑,所以查看堆空间的插件在这里! 1、先看自己电脑的堆...
  • 1、 内存溢出的原因是什么?  内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否App中的类中和引用变量过多使用了Static修饰 如...
  • 关于Java Tomcat 内存溢出排查

    千次阅读 2018-07-17 11:14:20
    网站不知道什么时候,开始内存飙升,从 Tomcat 启动后,初始内存占用4%~5% ...一、定位造成内存溢出可能存在的问题 io流操作文档没关闭流。 往一个静态集合变量里一直压栈。 连接没释放。 Java队列没消耗。 ...
  • 这两天公司的一个程序出现问题,频繁出现内存溢出错误OutOfMemory:GC overhead limit exceeded. 虽然知道这个错误的原因是因为Java虚拟机在频繁进行垃圾回收,使用了98%的时间进行垃圾回收,但是实际回收了不到2%的...
  • java内存溢出排查

    2021-04-24 23:41:38
    获取dump 文件 jmap -dump:live,format=b,file=/home/srs/tmp/heap.hprof 6328
  • java内存溢出排查正确姿势:

    千次阅读 2016-10-21 18:16:22
    java内存溢出排查正确姿势: 1.jstat -gcutil pid 看gc频次是否正常,看gc是否能回收掉垃圾; 2.jmap -histo:live pid (这个会触发FGC) 3.jstack pid 看线程谁被阻塞 最后重启,重启前,jmap -dump:format=b,...
  • 记一次内存溢出排查过程

    千次阅读 2020-01-17 17:29:45
    解决了这里内存溢出的问题后,服务所用内存应该会大幅度降低,等服务运行一两天后再补充两张资源占用图。 在 2019 年博客总结 中提过: 因为我发现很多技术博客的内容中,很少涉及相关内容的出处,如果我...
  • 文章目录前言一、堆内存溢出二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文...
  • OOM 内存溢出排查手记

    2020-03-25 19:18:59
    到目前为止,发生了几次溢出。现将排查过程记录如下,供大家交流。 一,先将dump文件,下载到本地。 下载方式可以参见我前面的文章 二,将dump文件导入jvisualvm 可以看到出现OOM的线程是grpc,这个线程可以关注下,...
  • Java 内存溢出排查

    2018-10-23 20:24:17
    因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。 所遇到的问题 在使用 scala 开发的一个 web 服务,在用户使用中,经常出现: java.lang.OutOfMemoryError: Java heap space 。而且还束手无策,每次都只能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,608
精华内容 11,443
关键字:

内存溢出排查方法