[转帖]JVM中OOM常见几种类型

jvm,oom,常见,几种,类型 · 浏览次数 : 0

小编点评

**Java中的OOM java.lang.StackOverflowError** **问题描述:** Java 应用程序运行过程中出现 `StackOverflowError` 错误,其原因是由于在 GC 循环中,分配和回收内存时间过长,导致内存不足。 **解决方案:** 1. **调整 `-Xmx` 和 `-Xms` 参数:** - `-Xmx10m` 设置最大堆内存为 10 MB。 - `-Xms10m` 设置初始堆内存为 10 MB。 2. **使用 DirectBuffer 分配内存:** - DirectBuffer 可以分配 OS 本地内存,避免 Java 堆中来回复制数据。 3. **减少线程创建数量:** - 降低 `-Xmx` 和 `-Xms` 参数以创建的线程数量。 4. **优化代码:** - 查找并优化循环中内存分配和回收的代码。 5. **启用 Metaspace:** - 在高并发请求服务器中,考虑启用 Metaspace,以缓存方法和静态变量。 **其他提示:** - 设置 `-XX:+PrintGCDetails` 参数可以生成详细的 GC 跟踪信息,帮助定位问题。 - 设置 `-XX:MaxDirectMemorySize` 参数可以指定 DirectBuffer 的最大大小。

正文

https://www.cnblogs.com/shemlo/p/11665917.html

 

Java中的OOM

  • java.lang.StackOverflowError
  • java.lang.OutMemoryError:Java heap space
  • java.lang.OutMemoryError:GC overhead limit exceeded:Gc回收时间过长会发生outofmemoryerror,过长的定义是,如果超过98%的时间来做GC,并且回收了不到2%的堆内存,连续多次回收不到2%的情况会跑出,负责形成恶性循环,gc清理的内存再次被填满,迫使gc再次执行。
    复制代码
        /*
        -Xmx10m -Xms10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
         */
        public static void main(String[] args){
    
            int i = 0;
            List<String> list = new ArrayList<>();
    
            try{
                while (true){
                    list.add(String.valueOf(new Random().nextInt(1111111)).intern());
                }
            }catch (Throwable e){
                e.printStackTrace();
            }
        }
    复制代码
  • java.lang.OutMemoryError:Direct buffer memory:写NIO程序使用ByteBuffer来读取或者写入数据,这是基于通道(channel)和缓冲区(buffer)的IO方式,可以使用Native函数库直接分配堆内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作,这样在一些场景中能够提高性能,避免了Java堆和native堆中来回复制数据。
    • ByteBuffer.allocate(capability)第一种方式分配JVM内存,属于GC管辖范围,需要拷贝所以速度相对较慢
    • ByteBuffer.allocateDirect(capability)第二种方式分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝,故而速度较快
      复制代码
          /*
          -Xmx10m -Xms10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
           */
          static void directMemory(){
      
              System.out.println("配置的MaxDirectMemory:" + sun.misc.VM.maxDirectMemory()/ (double)1024 / 1024 + "MB");
      
              ByteBuffer.allocateDirect(6 * 1024 * 1024);
          }
      复制代码
  • java.lang.OutMemoryError:unable to create new native thread:在高并发请求服务器的时候,一个应用进程创建太多线程,超过系统的承载能力。你的服务器不允许应用程序创建这么多线程,Linux系统默认一个进程可以创建最多1024个线程(解决办法:减少线程创建或者修改默认服务器配置,扩大默认限制)。
  • java.lang.OutMemoryError:Metaspace:java8metaspace取代永久代,使用本地内存进行存储。Metaspace是方法与在HotSpot中的实现,即在java8中,classe metadata被存储在Metaspace的native memory(永久代/metaspace:虚拟机加载的类型学,常量池,静态变量,即时编译后的代码)

与[转帖]JVM中OOM常见几种类型相似的内容:

[转帖]JVM中OOM常见几种类型

https://www.cnblogs.com/shemlo/p/11665917.html Java中的OOM java.lang.StackOverflowError java.lang.OutMemoryError:Java heap space java.lang.OutMemoryErro

[转帖]使用MAT命令行工具生成堆dump分析文件

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html 写作目标 Java程序运行过程中,难免会出现 OOM,往往是在 JVM 启动参数中添加出现 OOM 时输出堆 dump(又名:堆转储、堆

[转帖]JVM 中你不可不知的参数

https://zhuanlan.zhihu.com/p/91757020?utm_id=0 有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注。有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还是算了

[转帖]JVM 系列 - 内存区域

一、对象在JVM中的表示: OOP-Klass模型 https://www.jianshu.com/p/424a920771a3 写的很赞。 注意:OOP-Klass是hotspot的JVM实现原理,其他JVM的实现可能不一样。、 OOP表示java实例,Klass表示class。 Klass: 包

[转帖]JVM 运行数据区深度解析

https://my.oschina.net/jiagoushi/blog/5597878 运行数据区 字节码只是一个二进制文件存放在那里。要想在 jvm 里跑起来,先得有个运行的内存环境。 也就是我们所说的 jvm 运行时数据区。 1)运行时数据区的位置 运行时数据区是 jvm 中最为重要的部分,

[转帖]JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed)

https://www.jianshu.com/p/871d6bb3a32d 背景 ​ 在服务器性能优化内存这一项时,有一些现象很诡异。如top显示的RES很大,但是实际jvm堆内存占用很小,同时使用nmt发现committed更大。所以决定写这篇wiki大概介绍一下 JVM中如何计算一个对象的实际

【转帖】浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1

https://zhuanlan.zhihu.com/p/481256418 在讲述垃圾收集器之前,我们得先知道JVM中常见的垃圾收集算法有什么,具体请参考我的这篇博文。如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。下面就来详细概述下Serial、ParNew、Paralle

[转帖]JVM 问题诊断快速入门

https://zhuanlan.zhihu.com/p/110197145 JVM 全称为 Java Virtual Machine,翻译为中文 "Java 虚拟机"。本文中的JVM主要指 Oracle 公司的 HotSpot VM, 版本是 Java8(JDK8、JDK1.8 是同样的版本)。如

[转帖]【JVM】GC算法与垃圾收集器

引入 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,可以有效的防止内存泄露,有效的使用空闲的内存; 内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般

[转帖]JVM系列之:深入学习方法内联

在前面多篇文章中多次提到方法内联,作为编译器最重要的优化技术,该技术不仅可以消除调用本身带来的性能开销,还能够触发更多的优化。本文将带领大家对该技术一探究竟。 方法内联 方法内联指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。 以 getter/s