精华内容
下载资源
问答
  • 主要介绍了Java内存溢出实现原因及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了JAVA 内存溢出案例的汇总,文中讲解非常细致,帮助各位工作学习时避免内存溢出,感兴趣的朋友可以了解下
  • JAVA内存溢出

    2016-04-21 10:18:55
    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
  • 主要介绍了java内存溢出示例(堆溢出、栈溢出),需要的朋友可以参考下
  • Java内存溢出解决办法 加大Tomcat使用Jvm内存(转载) 注重版权 Caused by: java lang OutOfMemoryError: Java heap space 错误原因及解决方法
  • NULL 博文链接:https://stride.iteye.com/blog/723340
  • Java内存溢出及分析

    2020-12-22 23:07:51
     java内存有几种:程序计数器,虚拟机栈,方法常量区,堆,本地方法栈,直接内存。既然分析内存溢出,那从这几种内存逐一分析。  1,程序计数器:是一个较小的内存空间,是但钱线程的字节码行号指示器,这个不会...
  • 主要介绍了Java内存溢出案例模拟和原理分析过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 背景:线上数据传输功能开启一段时间后就会出现内存溢出 个人理解:内存溢出,说明要不然获取到大量数据导致内存溢出,要不然就是数据无法释放,随着时间堆积越来越多。 日志:查看日志定位是数据传输处的内存...

    背景:线上数据传输功能开启一段时间后就会出现内存溢出

    个人理解:内存溢出,说明要不然获取到大量数据导致内存溢出,要不然就是数据无法释放,随着时间堆积越来越多。
     

    日志:查看日志定位是数据传输处的内存溢出导致的,该模块并非使用的定时任务,而是项目启动时运行,while(true)循环推送数据,推送完成后sleep5秒。初步以为是里面的对象未释放,但检查后发现所有对象使用完以后都置为null了。

    检查方式:使用jdk的工具jconsole.exe,jvisualvm.exe进行检查

    本地程序运行以后,从jconsole里面看到堆内存在缓慢增加,最后达到上限,内存溢出。查看jvisualvm 定位溢出点。

    个人理解就是接收端接收速度没有发送端发送的快,导致发送端数据累积发送不过去,越来越多导致数据溢出。查看接收端发现30个线程处理的情况下,5秒钟只能够处理约1000条数据,而发送端是设置的没5秒发送5000条数据。
    处理方案:开线程。多套服务接收。修改接收端方法一次接受多条数据(本次不行,限制了一次只能接受一条)

    jconsole.exe 和jvisualvm.exe 都在jdk的bin目录下。jconsole.exe打开后直接点击对应的程序,就可以查看了

    点击内存可以看到内存的使用情况。
    jvisualvm.exe点开后选择对应的程序右侧抽样-内存就可以查看内存的使用情况了

    PS : jconsole.exe的内存页面很适合用来学习内存的。堆内存分3个部分,Eden space ,Survivor Space,Tenured Gen。

    新建的对象在Eden Space,满了回收,不能回收的到Survivor Space,多次回收都无法回收的到 Tenured Gen

    展开全文
  • Java内存溢出场景及解决办法

    万次阅读 多人点赞 2018-10-04 21:11:23
    Java内存溢出即程序在申请内存时,没有足够的空间供其使用,出现out of memory。常见于四种情况:栈溢出(StackOverflowError)、堆溢出(OutOfMemoryError:java heap space)、永久代溢出(OutOfMemoryError: Perm...

           Java内存溢出即程序在申请内存时,没有足够的空间供其使用,出现out of memory。常见于四种情况:栈溢出(StackOverflowError)、堆溢出(OutOfMemoryError:java heap space)、永久代溢出(OutOfMemoryError: PermGen space)、OutOfMemoryError:unable to create native thread,以下一一进行总结。

    1、栈溢出

           首先搞清楚java栈空间存储的是什么。java栈空间是线程私有的,是java方法执行的内存模型。每个方法执行时都会在java栈空间产生一个栈帧,存放方法的变量表,返回值等信息,方法的执行到结束就是一个栈帧入栈到出栈的过程。

        所以栈溢出的原因一般是循环调用方法导致栈帧不断增多,栈深度不断增加,最终没有内存可以分配,出现StackOverflowError,比如下面这种情况:

    public class stack{
    
        public void test(){
    
            this.test();
        }
        public static void main(String[] args){
            for(; ; ;)
                new stack().test;
        }
    }

    栈内存溢出一般是程序错误导致,如递归死循环等等。

    2、堆溢出

           java堆是线程共有的区域,主要用来存放对象实例,几乎所有的java对象都在这里分配内存,也是JVM内存管理最大的区域。java堆内存分年轻代和年老代,堆内存溢出一般是年老代溢出。当程序不断地创建大量对象实例并且没有被GC回收时,就容易产生内存溢出。当一个对象产生时,主要过程是这样的:

    JVM首先在年轻代的Eden区为它分配内存;

    若分配成功,则结束,否则JVM会触发一次Young GC,试图释放Eden区的不活跃对象;

    如果释放后还没有足够的内存空间,则将Eden区部分活跃对象转移到Suvivor区,Suvivor区长期存活的对象会被转移到老年代;

    当老年代空间不够,会触发Full GC,对年老代进行完全的垃圾回收;

    回收后如果Suvivor和老年代仍没有充足的空间接收从Eden复制过来的对象,使得Eden区无法为新产生的对象分配内存,即溢出。

    由此可见,当程序不断地创建大量对象实例并且没有被GC回收时,就容易产生内存溢出。如下:

    public class heap{
        public static void main(String[] args){
            ArrayList list = new ArrayList();
            while(true){
                list.add(new heap());
            }
        }
    }

           堆内存溢出很可能伴随内存泄漏,应首先排查可能泄露的对象,再通过工具检查GC roots引用链,从而发现泄露对象是由于何种引用关系使得GC无法回收他们;若不存在内存泄漏,换句话说就是内存中的对象还都需要继续存活,则可通过修改虚拟机的堆参数将堆内存增大。

    3、永久代溢出

    永久代也是java堆内存的一部分,主要用来存放Class的相关信息,如类名,访问修饰符等等。一般永久代溢出的原因是动态加载大量的Class并且没有及时被GC回收。只能通过调整永久代内存参数的方式解决。

    4、无法创建本地线程

    我们知道,操作系统对每个进程的内存都是有一定限制的,当堆内存和非堆内存分配过大时,剩余的内存不足以创建足够的线程栈,就会产生OutOfMemoryError。因此我们可以增大进程占用的总内存或减小堆内存等来解决问题。

     

    总结:

    • 栈内存溢出:程序所要求的栈深度过大导致。
    • 堆内存溢出: 分清 内存泄露还是 内存容量不足。泄露则看对象如何被 GC Root 引用。不足则通过 调大 -Xms,-Xmx参数。
    • 持久带内存溢出:Class对象未被释放,Class对象占用信息过多,有过多的Class对象。
    • 无法创建本地线程:总容量不变,堆内存,非堆内存设置过大,会导致能给线程的内存不足。

    参考博客:

    https://blog.csdn.net/u014131893/article/details/22474881

    https://blog.csdn.net/ni357103403/article/details/51940884/

    展开全文
  • 主要介绍了简单了解JAVA内存泄漏和溢出区别及联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java内存溢出异常及其处理

    千次阅读 2019-02-04 12:19:30
    熟悉Java内存划分及运行的首要目的就是预防JVM抛出内存溢出相关的异常,或者说当发生这样异常是该如何排查问题,定位问题并且给出合理的解决方案,这对于开发工作以及后期维护工作的顺利进行尤为重要。 一、在Java...

        熟悉Java内存划分及运行的首要目的就是预防JVM抛出内存溢出相关的异常,或者说当发生这样异常是该如何排查问题,定位问题并且给出合理的解决方案,这对于开发工作以及后期维护工作的顺利进行尤为重要。

    一、在Java语言中,对象访问是如何进行的?

        即使是最简单的访问,也会涉及Java栈、Java堆、方法区这三个最重要内存区域之间的关联关系。比如下面这行代码:

        Object obj = new Object();

        简单分析一下这行看似普通的代码:

    • 首先,“Object obj ”这部分的语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现。

    • 其次,“new Object()”这部分语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值的结构化内存。

    • 另外,在Java堆中还必须包含能查到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型的数据类型存储在方法区中。

        而且,不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄直接指针。这两种方式应用都十分广泛。

    • 句柄:Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。优点是:reference中存储的是稳定的句柄地址只移动指针,不会修改reference本身。

    • 直接指针:Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。优点是:速度快,节省开销。

     

    二、有关于OutOfMemoryError异常的实战处理

    目的:

    • 通过代码验证Java虚拟机规范中描述的各个运行时区域储存的内容。

    • 希望开发者能根据异常的信息快速判断是哪个区域的内存溢出,知道怎样的代码可能会导致这些区域的内存溢出,以及出现这些异常后该如何处理。

    1.Java堆溢出

        Java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制来清除这些对象,就会在对象数量到达最大堆的容量限制后产生内存溢出异常。

       首先,限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xms参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析。 以下是在Mac下使用idea设置虚拟机参数:

    第一步:打开“Run->Edit Configurations”菜单

    ​第二步:选择“VM Options”选项,输入你要设置的VM参数

    输入参数内容为:

    -verbose:gc
    -Xms20M
    -Xmx20M
    -Xmn10M
    -XX:+PrintGCDetails
    -XX:SurvivorRatio=8

    第三步:点击“Apply->OK”按钮

    第四步:代码如下。

    package com.OOM;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: OOM异常例子剖析
     * <p>
     * 运行一下代码之前需要限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xms参数设置为一样即可避免堆自动扩展),
     * 通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析。
     * 如何设置虚拟机运行参数的博文连接:https://www.cnblogs.com/huiAlex/p/8227980.html
     * @author: Mr.Wang
     * @create: 2019-02-03 14:23
     **/
    public class HeapOOM {
        static class OOMObject {
        }
    
        public static void main(String[] args) {
            List<OOMObject> list = new ArrayList<>();
            while (true) {
                list.add(new OOMObject());
            }
    
        }
    
    }

        以上代码的运行结果:不光给出了错误原因是OutOfMemoryError,而且指明了是在堆内存中发生的。下面还有堆中各个分区的信息,相比于eclipse,IDEA人性化了很多。

    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(ArrayList.java:231)
    	at java.util.ArrayList.add(ArrayList.java:462)
    	at com.OOM.HeapOOM.main(HeapOOM.java:22)
    	
    Heap
     PSYoungGen      total 9216K, used 7786K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
      eden space 8192K, 95% used [0x00000007bf600000,0x00000007bfd9aa80,0x00000007bfe00000)
      from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
      to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
     ParOldGen       total 10240K, used 8783K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
      object space 10240K, 85% used [0x00000007bec00000,0x00000007bf493f08,0x00000007bf600000)
     Metaspace       used 3122K, capacity 4500K, committed 4864K, reserved 1056768K
      class space    used 341K, capacity 388K, committed 512K, reserved 1048576K

    那么,应该如何解决这个异常呢?以下是解决方向:

    • 通过内存映像分析功能根据对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄露还是内存溢出。

    • 如果是内存泄露,可进一步通过工具查看泄露对象到GC Roots的引用链。

    • 如果不存在泄露,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大,从代码上检查是否存在某些对象的生命周期过长,持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

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

        由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是无效的,栈容量只由-Xss参数设定。关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常:

    • 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常

    • 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常

    测试代码(一):

    • 使用-Xss参数减少栈内存容量。结果:抛出StackOverflowError异常,异常出现时输出的栈深度相应缩小。

    • 定义了大量的本地变量,增加此方法帧中本地变量表的长度。结果:抛出StackOverflowError异常时输出的栈深度相应缩小。

    package com.OOM;
    
    /**
     * @description: 虚拟机栈和本地方法栈OOM测试    -Xss128k
     * @author: Mr.Wang
     * @create: 2019-02-03 22:14
     **/
    public class JavaVMstackSOF {
        private int stackLength = 1;
    
        public void stackLeak() {
            stackLength++;
            stackLeak();
        }
    
        public static void main(String[] args) {
            JavaVMstackSOF oom = new JavaVMstackSOF();
            try {
                oom.stackLeak();
            } catch (Throwable throwable) {
                System.out.println("stack length:" + oom.stackLength);
                throw throwable;
            }
        }
    }

    输出结果为:

    stack length:20898
    Exception in thread "main" java.lang.StackOverflowError
    	at com.OOM.JavaVMstackSOF.stackLeak(JavaVMstackSOF.java:13)

    实验结果表明:

        在单个线程下,无论是由于栈帧太大,还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常。

        但是,如果是建立过多线程导致的内存溢出,在不能减少线程数或者更换64位虚拟机的情况下,就只能通过减少最大堆和减少栈容量来换取更多的线程。

     

    测试代码(二):

    package com.OOM;
    
    /**
     * @description: 创建线程导致内存溢出异常
     * @author: Mr.Wang
     * @create: 2019-02-03 23:55
     **/
    public class JavaVMStackOOM {
        private void dontStop() {
            while (true) {
    
            }
        }
    
        private void stackLeakByThread() {
            while (true) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        dontStop();
                    }
                });
                thread.start();
            }
        }
    
        public static void main(String[] args) {
            JavaVMStackOOM oom = new JavaVMStackOOM();
            oom.stackLeakByThread();
        }
    }

    注意:在windows平台的虚拟机执行以上代码有较大风险,可能会造成操作系统假死。

    运行结果:

    Exception in thread "main" java.lang.OutOfMemoryError:unable to create new native thread
    

    3.运行时常量池溢出

        如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。

        下面将展示代码实例,在运行代码之前同样需要设置虚拟机参数,如下:

    代码如下:

    package com.OOM;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @description: 运行时常量池导致的内存溢出异常  -XX:PermSize=10M -XX:MaxPermSize=10M
     * @author: Mr.Wang
     * @create: 2019-02-04 00:15
     **/
    public class RuntimeConstantPoolOOM {
        public static void main(String[] args) {
            // 使用list保持着常量池引用,避免FULL GC回收常量池行为
            List<String> list = new ArrayList<String>();
            // 10MB的PermSize在integer范围内足够产生OOM了
            int i = 0;
            while (true) {
                System.out.println("i:" + i);
                list.add(String.valueOf(i++).intern());
            }
        }
    }

    运行结果:

    Exception in thread "main" java.lang.OutOfMemoryError:PermGen space

    结论:

        运行结果表示,产生OOM的部分是PermGen space,说明运行时常量池属于方法区(HotSpot虚拟机中的永久代)的一部分。

     

    4.方法区溢出

        方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

        以下代码是模拟方法区溢出时的情形,在Spring和hibernate对类进行增强时也会用到CGLib这类字节码技术,增强的类越多,就需要越大的方法区来保证动态生成的Class可以加载入内存。

    代码如下:

    package com.OOM;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * @description: 借助CGLib使得方法区出现内存溢出异常 -XX:PermSize=10M -XX:MaxPermSize=10M
     * @author: Mr.Wang
     * @create: 2019-02-04 11:40
     **/
    public class JavaMethodAreaOOM {
        public static void main(String[] args) {
            while (true) {
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(OOMObject.class);
                enhancer.setUseCache(false);
                enhancer.setCallback(new MethodInterceptor() {
                    @Override
                    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                        return methodProxy.invokeSuper(o, objects);
                    }
                });
                enhancer.create();
    
            }
        }
        static class OOMObject {
        }
    }

    运行结果:

    Caused by:java.lang.OutOfMemoryError:PermGen space

    需要注意的是,如果你的JDK版本是1.8.那么控制台会提示你:

    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=10M; support was removed in 8.0
    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=10M; support was removed in 8.0

    也就是说JDK1.8版本不支持这两个参数配置。

     

    5.本机直接内存溢出

        DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xms指定)一样。

    代码如下:

    package com.OOM;
    
    import sun.misc.Unsafe;
    
    import java.lang.reflect.Field;
    
    /**
     * @description: 使用unsafe分配本机内存 -Xmx20M -XX:MaxDirectMemorySize=10M
     * @author: Mr.Wang
     * @create: 2019-02-04 11:53
     **/
    public class DirectMemoryOOM {
        private static final int _1MB = 1024 * 1024;
    
        public static void main(String[] args) throws Exception {
            Field unsafedField = Unsafe.class.getDeclaredFields()[0];
            unsafedField.setAccessible(true);
            Unsafe unsafe = (Unsafe) unsafedField.get(null);
            while (true) {
                unsafe.allocateMemory(_1MB);
            }
        }
    }

    运行结果:

    Exception in thread "main" java.lang.OutOfMemoryError

     

    展开全文
  • Java内存溢出OOM之dump分析

    千次阅读 2021-03-06 20:46:01
    内存溢出 1.Java堆内存异常 报错方式 原因 2.Java栈内存异常 报错方式 原因 3.方法区内存异常 报错方式 原因 解决思路 生成dump文件三种方式 dump生成 jvisualvm本地方式 1.启动jvisualvm 2.应用程序...

    目录

    内存泄露

    内存溢出

    1.Java堆内存异常

    报错方式

    原因

    2.Java栈内存异常

    报错方式

    原因

    3.方法区内存异常

    报错方式

    原因

    解决思路

    生成dump文件三种方式

    dump生成

    jvisualvm本地方式

    1.启动jvisualvm

    2.应用程序启动

    3.从jvisualvm控制台,进入监控应用程序面板

    4.模拟OOM

    线上模式

    1.查找到进程相关:top -c

    2.查看堆gc每秒相关信息

    3.查找栈相当问题

    4.有必要时,使用命令生成jmap文件

    5.下载dump文件,使用MAT工具/jhat分析。

    其它辅助命令

    dump分析

    MAT工具分析dump文件

    1.安装

    2.加载dump文件

    3.加载完成

    4.分析结果

    jhat命令分析dump文件

    1.启动jhat

    2.访问分析


    内存泄露

    代码中的某个对象本应该被虚拟机回收,因为GCRoot引用而没有被回收。

    内存溢出

    虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象。

    有如下三种异常:

    1.Java堆内存异常

    报错方式

    java.lang.OutOfMemoryError: Java heap space

    原因

    异常导致-Xms或-Xmx配置不足

    • 使用了大量的递归或无限递归对象
    • 使用了大量循环或死循环(循环中用到了大量的新建的对象)
    • 使用了向数据库查询过多,可能会造成内存溢出。
    • 有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

    2.Java栈内存异常

    报错方式

    Exception in thread "main" java.lang.StackOverflowError

    原因

    对象过大或过多异常,导致-Xss配置的内存不足

    • 是否有递归调用
    • 是否有大量循环或死循环
    • 全局变量是否过多
    • 数组、List、map数据是否过大

    3.方法区内存异常

    报错方式

    Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

    原因

    异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足

    解决思路

    1、当不通过日志文件主观来判断出问题代码时,通过分析dump文件来分析

    2、Arthas工具分析-见下篇分析

    生成dump文件三种方式

    1.jvisualvm控制台,监控时主动生成dump文件

    2.使用jmap命令生成dump文件

    • windows环境:jmap -dump:live,format=b,file=heap.hprof <pid>
    • linux环境:./jmap -dump:live,format=b,file=heap.hprof <pid>

    3.在应用启动时配置添加 -XX:+HeapDumpOnOutOfMemoryError 参数,

    当应用抛出OutOfMemoryError 时自动生成dump文件;目录指定:XX:HeapDumpPath

    [zoms@ocs ~]$ jmap -dump:live,format=b,file=heap-vm.hprof 15463
    Dumping heap to /home/zoms/heap-vm.hprof ...
    Heap dump file created
    

    dump生成

    jvisualvm本地方式

    1.启动jvisualvm

    在jdk1.8安装目录下,${JDK_HOME}\bin\jvisualvm.exe,双击启动Java VisualVM控制台

    image.png

    2.应用程序启动

    模拟OOM代码

    /**
     * @Description
     * @Auther: huhua
     * @Date: 2021/3/4
     */
    @Slf4j
    public class TestDump {
        public static void main(String[] args) throws Exception {
            Integer size = 1024 * 1024 * 8 ;
            List<byte[]> list = new ArrayList<byte[]>();
            for(int a=1; a<1000; a++){
                Thread.sleep(1000);
                list.add(new byte[size]);
                log.info("JMV测试:list写入{}M", a*8);
            }
    
        }
    }

    3.从jvisualvm控制台,进入监控应用程序面板

    可查看到本地运行java应用,选择应用进入

    • 概述

    image.png

    • 实时监视

    image.png

    4.模拟OOM

    image.png

    • 点击“堆Dump”或在应用上右击选择生成快照文件。

    image.png

    • 可用MAT工具去分析dump文件

    线上模式

    1.查找到进程相关:top -c

    也可jps 或ps -ef|grep java 或 ll /proc/<pid> 找到相关java进程

    2.查看堆gc每秒相关信息

    调优YGC的次数非常少,FGC更少:jstat -gc <pid> 1000(每隔ms数)

    3.查找栈相当问题

    使用命令 jstack -l 1346 查看线程栈信息,锁问题

    4.有必要时,使用命令生成jmap文件

    jmap -dump:live,format=b,file=/xx/xxx/xxx.hprof <pid>

    ps:该命令对正在运行应用会产生影响,要谨慎使用,生产环境考虑arthas,具体可参见arthas分析。

    5.下载dump文件,使用MAT工具/jhat分析。

    其它辅助命令

    • 查看gc回收统计情况:jstat -gc pid 1000(每隔ms数) 5(输出次数)
    • 查看内存使用情况:jmap -heap pid
    • 查看内存中对象数据:jmap -histo:live <pid> | more

    dump分析

    MAT工具分析dump文件

    1.安装

    下载:http://www.eclipse.org/mat/downloads.php

    解压后,点击MemoryAnalyzer.exe启动

    image.png

    2.加载dump文件

    image.png

    3.加载完成

    image.png

    4.分析结果

    从图看有三个problem,依次往下查看各个problem

    image.png

     

    点击Details查看problem具体描述

    image.png

    点击如下图标可切换到Class Name视图

    image.png

    jhat命令分析dump文件

    1.启动jhat

    #用法:
    jhat -port <port> <file>
    
    #示例:
    
    [zoms@ocs ~]$ jhat -port 8035 heap-vm.hprof
    Reading from heap-vm.hprof...
    Dump file created Fri Mar 05 15:30:57 CST 2021
    Snapshot read, resolving...
    Resolving 239638 objects...
    Chasing references, expect 47 dots...............................................
    Eliminating duplicate references...............................................
    Snapshot resolved.
    Started HTTP server on port 8035
    Server is ready.
    

    2.访问分析

    1. 通过http://ip:port来访问分析控制台,可以查询到所有的目录下类及对象

    image.png

    1. 在页面最下方也提供其它方式查询

    image.png

    • 展示堆快照直方图:Show heap histogram

    image.png

    通过对象,可查询到对象的异常,如大小异常

    image.png

    • 使用OQL查询:Execute Object Query Language (OQL) query

    可使用特殊语法查询。可以在OQL help处模仿编写

    image.png

    展开全文
  • 主要介绍了Java内存溢出和内存泄露的相关资料,需要的朋友可以参考下
  • 【Java面试题】Java内存溢出
  • 主要介绍了JAVA内存溢出解决方案图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java内存溢出详解及解决方案

    万次阅读 2018-03-12 10:27:18
    内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,...
  • java内存溢出时dump出内存详情

    千次阅读 2020-03-06 17:55:06
    有一个jar包报内存溢出了,为了方便分析,于是我就在启动命令中加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/jvm_sever1.hprof参数,后来发现,这个参数需要加在-jar前面才生效,在此做一下记录。...
  • java 内存溢出排查

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

    千次阅读 2019-03-07 12:19:27
    1、查询gc情况(每1秒钟打印一次gc情况) ...M:元数据区(java8,相当于java7及之前的永久代的概念)使用大小 ccs:压缩后使用率 YGC:young gc 次数, YGCT:young gc耗时 FGC:full gc次数 FGCT:f...
  • Java内存溢出代码实例

    2019-09-28 20:59:39
    1.什么是内存溢出 JVM运行时可分为虚拟机栈,堆,元空间,程序计数器,本地方法栈等等。在虚拟机管理内存自动内存管理机制下,不需要自己来实现释放内存。但是由于某些操作不当,也可能导致虚拟机异常,比如内存分配...
  • Java内存溢出与栈溢出分析

    千次阅读 2018-06-14 15:53:18
    一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆持久带 = 方法区 + 其他堆 = Old Space + Young SpaceYoung Space = ...
  • Java内存溢出的几种情况

    千次阅读 2018-06-14 15:12:15
    目录1. Java堆溢出1.1 模拟场景1.2 用内存影响分析工具分析堆快照2.虚拟机栈和本地方法栈溢出2.1 StackOverflowError异常2.2 ...本机直接内存溢出5. JVM相关wiki和工具 正文本文通过几段代码模拟实际的内存...
  • java内存溢出的定位和分析

    千次阅读 2019-08-12 11:23:37
    内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等,都会造成内存溢出。 如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并进行分析,是...
  • java内存溢出解决方案

    2013-09-25 23:43:53
    该文档详细描述了,内存溢出各种问题和解决方案,适合学习!
  • java内存溢出的2种情况

    千次阅读 2018-05-05 16:54:07
    进过自己一番总结内存溢出主要分为2种: 一、堆内存溢出 OutOfMemoryError 从jvm的角度看发生的情况是:1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是...
  • 主要介绍了详解Java内存溢出的几种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 性能测试-java内存溢出问题排查

    千次阅读 2018-10-31 12:06:05
    关于内存溢出 网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。 首先,你windows本机得安装好java,我这里用的是...
  • JAVA内存溢出异常测试

    千次阅读 2017-10-10 22:27:43
    JAVA堆异常溢出: /** * Vm args:-Xms20M -Xms20M -XX:+... * java内存溢出测试,深入理解java虚拟机 p51 * @author Rail * */ public class HeapOutOfMemoryError { static class OutOfMemoryError{
  • 内存溢出怎么定位 1.定位内存溢出究竟是什么原因 2.拿到我们内存溢出的时候打印的dump文件 3.从我们的dump文件中定位到大对象,同时结合线程快照进行分析 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,558
精华内容 69,423
关键字:

java内存溢出

java 订阅