`
85977328
  • 浏览: 1899627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM内存分析系列(二)内存溢出的类型分析

 
阅读更多
启动参数
-server -verbose:gc -Xms10m -Xmx10m -Xss128k -Xloggc:C:/tmp/gc.log -XX:PermSize=5m -XX:MaxPermSize=5m -XX:MaxDirectMemorySize=10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/tmp

Java堆溢出
              List<Server> list = new ArrayList<Server>();
              while (true) {
                  list.add(new Server());
              }

java.lang.OutOfMemoryError: Java heap space
Dumping heap to C:/tmp\java_pid7032.hprof ...
Heap dump file created [17593217 bytes in 0.173 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.chinaso.phl.Server.main(Server.java:29)



虚拟机栈和本地方法栈溢出
    private int stackLength = 1;

    public void stackLeak() {
        stackLength++;
        stackLeak();
    }
    public static void main(String[] args) throws Throwable {
                Server s = new Server();
                try {
                    s.stackLeak();
                } catch (Throwable t) {
                    System.out.println("stack length:" + s.stackLength);
                    throw t;
                }
    }

stack length:1007
Exception in thread "main" java.lang.StackOverflowError
at com.chinaso.phl.Server.stackLeak(Server.java:13)


运行时常量池溢出
                List<String> list = new ArrayList<String>();
                int i = 0;
                while (true) {
                  list.add(String.valueOf(i++).intern());
                }

java.lang.OutOfMemoryError: PermGen space
Dumping heap to C:/tmp\java_pid7448.hprof ...
Heap dump file created [2591479 bytes in 0.050 secs]
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at com.chinaso.phl.Server.main(Server.java:45)

注意:如果写成下面的形式,就是堆溢出了。只有String.intern()方法,是把字符串内容放入常量池并返回。
                List<String> list = new ArrayList<String>();
                int i = 0;
                while (true) {
                  list.add(new String(String.valueOf(i++)));
                }

java.lang.OutOfMemoryError: Java heap space
Dumping heap to C:/tmp\java_pid8228.hprof ...
Heap dump file created [11828134 bytes in 0.151 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.chinaso.phl.Server.main(Server.java:46)




方法区溢出
                while (true) {
                    Enhancer enhancer = new Enhancer();
                    enhancer.setSuperclass(OOMObject.class);
                    enhancer.setUseCache(false);
                    enhancer.setCallback(new MethodInterceptor() {
                        @Override
                        public Object intercept(Object obj,
                                                Method method,
                                                Object[] args,
                                                MethodProxy proxy) throws Throwable {
                            return proxy.invokeSuper(obj, args);
                        }
                    });
                    enhancer.create();
                }

java.lang.OutOfMemoryError: PermGen space
Dumping heap to C:/tmp\java_pid6624.hprof ...
Heap dump file created [1357998 bytes in 0.047 secs]
Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at net.sf.cglib.core.EmitUtils.member_switch_helper(EmitUtils.java:690)
at net.sf.cglib.core.EmitUtils.constructor_switch(EmitUtils.java:681)
at net.sf.cglib.proxy.Enhancer.emitNewInstanceMultiarg(Enhancer.java:849)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:508)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at com.chinaso.phl.Server.main(Server.java:66)


本机直接内存溢出
        Field unsafeField = sun.misc.Unsafe.class.getDeclaredFields()[0];
        unsafeField.setAccessible(true);
        sun.misc.Unsafe unsafe = (sun.misc.Unsafe) unsafeField.get(null);
        while (true) {
            unsafe.allocateMemory(1024 * 1024);
        }

Exception in thread "main" java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at com.chinaso.phl.Server.main(Server.java:70)


附录
本文只是模拟各种内存溢出的情况,文章追求精简直接,本文不适合初学者,需要有一定的基础,对JVM内存模型有一定的了解。




作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:6301655@163.com

转载请注明出处
分享到:
评论

相关推荐

    JVM内存溢出问题解析

    JVM 内存溢出类型有两种:java.lang.OutOfMemoryError: PermGen space 和 java.lang.OutOfMemoryError: Java heap space。PermGen space 是非堆内存,用于存放类的信息,GC 不会释放该空间。如果 web 应用使用了大量...

    jvm 内存分析文档

    理解JVM内存结构和内存分配机制对于避免内存溢出(OutOfMemoryError)、提升程序性能、减少垃圾回收开销至关重要。开发者应关注内存配置、对象生命周期管理以及适当的垃圾回收策略,以优化应用程序的性能和稳定性。

    jvm内存分析工具mat安装包

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的JVM内存分析工具,尤其适用于诊断Java应用程序的内存泄漏问题。在Java开发过程中,内存溢出(Out Of Memory)问题常常会导致程序异常终止,而MAT就是解决这类...

    jvm内存溢出

    了解JVM内存结构是理解内存溢出的关键。 #### 二、JVM运行时数据区域 - **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每条线程拥有独立的程序计数器,因此它属于线程私有区域...

    JVM原理及内存溢出经典案列分析.ppt

    简单的判断JVM内存溢出的方法

    ha456.jar(IBMHeapAnalyzer)JVM内存分析工具

    【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...

    JVM内存分析工具.7z

    当遇到内存溢出问题时,ha456能够分析堆dump文件,识别出导致内存消耗过大的对象和数据结构。通过分析对象的生命周期和引用关系,开发者可以追踪到导致内存无法释放的原因,进而优化代码,避免内存浪费。 最后,jca...

    关于JVM内存溢出的原因分析及解决方案探讨.docx

    本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决方案。 一、内存溢出的定义 内存溢出是指...

    JVM内存模型

    JVM内存模型详解 JVM内存模型是Java虚拟机(JVM)中的一种内存管理机制,它将内存区分为永久区内存(Permanent ...通过了解JVM内存模型和对JVM的优化,可以避免内存溢出异常的发生,提高Java应用程序的性能和可靠性。

    Jvm堆栈dump文件分析

    当JVM遇到问题,如内存溢出或长时间的垃圾回收,它可能会生成堆栈转储(dump)文件,这些文件包含了JVM在特定时刻的详细状态,包括对象、类加载器、线程、堆和栈信息。"Jvm堆栈dump文件分析"是指通过特定工具对这些...

    某应用内存溢出(暨jvm)分析分享

    标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...

    JVM实战-对象访问与内存溢出异常解析

    在Java虚拟机(JVM)中,不同的内存区域负责不同的功能,并且各自可能会出现特定类型的内存溢出异常。通过本实验,旨在深入理解JVM内存管理机制以及各种内存区域的特点,并通过具体的编程实践来触发并分析这些异常,...

    java获得jvm内存大小

    了解并监控JVM的内存使用情况,对于预防和解决内存溢出错误至关重要。通过动态地调整`-Xms`和`-Xmx`参数,可以在运行时根据实际需求优化内存分配,从而提高程序的性能和稳定性。此外,定期检查和分析`heapSize`、`...

    内存溢出配置,内存溢出配置

    给定的部分内容中提到了一些JVM的启动参数,这些参数直接关联到内存溢出配置,下面我们来逐一解析: - **-Xms1024m**:设置JVM初始分配的堆内存大小为1024MB。这意味着JVM启动时,会立即申请1024MB的物理内存。 - *...

    JVM内存配置优化

    #### 二、常见的内存溢出异常 在实际开发过程中,可能会遇到以下几种内存溢出异常: 1. **`java.lang.OutOfMemoryError: Java heap space`**:这表示堆内存已满。通常,这可能是由于项目中引用了大量的jar包或其他...

    JVM内存溢出

    【JVM内存溢出】指的是Java虚拟机在运行过程中,由于内存分配不当或者内存使用过度导致内存无法正常管理,从而抛出错误的情况。这通常会导致应用程序崩溃或性能急剧下降。在Tomcat这样的Java应用服务器中,内存溢出...

    java 内存溢出分析工具 HeapAnalyzer

    HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍HeapAnalyzer的使用、功能以及如何通过它来排查和解决Java OOM问题。 一、HeapAnalyzer简介 Heap...

    java中jvm内存分配相关资料总结整理

    4. **内存溢出问题** - **栈溢出**:如果栈帧过大或者线程太多,可能导致栈空间不足,出现StackOverflowError。 - **堆溢出**:如果创建太多对象或对象占用内存过大,堆内存可能会耗尽,抛出OutOfMemoryError。 5...

    深入理解JVM内存区域与内存溢出异常

    深入理解JVM内存区域与内存溢出异常

Global site tag (gtag.js) - Google Analytics