• java内存溢出OutOfMemory


    永久代内存溢出OutOfMemoryError:PermGen space

    JDK8之前的HotSpot JVM,存放着这些永久的的群与叫做“永久代(permanent generation)”。永久代的垃圾收集是和老年代(old generation)捆绑在一起,因为无论哪个内存满了,都会触发永久代和老年代的垃圾收集。当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误:java.lang.OutOfMemoryError:PermGen

    JDK8的jvm不再有PermGen。但类的元数据信息(metadata)还在,只不过不再是存储在连续的非堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。

    1. 程序中使用了大象的jar或者class,使java虚拟机装载类的空间不够,主要是在jdk8之前遇到,jdk8后,使用本地内存,一般不存在这个问题。
    2. jdk6及之前,字符串也是放在perm Gen区中,可以运行代码验证:
    public static void main(String[] args){
    	List<String> list = new ArrayList<>();
    	while(true){
    		list.add(String.valueOf(System.currentTimeMillis()).intern());
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    堆内存溢出OutOfMemoryError:java heap space

    1. jdk7,字符串常量池被移到了堆中。过多的字符串就会报:java.lang.OutOfMemoryError: Java heap space
    2. jdk8,字符串常量池放到云空间,运行如下代码,也会报异常信息:java.lang.OutOfMemoryError: Java heap space

    元空间内存溢出OutOfMemoryError:Metadata space

    java8de Metaspace容量默认情况下,Metaspace类元数据只受可用的本地内存限制(容量取决于32位或者64位操作系统的可用虚拟内存大小)。
    新添加参数:-XX:MaxMetaspaceSize用于限制本地内存分配给类元数据的大小。如果没有指定这个参数,元空间会在运行时根据需要动态调整。
    一般不会遇到这个情况,很少会主动去限制这个参数的大小。

    栈溢出StackOverflowError

    java方法运行时,会创建栈帧,用户存储局部变量、操作数栈、动态链接。方法被调用到执行完成的过程,就是对应于栈帧在JVM从入栈的过程。当线程请求的栈深度大于虚拟机允许的最大深度就会出现StackOverflowError。
    设置参数:-Xss128K

    本地线程数耗尽OutOfMemoryError:unable to create new native thread

    1. 服务器剩余内存不足(非jvm内存),不能创建新的额线程
    2. 超过系统用户醉倒进程限制

    ulimeit -a 查看资源

  • 相关阅读:
    【Mediator模式】C++设计模式——中介者模式
    2023江苏师范大学计算机考研信息汇总
    数据库索引:综合详细指南
    【鸿蒙软件开发】ArkTS常用组件之Button
    IntelliJ IDEA 2022创建Maven项目
    浮点数运算以及溢出问题
    【八大经典排序算法】选择排序
    前端移动web高级详细解析二
    Prompt Playground: 一个简易的提示词调试工具
    月是故乡明,每逢佳节倍思亲,近乡情更怯
  • 原文地址:https://blog.csdn.net/weixin_43704834/article/details/126720122