【JVM】聊聊JVM生产环境常见的OOM问题

对于JVM来说,因为划分有固定的区域来执行字节码文件,无外乎,出问题的,也就是按照对应分分区会有常见的OOM问题。

对于栈来说,栈的主要作用就是用于方法的执行,方法调用入栈、方法调出出栈。但是如果我们写一个递归的程序,如果层级太深,那么就会导致出现栈深度超过系统限制。

StackOverflowError

栈深度一般默认是512K。所以在实际的生产环境中,使用递归要慎重。

public static void main(String[] args) {f();}private static void f () {f();}
Exception in thread "main" java.lang.StackOverflowErrorat oom.JavaStackOverFlowerErrorDemo.f(JavaStackOverFlowerErrorDemo.java:14)

堆空间主要存储的是对象,如果创建对象超过了所分配对象的空间。那么就会出现java heap space

Java. heap space

// -Xms10m -Xmx10m
public class JavaHeapSpaceDemo {public static void main(String[] args) {// 创建对象 12MB对象byte [] bytes = new byte[12 * 1024 * 1024];}}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat oom.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:13)

# GC overhead limit exceeded

Gc执行有一定的限制,如果超过了98%的时间用来做GC,并且回收了不到2%的堆内存,说白了就是一定的GC时间,回收内存过小,就会出现。
如果不抛出这个异常,那么堆空间越来越小,CPU使用率100%,但是GC没有效果。

在这里插入图片描述

 /**  JVM参数配置: -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m**/
public class GcOverheadLimitDemo {public static void main(String[] args) {int i = 0;List<String> list = new ArrayList<>();while (true) {list.add(String.valueOf(++i).intern());}}
}
[Full GC (Allocation Failure) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7164K->7164K(7168K)] 9212K->9212K(9728K), [Metaspace: 3263K->3263K(1056768K)], 0.0693555 secs] [Times: user=0.42 sys=0.01, real=0.07 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7165K->7164K(7168K)] 9213K->9212K(9728K), [Metaspace: 3264K->3264K(1056768K)], 0.0564705 secs] [Times: user=0.32 sys=0.00, real=0.05 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->0K(2560K)] [ParOldGen: 7167K->394K(7168K)] 9215K->394K(9728K), [Metaspace: 3268K->3268K(1056768K)], 0.0044834 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
HeapPSYoungGen      total 2560K, used 66K [0x00000007bfd00000, 0x00000007c0000000, 0x00000007c0000000)eden space 2048K, 3% used [0x00000007bfd00000,0x00000007bfd10bb8,0x00000007bff00000)from space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000)to   space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000)ParOldGen       total 7168K, used 394K [0x00000007bf600000, 0x00000007bfd00000, 0x00000007bfd00000)object space 7168K, 5% used [0x00000007bf600000,0x00000007bf662be0,0x00000007bfd00000)Metaspace       used 3295K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 363K, capacity 388K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

堆外内存

Direct buffer memory

写NIO程序的时候经常会使用ByteBuffer来读取或写入数据,这是一种基于通道(Channel) 与 缓冲区(Buffer)的I/O方式,它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

ByteBuffer.allocate(capability):第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢

ByteBuffer.allocteDirect(capability):第二种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存的拷贝,所以速度相对较快

但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象就不会被回收,这时候怼内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那么程序就奔溃了。

一句话说:本地内存不足,但是堆内存充足的时候,就会出现这个问题
在这里插入图片描述

    // -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5mpublic static void main(String[] args) {// 分配6M 堆外内存ByteBuffer.allocateDirect(6 * 1024 * 1024);}
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memoryat java.nio.Bits.reserveMemory(Bits.java:694)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)at oom.DirectMemorySizeDemo.main(DirectMemorySizeDemo.java:13)

这时候就会出现异常,堆外内存不够用。

本地方法栈

unable to create new native thread

这个异常其实就是,在应用进程内创建的线程超过进程限制格式,默认是1024个。

【复盘】记录一次JVM 异常问题 java.lang.OutOfMemoryError: unable to create new native thread

元空间

java.lang.OutOfMemoryError:Metaspace

元空间就是我们的方法区,存放的是类模板,类信息,常量池等.一般出现这个错误,要么就是框架动态生成的类太多,或者 引用的 jar 包加载了很多 class。


/**-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m* @author qxlx* @date 2024/2/25 22:00*/
public class MetaspaceOutOfMemoryDemo {static class OOMTest {}public static void main(String[] args) {int i = 0;try {while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMTest.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {return methodProxy.invokeSuper(o,args);}});}} catch (Exception e) {System.out.println("i="+i);e.printStackTrace();}}}java.lang.OutOfMemoryError:Metaspace

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492124.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

速卖通买家号操作指南:轻松注册与全自动批量注册技巧

我是一位在速卖通平台销售产品的卖家&#xff0c;最近尝试了一种新的方法来提升产品的销量和曝光度&#xff0c;即利用速卖通买家号以及速卖通跨境智星的功能。我想与大家分享一下我的经验和感受。 首先&#xff0c;我了解到速卖通买家号可以帮助产品在平台上提升排名&#xff…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

逆向茶话会笔记

安卓逆向 用用burp设置代理或者用charles抓包 windows httpopen 类比web站点渗透测试 推荐书 飞虫 安卓大佬不怎么打ctf 喜欢在看雪和吾爱破解 提问环节 q websocket grpc抓包有什么推荐的工具&#xff1f; a 不太了解 游戏安全和llvm 既要逆游戏也要逆外挂 逆游戏入…

Linux基础命令—进程管理

基础知识 linux进程管理 什么是进程 开发写代码->代码运行起来->进程 运行起来的程序叫做进程程序与进程区别 1.程序是一个静态的概念,主要是指令集和数据的结合,可以长期存放在操作系统中 2.进程是一个动态的概念,主要是程序的运行状态,进程存在生命周期,生命周期结…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

清新文艺的微社区PaoPao

什么是 PaoPao &#xff1f; PaoPao 是一个 Go 写的轻量级社区。采用 GinVue 实现的微社区&#xff0c;界面清爽拥有话题、发布短内容、评论等功能。 安装 在群晖上以 Docker 方式安装。 本文写作时&#xff0c;bitbus/paopao-ce 镜像&#xff0c; latest 对应的版本是 0.5.2 …

数字化转型导师坚鹏:地市级政府数字化转型案例研究

地市级政府数字化转型案例研究 课程背景&#xff1a; 很多地市级政府存在以下问题&#xff1a; 不清楚地市级政府数字化转型的政务服务类成功案例 不清楚地市级政府数字化转型的社会管理类成功案例 不清楚地市级政府数字化转型的智慧城市类成功案例 课程特色&#xff…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义&#xff1a; 设G&#xff08;V&#xff0c;E&#xff09;是一个具有n个顶点的有向图&#xff0c;V中的顶点序列称为一个拓扑序列&#xff0c;当且仅当满足下列条件&#xff1a;若从顶点到有一条路径&#xff0c;则在顶点序列中顶点必在之前。 2.基本思想…

海南云仓酒庄拜会三亚市贸促会与三亚国际商会共谋发展 共绘蓝图

2024年2月23日上午&#xff0c;三亚市贸促会党组书记、会长、三亚国际商会会长方玉来在三亚国际商会会议室与海南云仓酒庄有限公司党支部书记蒋义一行进行了深入座谈交流&#xff0c;本次还有副会长张成山、秘书处副秘书长孙秋丽、李婧参加了座谈会。此次座谈会旨在加强双方的合…

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、小区管理员、用户三种角色 1、用户&#xff1a; 登…

yolov8车辆识别模型(附数据集)

目录 前言 一、我的数据集 二、其他车辆数据集 三、我的模型 四、模型训练&#xff08;一站式链接&#xff09; 五、我的训练过程 前言 因为为了做毕设&#xff0c;所以训练了一个道路监控的车辆模型。 效果不是很好&#xff0c;希望大佬们指导一下。 再此也分享我找了到的…

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例&#xff1a;基于 Flask 的微服务6.1.3 拓展案例 1&#xff1a;容器间的直接通信6.1.4 拓展案例 2&#xff1a;跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例&#xff1a;配置 Flask 应用的…