java 崩溃_Java常见内存崩溃异常示例

堆溢出

class OOMTest {

}

/**

* 堆溢出

*/

public static void heapOOMTest() {

ArrayList list = new ArrayList();

while (true) {

list.add(new OOMTest());

}

}

虚拟机栈溢出

private static int stackLength = 1;

/**

* 虚拟机栈溢出

*/

public static void jvmStackOOMTest() {

stackLength++;

jvmStackOOMTest();

}

本地方法栈溢出

/**

* 本地方法栈溢出,win系统不要执行,演示一下容易雪崩

*/

public static void nativeStackOOMTest() {

while (true) {

Thread t = new Thread(new Runnable() {

@Override

public void run() {

dontStop();

}

});

t.start();

}

}

private static void dontStop() {

while (true) {

}

}

运行时常量池溢出

/**

* 运行时常量池溢出 目前只再jdk1.7以前会报错,之后不会溢出

*/

public static void runTimeConstantPoolOOM() {

List list = new ArrayList();

int i = 0;

while (true) {

list.add(String.valueOf(i++).intern());

}

}

使用 cglib 方法去出现内存溢出

/**

* 使用cglib方法去出现内存溢出

*/

public static void javaMethodAreaOOM() {

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();

}

}

static class OOMObject {

}

本机内存溢出

private static final int _1MB = 1024 * 1024;

/**

* 本机内存溢出 注意需要引用 import sun.misc.Unsafe;

* @throws Exception

* @throws IllegalArgumentException

*/

public static void directMemoryOOM() throws IllegalArgumentException, Exception {

Field unsafeFiled = Unsafe.class.getDeclaredFields()[0];

unsafeFiled.setAccessible(true);

Unsafe unsafe = (Unsafe)unsafeFiled.get(null);

while (true) {

unsafe.allocateMemory(_1MB);

}

}

元空间溢出

/**

* 为了快速溢出,设置参数:-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=80m,

*

*/

public static void main(String[] args) {

try {

//准备url

URL url = new File("D:/58workplace/11study/src/main/java/jdk8").toURI().toURL();

URL[] urls = {url};

//获取有关类型加载的JMX接口

ClassLoadingMXBean loadingBean = ManagementFactory.getClassLoadingMXBean();

//用于缓存类加载器

List classLoaders = new ArrayList();

while (true) {

//加载类型并缓存类加载器实例

ClassLoader classLoader = new URLClassLoader(urls);

classLoaders.add(classLoader);

classLoader.loadClass("ClassA");

//显示数量信息(共加载过的类型数目,当前还有效的类型数目,已经被卸载的类型数目)

System.out.println("total: " + loadingBean.getTotalLoadedClassCount());

System.out.println("active: " + loadingBean.getLoadedClassCount());

System.out.println("unloaded: " + loadingBean.getUnloadedClassCount());

}

} catch (Exception e) {

e.printStackTrace();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值