`
ydcworld
  • 浏览: 23560 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

内存溢出

    博客分类:
  • java
阅读更多
1. Java Method Stack 栈溢出实验什么时候会让 Java Method Stack 栈溢出啊?栈的基本特点就是 FILO(First In Last Out),如果 in 的太多而 out 的太少,就好 overflow 了。而 Java Method Stack 的功能就是保存每一次函数调用时的“现场”,即为入栈,函数返回就对应着出栈,所以函数调用的深度越大,栈就变得越大,足够大的时候就会溢出。所以模拟 Java Method Stack 溢出,只要不断递归调用某一函数就可以。

  程序源码-1

  // Author:  Poechant // Blog:    blog.csdn.net/poechant // Email:   zhognchao.ustc#gmail.com (#->@)

  // Args:    -verbose:gc -Xss128K

  package com.sinosuperman.main;

  public class Test {

  private int stackLength = 0;

  public void stackOverflow() { ++stackLength;stackOverflow();}

  public static void main(String[] args) throws Throwable { Test test = new Test();

  try { test.stackOverflow();} catch (Throwable e) { System.out.println("stack length: " + test.stackLength);throw e;}运行结果

  stack length: 1052 Exception in thread "main" java.lang.StackOverflowError at com.sinosuperman.main.Test.stackOverflow(Test.java:8)

  at com.sinosuperman.main.Test.stackOverflow(Test.java:9)

  ……

  2. Java Method Stack 内存溢出实验Heap 内存溢出

  堆是用来存储对象的,当然对象不一定都存在堆里(由于逃逸技术的发展)。那么堆如果溢出了,一定是不能被杀掉的对象太多了。模拟 Heap 内存溢出,只要不断创建对象并保持有引用存在即可。

  程序源码-2

  // Author:  Poechant // Blog:    blog.csdn.net/poechant // Email:   zhongchao.ustc#gmail.com (#->@)

  // Args:    -verbose:gc -Xmx50m -Xms50m

  package com.sinosuperman.main;

  import java.util.ArrayList;import java.util.List;

  public class Test {

  private static class HeapOomObject { }

  public static void main(String[] args) { List<HeapOomObject> list = new ArrayList<HeapOomObject>();while (true) { list.add(new HeapOomObject());}运行结果

  [GC 17024K->14184K(49088K), 0.1645899 secs] [GC 26215K->29421K(49088K), 0.0795283 secs] [GC 35311K(49088K), 0.0095602 secs] [Full GC 43400K->37709K(49088K), 0.1636702 secs] [Full GC 49088K->45160K(49088K), 0.1609499 secs] [GC 45312K(49088K), 0.0265257 secs] [Full GC 49088K->49087K(49088K), 0.1656715 secs] [Full GC 49087K->49087K(49088K), 0.1656147 secs] [Full GC 49087K->49062K(49088K), 0.1976727 secs] [GC 49063K(49088K), 0.0287960 secs] [Full GC 49087K->49087K(49088K), 0.1901410 secs] [Full GC 49087K->49087K(49088K), 0.1673056 secs] [Full GC 49087K->316K(49088K), 0.0426515 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.sinosuperman.main.Test.main(Test.java:14)

  3. Method Area 内存溢出也就是 Non-heap,是用来存储 Object Class Data、常量、静态变量、JIT 编译后的代码等。如果该区域溢出,则说明某种数据创建的实在是太多了。模拟的话,可以不断创建新的 class,直到溢出为止。

  以下代码使用到 cglib-2.2.2.jar 和 asm-all-3.0.jar.

  程序源码-3

  package com.sinosuperman.main;

  import java.lang.reflect.Method;

  import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;

  public class Test { static class MethodAreaOomObject { } public static void main(String[] args) { while(true){ Enhancer enhancer = new Enhancer();enhancer.setSuperclass(MethodAreaOomObject.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable { return proxy.invoke(obj, args);} });enhancer.create();}运行结果

  Exception in thread "main" net.sf.cglib.core.CodeGenerationException:   java.lang.reflect.InvocationTargetException——>null at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)

  at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)

  at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)

  at com.sinosuperman.main.Test.main(Test.java:24)

  Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)

  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

  at java.lang.reflect.Method.invoke(Method.java:597)

  at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)

  at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)

  …… 3 more Caused by: java.lang.OutOfMemoryError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method)

  at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)

  at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

  …… 8 more 4. Runtime Constant Pool in Method Area 内存溢出在运行时产生大量常量就可以实现让 Method Area 溢出的目的。运行是常量可以用 String 类的 intern 方法,不断地产生新的常量。

  程序源码-4

  package com.sinosuperman.main;

  import java.util.ArrayList;import java.util.List;

  public class Test { public static void main(String[] args) { List<String> list = new ArrayList<String>();int i = 0;while (true) { list.add(String.valueOf(i++)。intern());}运行结果

  Exception in thread "main" java.lang.OutOfMemoryError: PermGen space at java.lang.String.intern(Native Method)

  at com.sinosuperman.main.Test.main(Test.java:12)

  结语在实际编码中要尽量避免此类错误。不过大多数程序设计的结构比这里的示例要复杂的多,使得问题被隐藏。但 JVM 的内存溢出问题本质上大都可归结为以上这几种情况。
原文地址:http://java.chinaitlab.com/JavaMedia/876985.html

分享到:
评论

相关推荐

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

    内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...

    内存泄漏与内存溢出

    在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...

    MySQL OOM(内存溢出)的解决思路

    OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...

    JVM内存溢出问题解析

    JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...

    Qt内存溢出检测

    Qt作为一个流行的C++图形用户界面库,提供了丰富的功能,但同时也需要开发者正确地管理内存以避免可能导致程序崩溃或数据损坏的内存溢出问题。本文将深入探讨Qt内存溢出检测,以及如何借助Visual Leak Detector (VLD...

    Python内存泄漏和内存溢出的解决方案

    虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言...

    易语言防止文件内存溢出源码

    在编程领域,内存管理是至关重要的,特别是在处理大文件时,如何有效防止内存溢出是开发者需要关注的核心问题。易语言是一种以中文编程为特色的编程环境,它为初学者提供了友好的界面和易于理解的语法。在这个场景下...

    解决jetty8内存溢出版本

    标题中的"解决jetty8内存溢出版本"意味着我们面对的是一个针对Jetty 8的特殊构建或配置,其目标是优化内存使用,防止或减少内存溢出的发生。在32位和64位操作系统上都能安装为服务,这意味着这个版本考虑到了兼容性...

    phpExcel导出大量数据出现内存溢出错误的解决方法

    然而,在这个过程中,开发者经常面临内存溢出错误的问题。这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现...

    如何避免JDBC引起的内存溢出情况

    ### 如何避免JDBC引起的内存溢出情况 在日常的软件开发过程中,特别是在处理大量数据时,使用Java数据库连接(JDBC)进行数据库操作是非常常见的。然而,在处理大数据集时,如果不注意细节,很容易遇到内存溢出的...

    myeclipse内存溢出问题解决方案

    内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...

    易语言防止文件内存溢出

    在编程领域,内存管理是至关重要的一个环节,尤其是在处理大文件时,防止内存溢出显得尤为重要。易语言作为一款国产的、面向对象的编程语言,虽然语法简洁,但同样需要处理好内存分配与释放的问题。本篇文章将深入...

    maven内存溢出解决放啊

    ### Maven内存溢出解决方案 #### 一、引言 在使用Maven进行项目构建时,尤其是在处理大型项目或执行资源密集型任务(如`mvn site`)时,经常会遇到Java堆空间溢出的问题。这类问题通常是由于Maven运行所需的内存...

    大数据Excel操作不会内存溢出POI

    绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...

    完美解决java读取excel内存溢出问题.rar

    在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...

    处理bitmap内存溢出问题

    在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    ### Eclipse Memory Analyzer (MAT) 分析 Tomcat 内存溢出详解 #### 一、引言 在软件开发过程中,特别是在 Java 应用程序中,内存管理是非常关键的一环。当应用程序遭遇 `OutOfMemoryError` 异常时,通常意味着...

    poi解决读取excel大文件内存溢出的代码

    本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!

Global site tag (gtag.js) - Google Analytics