【开发】Java的内存溢出

Java之内存溢出

Java之内存溢出 | OutOfMemoryError

我们都知道,在Java的世界里,由JVM管理着Java中的“垃圾对象”,也就是不被引用的对象;当一个对象不被其它对象引用的时候,该对象就会被垃圾回收器清理掉。但是在某些情况下,如果我们的代码导致垃圾回收器无法清理掉多余的对象,那么程序就会爆OurOfMemoryError(OOM),下面用一段代码来触发下该异常。

import java.util.ArrayList;
import java.util.List;public class E {public static void main(String[] args) {List<String> list = new ArrayList<>();while (true) {list.add("Hello");}}
}

这段代码被执行之后,控制台不会有任何输出,稍等一会儿后,控制台就会报内存溢出错误,效果如下:

在这里插入图片描述

解决方案

调整内存大小是一个后手,在这之前,程序员应该尽量优化数据结构,降低内存溢出出现的频率,如果这时候还存在内存溢出的情况,再去考虑调整内存大小。

我们可以在启动项目的时候使用-Xms-Xmx两个参数规定Java的标准内存空间与最大内存空间。示例命令如下:

java -Xms512m -Xmx2g YourProgram

请注意:标准内存空间与最大内存空间不要超过计算机或服务器的运行空间,并应当给其它程序保留一定的运算空间,否则你的计算机可能会出现卡死无法执行的情况。

内存监控

除了优化数据结构、增加运行空间之外,我们还可以在启动项目的时候添加-Xloggc:<path>参数,当程序发生内存泄露的时候,系统会生成当前的内存快照,并保存在<path>下,下面是示例命令与生成的文件内容:

java -Xloggc:gc.log YourProgram

执行上面命令后,当项目出现内存溢出时,就会将当前的内存快照保存在./gc.log下,此时查看./gc.log,内容如下:

OpenJDK 64-Bit Server VM (25.422-b05) for linux-amd64 JRE (1.8.0_422-8u422-b05-1~22.04-b05), built on Jul 21 2024 21:59:18 by "buildd" with gcc 11.4.0
Memory: 4k page, physical 1731168k(298728k free), swap 0k(0k free)
CommandLine flags: -XX:InitialHeapSize=27698688 -XX:MaxHeapSize=443179008 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
0.062: [GC (Allocation Failure)  6771K->2386K(27776K), 0.0047142 secs]
0.069: [GC (Allocation Failure)  5551K->5545K(27776K), 0.0097146 secs]
0.081: [GC (Allocation Failure)  10293K->10293K(27776K), 0.0176603 secs]
0.104: [GC (Allocation Failure)  17415K->17415K(27776K), 0.0304972 secs]
0.135: [Full GC (Allocation Failure)  17415K->7390K(27776K), 0.0090143 secs]
0.150: [GC (Allocation Failure)  18073K->18073K(27776K), 0.0044526 secs]
0.154: [Full GC (Allocation Failure)  18073K->10951K(27776K), 0.0183721 secs]
0.186: [GC (Allocation Failure)  26976K->26976K(43804K), 0.0052467 secs]
0.191: [Full GC (Allocation Failure)  26976K->16293K(43804K), 0.0167542 secs]
0.227: [GC (Allocation Failure)  40329K->40329K(75076K), 0.0088539 secs]
0.236: [Full GC (Allocation Failure)  40329K->24305K(75076K), 0.0247799 secs]
0.289: [GC (Allocation Failure)  60360K->60360K(121948K), 0.0129599 secs]
0.302: [Full GC (Allocation Failure)  60360K->36323K(121948K), 0.0361519 secs]
0.383: [GC (Allocation Failure)  90406K->90406K(138204K), 0.0188256 secs]
0.402: [Full GC (Allocation Failure)  90406K->54351K(138204K), 0.0663107 secs]
0.529: [GC (Allocation Failure)  135475K->135475K(219328K), 0.0272062 secs]
0.556: [Full GC (Allocation Failure)  135475K->81392K(219328K), 0.0796819 secs]
0.734: [GC (Allocation Failure)  203078K->203078K(368960K), 0.0522887 secs]
0.786: [Full GC (Allocation Failure)  203078K->121954K(368960K), 0.1163572 secs]
0.903: [Full GC (Allocation Failure)  121954K->121942K(419712K), 0.1044216 secs]

至于如何分析该内容,那不是本章节的重点,就不赘述咯,这里只是提供一个思路。

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

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

相关文章

EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效

设置背景色 CellStyle style workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色style.setFillPattern(FillPatternType.SOLID_FOREGROUND)EasyExcel.writerTable(0).head(Head1.class).registerWriteHandl…

【51单片机】LED点阵屏 原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角&#xff0c;注意使用前需要…

深度学习-张量相关

一. 张量的创建 张量简介 张量是pytorch的基本数据结构 张量&#xff0c;英文为Tensor&#xff0c;是机器学习的基本构建模块&#xff0c;是以数字方式表示数据的形式。 例如&#xff0c;图像可以表示为形状为 [3, 224, 224] 的张量&#xff0c;这意味着 [colour_channels, h…

使用vite构建一个react网站,并部署到Netlify上

这篇教程中&#xff0c;我会教你如何用vite快速构建一个react网站&#xff0c;并把网站免费部署到Netlify上&#xff0c;让别人可以经由网址访问你的react网站。 1. 使用vite构建基础框架 npm create vitelatestcd vite-project npm install npm run dev2. 网站内容设计 3. 构…

Fastify Swagger:自动化API文档生成与展示

在现代软件开发中&#xff0c;API文档的生成和维护是一个不可或缺的环节。Fastify Swagger 是一个专为 Fastify 框架设计的插件&#xff0c;它能够自动生成符合 Swagger&#xff08;OpenAPI v2 或 v3&#xff09;规范的文档&#xff0c;从而帮助开发者轻松创建和维护API文档。本…

【网络原理】万字详解 UDP 和 TCP

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. UDP1.1 UDP 报文格式1.1.1 源端口/目的端口1.1.2 报文长度1.1.3 校验和 2. TCP2.1 TCP 报文结构2.2 TCP 特…

Go 中的泛型,日常如何使用

泛型从 go 的 1.18 开始支持 什么是泛型编程 在泛型出现之前&#xff0c;如果需要计算两数之和&#xff0c;可能会这样写&#xff1a; func Add(a, b int) int {returb a b } 这个很简单&#xff0c;但是只能两个参数都是 int 类型的时候才能调用 如果想要计算两个浮点数…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产&#xff0c;国产芯片的串口DMA接收功能测试不通过&#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣&#xff0c;不过我的芯片已经主频跑…

词嵌入方法(Word Embedding)

词嵌入方法&#xff08;Word Embedding&#xff09; Word Embedding是NLP中的一种技术&#xff0c;通过将单词映射到一个空间向量来表示每个单词 ✨️常见的词嵌入方法&#xff1a; &#x1f31f;Word2Vec&#xff1a;由谷歌提出的方法&#xff0c;分为CBOW&#xff08;conti…

【go从零单排】实现枚举类型(Enum)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;并没有内置的枚举类型&#xff08;Enum&#xff09;&…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

MOS管损坏原因

MOS管是什么&#xff1f; MOS管&#xff0c;全程就是MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;&#xff0c;是一种场效应晶体管。‌ MOS管控制原理 MOS管的工作原理是通过栅极电压&#xff08;G&#xff09;来控制源极&#xff08…

「QT」QT5程序设计专栏目录

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

论文阅读《机器人状态估计中的李群》

目录 摘要1 介绍2 微李理论2.1 李群 摘要 李群是一个古老的数学抽象对象&#xff0c;可以追溯到19世纪&#xff0c;当时数学家 Sophus Lie奠定了连续变换群理论的基础。多年后&#xff0c;它的影响已经蔓延到科学和技术的各个领域。在机器人领域&#xff0c;我们最近正在经历一…

EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?

在现代视频监控领域&#xff0c;跨区域的网络化视频监控管理平台成为了大中型项目的首选。EHOME视频平台EasyCVR以其强大的功能和兼容性&#xff0c;成为了众多项目的核心组件。它不仅能够管理视频资源、设备、用户、运维和安全&#xff0c;还支持多种行业标准协议&#xff0c;…

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip&#xff1a;浮动路由指在多条默认路由基础上加入优先级参数&#xff0c;实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数&#xff1a;越小越优 本次实验测试两条默认路由&#xff0c;其中一条默认路由添加优先级参数&#xff0c;设置…

Android CCodec Codec2 (十九)C2LinearBlock

在上一篇文章的结尾&#xff0c;我们看到fetchLinearBlock方法最终创建了一个C2LinearBlock对象。这一节&#xff0c;我们将深入了解C2LinearBlock是什么&#xff0c;它的作用是什么&#xff0c;以及它是如何被创建的。 1、_C2BlockFactory 先对上一篇文章的结尾内容做简单回顾…

Axure PR 9 多级下拉选择器 设计交互

​ 大家好&#xff0c;我是大明同学。 Axure选择器是一种在交互设计中常用的组件&#xff0c;这期内容&#xff0c;我们来探讨Axure中多级下拉选择器设计与交互技巧。 下拉列表选择输入框元件 创建选择输入框所需的元件 1.在元件库中拖出一个矩形元件。 2.选中矩形元件&…

SparkSql读取数据的方式

一、读取普通文件 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a;直接调用对应数据源类型的方法 …