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

模拟OOM及DecdLock实践

阅读更多

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


 
 堆内存溢出

 

永久代内存溢出,持久不断加载类

 

不能创建新的线程


 

请求的数组长度太大

 

死锁

 

栈内存溢出,死循环递归调用

 

  • 大小: 33 KB
  • 大小: 28.6 KB
  • 大小: 22.3 KB
  • 大小: 98.8 KB
  • 大小: 49.6 KB
  • 大小: 23.4 KB
  • 大小: 10.8 KB
  • 大小: 53.4 KB
分享到:
评论

相关推荐

    教你分析9种OOM常见原因及解决方案.docx

    OOM 9种常见原因及解决方案 以下是OOM 9种常见原因及解决方案的知识点: 1. Java Heap Space 错误 * 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx...

    OOM分析工具-MemoryAnalyzer.zip

    当应用程序出现Out of Memory (OOM)错误时,通常意味着系统无法分配足够的内存来执行任务,这时就需要借助专业的分析工具来查找问题的根源。MemoryAnalyzer(MAT)是IBM开发的一款强大的JVM堆内存分析工具,它能够...

    Spark面对OOM问题的解决方法及优化总结1

    本篇文章主要探讨Spark面对OOM问题的解决方法及优化策略。 首先,我们需要了解Spark的内存模型。Spark的Executor内存分为三个部分:Execution内存、Storage内存和其他内存。Execution内存主要用于执行任务,如join...

    用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

    通过对`JVMTest`项目的实践,我们可以更深入地理解JVM内存管理,学会如何设置合适的JVM参数,避免`OOM`,提升应用的稳定性和性能。同时,这也是一种模拟真实环境的训练方式,对于开发者来说,具有很高的学习价值。

    加载图片oom的解决

    9. **使用矢量图**:对于API 21及更高版本的设备,可以使用SVG或VectorDrawable作为资源,它们会根据屏幕密度动态调整大小,避免了不同密度下的内存问题。 10. **监控内存**:通过`ActivityManager....

    图片太大OOM处理及打开手机图片

    本Demo包含2个.JAVA文件,一个图片OOM处理工具类,一个MainACtivity类,通过一个Button打开手机所以相册,然后选择图片经过OOM处理,将处理后的图片显示到ImageView上。 【简单易懂,含详细注释(开发版本:安卓4.4.2...

    bitmap OOM的解决方案

    在Android开发中,Bitmap对象是用于处理图像的重要类,但不当使用可能会引发“Out Of Memory”(OOM)错误。Bitmap OOM通常是由于加载过大或过多...通过不断实践和优化,可以确保应用程序在处理图片时更加稳定和高效。

    Android OOM错误的原因

    本文将深入探讨Android中OOM错误的原因及相关的内存管理机制。 #### 一、Android内存管理机制概述 在Android中,每个应用都有自己的独立进程,并且每个进程的内存都是相互隔离的。Android操作系统为每个进程分配了...

    GridView解决OOM

    然而,由于Android系统对内存有限制,当在GridView中加载大量图片时,很容易引发“OutOfMemoryError”(简称OOM),这会严重影响应用的性能和用户体验。为了解决这个问题,开发者通常会采用内存缓存技术,如LruCache...

    图片oom,解决方法

    在Android开发中,"图片OOM"是一个常见的问题,全称为"Out Of Memory",即内存溢出异常。当应用程序在运行过程中,分配给它的内存不足以处理当前的操作时,就会发生这种异常。尤其在处理大量或者高分辨率的图片时,...

    有关OOM KILLER的一些理解

    OOM Killer,全称为Out of Memory Killer,是Linux内核中的一种机制,用于处理系统内存不足的情况。当系统内存耗尽时,为了避免整个系统的崩溃,OOM Killer会选择并终止一些进程来释放内存,从而确保系统的稳定运行...

    gif加载动画不oom

    在具体项目实践中,可以结合实际情况,灵活运用这些策略,实现高效且内存友好的GIF加载。 在测试过程中,开发者应使用Android Studio的内存分析工具(Memory Profiler)进行内存泄漏检测和性能优化,确保代码在不同...

    安卓内存OOM分析

    在安卓系统中,"OOM"(Out of Memory)是指应用程序因为消耗了过多的内存而被系统强制终止,这是安卓开发者需要特别关注的问题。本篇将深入探讨安卓内存OOM的分析和解决策略,以及如何通过内核剖析来预防和处理此类...

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

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

    处理android bitmap oom 2.0版本

    在Android开发中,Bitmap对象是用于处理图像的重要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是当加载大图或大量图片时,容易超出可用内存限制。"处理...

    Groovy大量计算导致oom的解决办法

    问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...

    oom技术分享,各种情况下可能会出现的oom事故

    java jvm 中关于内存溢出分享,举例说明各种情况下可能会出现的oom事故

    android 永远不会oom的瀑布流

    在Android开发中,内存管理是至关重要的,尤其是对于那些需要展示大量数据的界面,比如瀑布流布局...结合现代的Android开发库和最佳实践,我们可以有效地管理内存,避免出现OOM异常,为用户提供流畅的用户体验。

    android 图片内存溢出(OOM)解决

    基本上解决了OOM问题 如果 方便可以直接引用BitmapManager类到 项目中使用 解决blog 地址http://www.cnblogs.com/liongname/articles/2345087.html

    安卓gif加载解决oom

    在Android开发中,由于系统对内存管理的特性,开发者时常会遇到Out Of Memory(OOM)问题,尤其是在处理大量图片资源时,比如在ListView或者RecyclerView中加载动态图GIF。本篇将详细介绍如何解决Android中加载GIF...

Global site tag (gtag.js) - Google Analytics