java8中使用Metaspace就不会出现OOM吗?
来源:互联网 发布:知行的初始密码 编辑:程序博客网 时间:2024/06/05 07:44
前言:在java8中,Metaspace的出现,使我们现在不会再遇到java.lang.OutOfMemoryError: PermGen问题,但是我们要记住,这个新特性并不会使类加载导致的内存泄露就此消失。
(一)Metaspace的简单介绍
(1)内存模型:大部分类元数据都在本地内存分配,用于描述类元数据的“klasses“已经被移除。
(2) 容量:默认情况下只受本地内存限制,但是我们可以限制。
(二)接下来看看Metaspace会不会出现OOM
我们可以通过动态代理来生成大量的代理类信息填充元数据区。代码如下
public interface MetaspaceFacade { void method(String input);}
public class MetaspaceFacadeImpl implements MetaspaceFacade { public void method(String name) { }}
public class MetaspaceFacadeInvocationHandler implements InvocationHandler { private Object classAImpl; public MetaspaceFacadeInvocationHandler(Object impl) { this.classAImpl = impl; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(classAImpl, args); }}
public class ClassMetadataLeakSimulator { private static Map<String, MetaspaceFacade> classLeakingMap = new HashMap<String, MetaspaceFacade>(); private final static int NB_ITERATIONS_DEFAULT = 50000; /** * @param args */ public static void main(String[] args) { System.out.println("Class metadata leak simulator"); int nbIterations = NB_ITERATIONS_DEFAULT; try { for (int i = 0; i < nbIterations; i++) { String fictiousClassloaderJAR = "file:" + i + ".jar"; URL[] fictiousClassloaderURL = new URL[] { new URL(fictiousClassloaderJAR) }; URLClassLoader newClassLoader = new URLClassLoader(fictiousClassloaderURL); MetaspaceFacade t = (MetaspaceFacade) Proxy.newProxyInstance(newClassLoader, new Class<?>[] { MetaspaceFacade.class }, new MetaspaceFacadeInvocationHandler(new MetaspaceFacadeImpl())); classLeakingMap.put(fictiousClassloaderJAR, t); } } catch (Throwable any) { System.out.println("ERROR: " + any); } System.out.println("Done!"); }}
1,首先不进行任何设置(需要保证堆大小),运行得到下面的截图
可以看出,Metaspace进行了动态扩展,本地内存达到了300多M,加载超过5万个类后还没有出现OOM事件。接下来我们限定一下
2,虚拟机参数配置如下:-Xmx2g -Xms2g -Xmn1g -XX:+PrintGCDetails -XX:MaxMetaspaceSize=128m,运行得到下面的截图
可以看出,此时Metaspace被耗尽,将会抛出OOM事件。这里要注意MaxPermSize的区别,MaxMetaspaceSize并不会在jvm启动的时候分配一块这么大的内存出来,而MaxPermSize是会分配一块这么大的内存的。
那么问题来了,如果我们不设置MaxMetaspaceSize,那么我们能用到系统的全部内存吗??
metaspace很可能因为被无止境使用而被OS Kill,所以一般还是设置比较好。
阅读全文
0 0
- java8中使用Metaspace就不会出现OOM吗?
- eclipse中使用java8
- Java8中使用APT
- eclipse中使用java8
- Metaspace
- 这样操作就不会出现cad转换成jpg不清楚
- Android中出现OOM情况的研究
- android中加载图片时出现oom
- JAVA8 JVM的变化: 元空间(Metaspace)
- Java8 Non-Heap 中的metaspace 和compressed class space解释
- JAVA8.0 永久代(PermGen. ) ---> 元空间(Metaspace. )
- JVM的Metaspace,JAVA8以前是Permanent Area
- Android N中使用Java8
- java8中lambda的使用
- With(ReadPast)就不会被阻塞吗?
- Android 加载大图不会OOM
- 13.Java 8中JVM的MetaSpace
- Android开发中 页面加载超大图片时出现OOM
- 【git】:将本地代码提交到github远程仓库的简单命令行
- MAVEN系列之一@基础篇
- 动态内存管理
- Map接口,Set接口
- web.xml
- java8中使用Metaspace就不会出现OOM吗?
- 【Docker】 windows10 docker 使用
- Lesson06_python3之 循环
- 使用Java蓝牙无线通讯技术API概述之一
- 34.数据库设计
- 字符串和数组相互转换
- 深入研究java.lang.Runtime类
- Android 蓝牙通信及自定义消息协议的解析和生成
- char*以及char*p