• 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 查看资源

  • 相关阅读:
    git的使用
    Kohana框架的安装及部署
    C++哈希+哈希改造
    十三、Java Agent
    STM32-Project17-18:NVIC中断应用概述;EXTI外部中断控制实验;
    【Vue基础-数字大屏】地图
    Bellman-Ford算法
    【JDBC实战】水果库存系统 [代码优化]
    轨道交通上的安科瑞精密配电多回路监控装置
    浅析-ES6
  • 原文地址:https://blog.csdn.net/weixin_43704834/article/details/126720122