MMODemo.java
package dingchd; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class MMODemo { StackOverFlowMMO stackmmo; DirectMMO directmmo; HeapMMO heapmmo; ArrayLimitMMO almmo; ThreadLimitMMO threadmmo; PermGenMMO pergemmmo; MMODemo() { stackmmo = new StackOverFlowMMO(); directmmo = new DirectMMO(); heapmmo = new HeapMMO(); almmo = new ArrayLimitMMO(); threadmmo = new ThreadLimitMMO(); pergemmmo = new PermGenMMO(); } public void displayDirect() { directmmo.display(); } public void displayStack() { stackmmo.display(); } public void displayHEAP() { heapmmo.display(); } public void displayArryaLimit() { almmo.display(); } public void displayThreadLimit() throws InterruptedException { threadmmo.display(); } public void displayPermGen() throws IllegalArgumentException, Exception, Throwable { pergemmmo.display(); } class DirectMMO { public void display() { List<ByteBuffer> list = new ArrayList(); int size = 1000; int count = 0; while (true) { ByteBuffer buf = ByteBuffer.allocateDirect(size); for (int i = 0; i < size; i++) { int j = 1; buf.put((byte) j); } list.add(buf); count++; System.out.println("buffer direct allocate is " + count * size); } } } class StackOverFlowMMO { int lvl; StackOverFlowMMO() { lvl = 0; } public void display() { lvl = 0; func(); } public void func() { ++lvl; System.out.println("lvl " + lvl); func(); } } class HeapMMO { public void display() { Integer a[] = new Integer[100000000]; } } class ArrayLimitMMO { public void display() { System.out.println("Integer.MAX_VALUE is " + Integer.MAX_VALUE + "\r\n"); int[] pos = new int[Integer.MAX_VALUE - 1]; } } class PermGenMMO { Helloworld loader = new Helloworld(); // List<Object> list = new ArrayList(); public void display() throws IllegalArgumentException, Exception, Throwable { int index = 0; int count = 0; while (true) { try { loader.createClass(index); loader.loadClass(index); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // System.out.println(System.getProperty(null)); count++; index++; if (count > 10) break; } } // 动态创建一个类 class Helloworld extends ClassLoader implements Opcodes { public void createClass(int index) throws IOException, IllegalAccessException, IllegalArgumentException, Exception, Throwable { String name = "Example" + index; // System.out.println(name); ClassWriter cw = new ClassWriter(0); MethodVisitor mv; cw.visit(V1_1, ACC_PUBLIC, name, null, "java/lang/Object", null); for (int i = 0; i < 10000; i++) { String fun = "fun" + i; mv = cw.visitMethod(ACC_PUBLIC, fun, "()V", null, null); mv.visitCode(); mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("hello"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mv.visitInsn(RETURN); mv.visitMaxs(2, 1); mv.visitEnd(); } // gets the bytecode of the Example class, and loads it // dynamically byte[] code = cw.toByteArray(); File directory = new File(""); FileOutputStream fos = new FileOutputStream(name + ".class"); fos.write(code); fos.close(); // Class<?> exampleClass = loader.defineClass("Example"+index, // code, 0, code.length); // uses the dynamically generated class to print 'Helloworld' // exampleClass.getMethods()[0].invoke(null, new Object[] { null // }); } public void loadClass(int index) throws ClassNotFoundException, InstantiationException, IllegalAccessException { String name = "Example" + index; Class a = Class.forName(name, true, this.getClass() .getClassLoader()); // System.out.println("load "+name+".class"); } } } class ThreadLimitMMO { List<Thread> list = new ArrayList(); int count = 0; Long cur; Object lock = new Object(); public void display() throws InterruptedException { System.out.println("-Xss = 128m"); while (true) { Long cur = new Long(System.currentTimeMillis()); Thread t = new Thread(cur.toString()) { @Override public void run() { int index = 0; synchronized (lock) { index = count; count++; } System.out.println(Thread.currentThread().getName() + "create,index" + index); try { Thread.sleep(60000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; t.start(); list.add(t); Thread.sleep(100); } } } }
MMOTest.java
package dingchd; public class MMOTest { static MMODemo mmodemo = new MMODemo(); static DeadLockDemo tdemo = new DeadLockDemo(); final static int DIRECTMMO = 0; final static int STACKMMO = 1; final static int HEAPMMO = 2; final static int PGMMO = 3; final static int THREADMMO = 4; final static int ALMMO = 5; final static int DEADLOCK = 6; public static void main(String args[]) throws Throwable { int option = -1; if (args.length == 0) { System.out.println("dingchd MMO TEST \r\n"); System.out .println("0" + "\t demo java.lang.OutOfMemoryError:Direct buffer memory"); System.out.println("1" + "\t demo java.lang.StackOverflowError"); System.out.println("2" + "\t demo java.lang.OutOfMemoryError: Java heap space"); System.out.println("3" + "\t demo java.lang.OutOfMemoryError: PermGen space"); System.out .println("4" + "\t demo java.lang.OutOfMemoryError: unable to create new native thread"); System.out .println("5" + "\t demo java.lang.OutOfMemoryError: Requested array size exceeds VM limit"); System.out.println("6" + "\t demo Thread DeadLock"); return; } try { option = Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("please input valid num"); } switch (option) { case DIRECTMMO: { mmodemo.displayDirect(); break; } case STACKMMO: { mmodemo.displayStack(); break; } case HEAPMMO: { mmodemo.displayHEAP(); break; } case ALMMO: { mmodemo.displayArryaLimit(); break; } case THREADMMO: { mmodemo.displayThreadLimit(); break; } case PGMMO: { mmodemo.displayPermGen(); break; } case DEADLOCK: { tdemo.display(); break; } default: return; } } }
测试:
直接内存溢出,比如GZip**Stream 没有close
堆内存溢出
永久代内存溢出,持久不断加载类
不能创建新的线程
请求的数组长度太大
死锁
栈内存溢出,死循环递归调用
相关推荐
OOM 9种常见原因及解决方案 以下是OOM 9种常见原因及解决方案的知识点: 1. Java Heap Space 错误 * 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx...
当应用程序出现Out of Memory (OOM)错误时,通常意味着系统无法分配足够的内存来执行任务,这时就需要借助专业的分析工具来查找问题的根源。MemoryAnalyzer(MAT)是IBM开发的一款强大的JVM堆内存分析工具,它能够...
本篇文章主要探讨Spark面对OOM问题的解决方法及优化策略。 首先,我们需要了解Spark的内存模型。Spark的Executor内存分为三个部分:Execution内存、Storage内存和其他内存。Execution内存主要用于执行任务,如join...
通过对`JVMTest`项目的实践,我们可以更深入地理解JVM内存管理,学会如何设置合适的JVM参数,避免`OOM`,提升应用的稳定性和性能。同时,这也是一种模拟真实环境的训练方式,对于开发者来说,具有很高的学习价值。
9. **使用矢量图**:对于API 21及更高版本的设备,可以使用SVG或VectorDrawable作为资源,它们会根据屏幕密度动态调整大小,避免了不同密度下的内存问题。 10. **监控内存**:通过`ActivityManager....
本Demo包含2个.JAVA文件,一个图片OOM处理工具类,一个MainACtivity类,通过一个Button打开手机所以相册,然后选择图片经过OOM处理,将处理后的图片显示到ImageView上。 【简单易懂,含详细注释(开发版本:安卓4.4.2...
在Android开发中,Bitmap对象是用于处理图像的重要类,但不当使用可能会引发“Out Of Memory”(OOM)错误。Bitmap OOM通常是由于加载过大或过多...通过不断实践和优化,可以确保应用程序在处理图片时更加稳定和高效。
本文将深入探讨Android中OOM错误的原因及相关的内存管理机制。 #### 一、Android内存管理机制概述 在Android中,每个应用都有自己的独立进程,并且每个进程的内存都是相互隔离的。Android操作系统为每个进程分配了...
然而,由于Android系统对内存有限制,当在GridView中加载大量图片时,很容易引发“OutOfMemoryError”(简称OOM),这会严重影响应用的性能和用户体验。为了解决这个问题,开发者通常会采用内存缓存技术,如LruCache...
在Android开发中,"图片OOM"是一个常见的问题,全称为"Out Of Memory",即内存溢出异常。当应用程序在运行过程中,分配给它的内存不足以处理当前的操作时,就会发生这种异常。尤其在处理大量或者高分辨率的图片时,...
OOM Killer,全称为Out of Memory Killer,是Linux内核中的一种机制,用于处理系统内存不足的情况。当系统内存耗尽时,为了避免整个系统的崩溃,OOM Killer会选择并终止一些进程来释放内存,从而确保系统的稳定运行...
在具体项目实践中,可以结合实际情况,灵活运用这些策略,实现高效且内存友好的GIF加载。 在测试过程中,开发者应使用Android Studio的内存分析工具(Memory Profiler)进行内存泄漏检测和性能优化,确保代码在不同...
在安卓系统中,"OOM"(Out of Memory)是指应用程序因为消耗了过多的内存而被系统强制终止,这是安卓开发者需要特别关注的问题。本篇将深入探讨安卓内存OOM的分析和解决策略,以及如何通过内核剖析来预防和处理此类...
OOM全称”Out Of Memory”,即内存溢出。 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题。在操作系统上运行各种软件时,软件所需申请的内存远远超出了物理内存所承受的大小,就叫内存溢出。 内存溢出...
在Android开发中,Bitmap对象是用于处理图像的重要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是当加载大图或大量图片时,容易超出可用内存限制。"处理...
问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...
java jvm 中关于内存溢出分享,举例说明各种情况下可能会出现的oom事故
在Android开发中,内存管理是至关重要的,尤其是对于那些需要展示大量数据的界面,比如瀑布流布局...结合现代的Android开发库和最佳实践,我们可以有效地管理内存,避免出现OOM异常,为用户提供流畅的用户体验。
基本上解决了OOM问题 如果 方便可以直接引用BitmapManager类到 项目中使用 解决blog 地址http://www.cnblogs.com/liongname/articles/2345087.html
在Android开发中,由于系统对内存管理的特性,开发者时常会遇到Out Of Memory(OOM)问题,尤其是在处理大量图片资源时,比如在ListView或者RecyclerView中加载动态图GIF。本篇将详细介绍如何解决Android中加载GIF...