美文网首页
2020-05-23

2020-05-23

作者: 程序男保姆 | 来源:发表于2020-05-23 18:57 被阅读0次

    jdk1.7之前,永久带是方法区的实现,永久带不再堆中。方法区内存溢出,会报永久带内存溢出,即:OutOfMemoryError: PermGen space。
    jdk1.8之后,永久带被移除,元空间用来实现方法区。元空间被放到了java堆中,和堆共享内存大小。逻辑上不互联,物理上互联。方法区主要包含常量池,静态变量,类的信息。一直向常量池添加元素报元空间内存溢出即:OutOfMemoryError: Metaspace。

    OutOfMemoryError

      堆内存不够时抛出OutOfMemoryError异常
    
    • 测试代码
    
    
    /***
     * 常量池
     */
    public class ChangliangchiOOm {
    
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
    
            try {
                for (long i = 0; true; i++) {
                    list.add(String.valueOf(i).intern());
                }
            }catch (Exception throwable){
                System.out.println(list.size());
                System.out.println(throwable);
            }
        }
    }
    
    
    
    • 结果
    
    设置不同的jvm参数,得到不同的结果
    -Xms   -X memory size 设置堆内存大小
    -Xmx   -X memory max 设置堆最大内存大小
    
    -Dfile.encoding=UTF-8 -Xms5M -Xmx5M
    360145
    java.lang.OutOfMemoryError: Java heap space
    
    -Dfile.encoding=UTF-8 -Xms10M -Xmx10M
    810325
    java.lang.OutOfMemoryError: Java heap space
    
    -Dfile.encoding=UTF-8 -Xms20M -Xmx20M
    1823230
    java.lang.OutOfMemoryError: Java heap space
    
    由此可见设置堆内存依次增大,list容量也依次增大
    
    • 解决方法

    内存大小: 增加堆内存大小

    相关文章

      网友评论

          本文标题:2020-05-23

          本文链接:https://www.haomeiwen.com/subject/aeplahtx.html