当前位置: 首页 > article >正文

【开发】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.kler.cn/a/387964.html

相关文章:

  • 区块链技术在慈善捐赠中的应用
  • matlab建模入门指导
  • request爬虫库的小坑
  • STM32单片机WIFI语音识别智能衣柜除湿消毒照明
  • react动态路由
  • rockylinux 8安装 gcc11.2
  • uni-app打包后报错云服务空间未关联
  • unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
  • [python] 如何debug python脚本中C++后端的core dump
  • 【嵌入式开发——ARM】1ARM架构
  • 牛客周赛 Round 67
  • Android 实现一个系统级的悬浮秒表
  • 基于 STM32 的天气时钟项目中添加天气数据的网络获取功能
  • Edge浏览器打开PDF无法显示电子签章
  • mac 本地docker-mysql主从复制部署
  • Hive-testbench套件使用文档
  • Matlab绘制箭头(annotation 、quiver、​quiver3)
  • Python批量合并多个PDF
  • 【Ubuntu24.04】从双系统到虚拟机再到单系统的故事
  • 产品如何3D建模?如何根据使用场景选购3D扫描仪?
  • 书生大模型第四期闯关任务与笔记
  • 在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析
  • onnx-runner:使用ORT运行YOLO的ONNX模型
  • 安全关键型嵌入式系统设计模式整理及应用实例
  • Flink的流、批处理
  • 【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)