- 浏览: 23714 次
- 性别:
- 来自: 成都
最新评论
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
程序源码-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
发表评论
-
Linux安装JDK15
2020-12-10 16:53 4551.下载64位JKD 15.0.1.tar.gz 地址:htt ... -
java内存分配分析/栈内存、堆内存
2016-03-23 18:31 475java内存分配分析 本文将由浅入深详细介绍Java内存分配 ... -
Java中equals和==的区别
2016-03-23 10:45 499一、java当中的数据类型和“==”的含义: 基本数据类型 ... -
jvm学习笔记--基本结构
2014-09-04 14:59 570主要来学习jvm的基本结构 知识点1:什么是java ... -
Java 内部类种类及使用解析
2014-07-03 18:24 1085Java中的内部类共分为四种: 静态内部类static ... -
Stack and Heap
2014-06-20 17:54 784Read a good article about Heap ... -
深入Java,初探JVM一
2014-06-19 09:39 460JAVA和JVM运行的原理,Jav ... -
java 值传递和引用传递详 解
2014-06-11 14:21 458最 近 遇到java 值传递和引用传递问题 ,做 了 一 个 ... -
jdk,jre关系
2013-02-18 17:06 631SDK(Software Develop Kit,软件开发工具 ... -
MySQL存储过程
2012-12-03 00:01 553MySQL存储过程 1.1 ... -
JAVA反射机制
2012-11-25 16:11 381看到一偏关于java反射机制的文章觉得不错,分享一下 JAVA ... -
JAVA读取键盘上输入信息
2012-11-13 22:05 748方法一:从控制台接收 ... -
cglib中Enhancer的简单使用
2012-09-13 09:36 1160cglib 是一个强大的, 高效高质的代码生成库. 简单的使 ... -
java中的IO整理
2012-08-30 22:33 718今天看天一篇关于IO的文章,感觉写得很不错,在这里贴出来,分享 ... -
java核心
2012-08-28 12:10 739学习了一段时间的java后,小有感触,结合网上的资料和大家分享 ... -
eclipse常用快捷
2012-08-19 01:18 650一、实用类快捷键 ...
相关推荐
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...
在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...
OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
Qt作为一个流行的C++图形用户界面库,提供了丰富的功能,但同时也需要开发者正确地管理内存以避免可能导致程序崩溃或数据损坏的内存溢出问题。本文将深入探讨Qt内存溢出检测,以及如何借助Visual Leak Detector (VLD...
虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** 内存泄漏通常是由于以下几个原因引起的: 1. **C扩展模块的内存泄漏**:使用C语言...
在编程领域,内存管理是至关重要的,特别是在处理大文件时,如何有效防止内存溢出是开发者需要关注的核心问题。易语言是一种以中文编程为特色的编程环境,它为初学者提供了友好的界面和易于理解的语法。在这个场景下...
标题中的"解决jetty8内存溢出版本"意味着我们面对的是一个针对Jetty 8的特殊构建或配置,其目标是优化内存使用,防止或减少内存溢出的发生。在32位和64位操作系统上都能安装为服务,这意味着这个版本考虑到了兼容性...
然而,在这个过程中,开发者经常面临内存溢出错误的问题。这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现...
### 如何避免JDBC引起的内存溢出情况 在日常的软件开发过程中,特别是在处理大量数据时,使用Java数据库连接(JDBC)进行数据库操作是非常常见的。然而,在处理大数据集时,如果不注意细节,很容易遇到内存溢出的...
内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...
在编程领域,内存管理是至关重要的一个环节,尤其是在处理大文件时,防止内存溢出显得尤为重要。易语言作为一款国产的、面向对象的编程语言,虽然语法简洁,但同样需要处理好内存分配与释放的问题。本篇文章将深入...
### Maven内存溢出解决方案 #### 一、引言 在使用Maven进行项目构建时,尤其是在处理大型项目或执行资源密集型任务(如`mvn site`)时,经常会遇到Java堆空间溢出的问题。这类问题通常是由于Maven运行所需的内存...
Java IBM WebSphere应用服务器在运行过程中可能会遇到各种性能问题,其中最常见的挑战之一是内存溢出。内存溢出是指应用程序消耗的内存超过了系统所能提供的限制,导致程序崩溃或性能急剧下降。在这种情况下,开发者...
绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...
### Apache服务器出现内存溢出的解决方法 #### 知识点概述 本文主要探讨了Apache服务器在运行过程中遇到内存溢出问题的几种常见情况及其解决办法。虽然标题提及的是Apache服务器,但文中实际讨论的是与Apache...
在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...