JVM——产生内存溢出原因
目录
- 1.产生内存溢出原因一 :代码中的内存泄漏
- 1.案例1:equals()和hashCode()导致的内存泄漏
- 问题:
- **正常情况**:
- **异常情况:**
- 解决方案:
- 2.案例2:内部类引用外部类
- 问题:
- 解决方案:
- 3.案例3:ThreadLocal的使用
- 问题:
- 解决方案:
- 4.案例4:String的intern方法
- 问题:
- 解决方案:
- 5案例5:通过静态字段保存对象
- 问题:
- 解决方案:
- 案例6:资源没有正常关闭
- 问题:
- 解决方案:
- 2.产生内存溢出原因二 : 并发请求问题
- 模拟并发请求
1.产生内存溢出原因一 :代码中的内存泄漏

1.案例1:equals()和hashCode()导致的内存泄漏
问题:
⚫ 在定义新类时没有重写正确的equals()和hashCode()方法。在使用HashMap的场景下,如果使用这个类对象作为key,HashMap在判断key是否已经存在时会使用这些方法,如果重写方式不正确,会导致相同的数据被保存多份。
正常情况:
1、以JDK8为例,首先调用hash方法计算key的哈希值,hash方法中会使用到key的hashcode方法。根据hash方法的结果决定存放的数组中位置。
2、如果没有元素,直接放入。如果有元素,先判断key是否相等,会用到equals方法,如果key相等,直接替换value;key不相等,走链表或者红黑树查找逻辑,其中也会使用equals比对是否相同。
异常情况:
1、hashCode方法实现不正确,会导致相同id的学生对象计算出来的hash值不同,可能会被分到不同的槽中。
2、equals方法实现不正确,会导致key在比对时,即便学生对象的id是相同的,也被认为是不同的key。
3、长时间运行之后HashMap中会保存大量相同id的学生数据。
解决方案:
1、在定义新实体时,始终重写equals()和hashCode()方法。
2、重写时一定要确定使用了唯一标识去区分不同的对象,比如用户的id等。
3、hashmap使用时尽量使用编号id等数据作为key,不要将整个实体类对象作为key存放
2.案例2:内部类引用外部类
问题:
⚫ 1、非静态的内部类默认会持有外部类,尽管代码上不再使用外部类,所以如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类。
⚫ 2、匿名内部类对象如果在非静态方法中被创建,会持有调用者对象,垃圾回收时无法回收调用者
解决方案:
1、这个案例中,使用内部类的原因是可以直接获取到外部类中的成员变量值,简化开发。如果不想持有外部类
对象,应该使用静态内部类。
2、使用静态方法,可以避免匿名内部类持有调用者对象。
3.案例3:ThreadLocal的使用
问题:
如果仅仅使用手动创建的线程,就算没有调用ThreadLocal的remove方法清理数据,也不会产生内存泄漏。因为当线程被回收时,ThreadLocal也同样被回收。但是如果使用线程池就不一定了。
解决方案:
线程方法执行完,一定要调用ThreadLocal中的remove方法清理对象。
4.案例4:String的intern方法
问题:
JDK6中字符串常量池位于堆内存中的Perm Gen永久代中,如果不同字符串的intern方法被大量调用,字符串常量池会不停的变大超过永久代内存上限之后就会产生内存溢出问题。
解决方案:
1、注意代码中的逻辑,尽量不要将随机生成的字符串加入字符串常量池
2、增大永久代空间的大小,根据实际的测试/估算结果进行设置-XX:MaxPermSize=256M.
5案例5:通过静态字段保存对象
问题:
如果大量的数据在静态变量中被长期引用,数据就不会被释放,如果这些数据不再使用,就成为了内存泄漏。
解决方案:
1、尽量减少将对象长时间的保存在静态变量中,如果不再使用,必须将对象删除(比如在集合中)或者将静态变量设置为null。
2、使用单例模式时,尽量使用懒加载,而不是立即加载。
3、Spring的Bean中不要长期存放大对象,如果是缓存用于提升性能,尽量设置过期时间定期失效。
案例6:资源没有正常关闭
问题:
连接和流这些资源会占用内存,如果使用完之后没有关闭,这部分内存不一定会出现内存泄漏,但是会导致close方法不被执行。
解决方案:
1、为了防止出现这类的资源对象泄漏问题,必须在finally块中关闭不再使用的资源。
2、从 Java 7 开始,使用try-with-resources语法可以用于自动关闭资源。
2.产生内存溢出原因二 : 并发请求问题
⚫ 并发请求问题指的是用户通过发送请求向Java应用获取数据,正常情况下Java应用将数据返回之后,这部分数据就可以在内存中被释放掉。
⚫ 并发请求问题指的是用户通过发送请求向Java应用获取数据,正常情况下Java应用将数据返回之后,这部分数据就可以在内存中被释放掉。但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。这类问题的处理思路和内存泄漏类似,首先要定位到对象产生的根源。

模拟并发请求
⚫ 使用Apache Jmeter软件可以进行并发请求测试。
⚫ Apache Jmeter是一款开源的测试软件,使用Java语言编写,最初是为了测试Web程序,目前已经发展成支
持数据库、消息队列、邮件协议等不同类型内容的测试工具。
相关文章:
JVM——产生内存溢出原因
目录 1.产生内存溢出原因一 :代码中的内存泄漏1.案例1:equals()和hashCode()导致的内存泄漏问题:**正常情况**:**异常情况:**解决方案: 2.案例2:内部类引用外部类问题:解决方案&…...
关于X86机器上运行GnuCobol的研究
1.安装GnuCobol 当前的稳定版本是 3.1.2,已经在各种平台上进行了广泛测试,并已投入商用。 下载地址为: https://phoenixnap.dl.sourceforge.net/project/gnucobol/gnucobol/3.1/gnucobol- 3.1.2.tar.bz2 1)上传压缩包至x86服务器; 2)通过tar -xvf gnucobol-3.1.2.tar.bz2…...
open与openat的区别
Linux 中的 open 和 openat 系统调用都用于打开文件,但它们有一些区别。 一、函数原型 open 系统调用的原型 #include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);pathname 是要打开的文件路径flags 是打开文件的标志mode 是文件的…...
人工智能与供应链行业融合:预测算法的通用化与实战化
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 让我们一起深入探索人工智能与供应链的融合,以及预测算法在实际应用中的价值!🔍🚀 文章目录 前言供应链预测算法的基本流程统计学习模型与机…...
Cytoscape学习教程
写在前面 今天分享的内容是自己遇到问题后,咨询社群里面的同学,帮忙解决的总结。 关于Cytoscape,对于做组学或生物信息学的同学基本是陌生的,可能有的同学用这个软件作图是非常溜的,做出来的网络图也是十分的好看,“可玩性”很高,就像前面分享的aPEAR包一样aPEAR包绘制…...
computed和watch相关
Computed本质是一个具备缓存的watcher,依赖的属性发生变化就会更新视图。 适用于计算比较消耗性能的计算场景。当表达式过于复杂时,在模板中放入过多逻辑会让模板难以维护,可以将复杂的逻辑放入计算属性中处理 computed擅长处理:一…...
反思一次效能提升
前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。 改进前 在同一个产品团队,同时有前端工程师和后端工程师。他们经常需要共同协作完成features。 前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。 打包后,…...
ElasticSearch之cat indices API
命令样例如下: curl -X GET "https://localhost:9200/_cat/indices?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下: health status index uuid …...
Composer update 跳过指定依赖
在使用Compose进PHP 依赖管理只时,有时候我们可能希望忽略版本批配,即使依赖项的景新版本已经发布,也然续使用当前的乐本。这种情况下,我们可以使用Composer的 --ignore-platform-reqs 选项来实现 可以使用--ignore-platform-req…...
@RequestMapping详解:请求映射规则
目录 请求-相应模式: 设置请求映射规则RequestMapping POST 请求: GET 请求 请求-相应模式: 前端作为客户端向后端发送请求(请求可以分为请求头和请求体两部分,请求头包含了一些元数据信息,如请求方式、…...
C#中密封类和密封方法
目录 一、定义与特性 1.何时使用密封类 2.定义 3.特性 二、示例 如果所有的类都可以被继承,很容易导致类的层次结构变得十分复杂。使对类的理解和使用变得十分困难。为了避免滥用继承,C#中提出了密封类的概念。 一、定义与特性 密封类可以用来限制…...
Pytorch中的Net.train()和 Net.eval()函数讲解
目录 前言1. Net.train()2. Net.eval()3. 总结 前言 这两个方法通常用于训练和测试阶段 1. Net.train() 该代码用在训练模式中 主要作用: 模型启用了训练时特定的功能(Batch Normalization 和 Dropout)。 在这种模式下,模型会根…...
氪了几百亿,字节游戏停止了“跳动”
目录 一、氪了几百亿,字节游戏停止了“跳动” 二微软推出跨平台框架 ML.NET 3.0 版:强化深度学习、加强AI效率 一、氪了几百亿,字节游戏停止了“跳动” 朝夕光年,扑了 11月26日,脉脉社区的一个截图内容引起大众热议…...
进入docker容器
学习如何进入一个正在运行的容器的内部,要求学习者参照示例,进入一个名为container2的容器内部,并在容器内部创建一个1.txt文件。 相关知识 使容器在后台运行 因为本关要使用docker run -d命令,所以在本关的开始,将…...
C陷阱与缺陷——第5章库函数
1. 返回整数的getchar函数 #include <stdio.h>main() {char c;while((c getchar()) ! EOF){putchar(c);} } 上述函数是错误的,原因在于程序中的变量c被声明为char类型,而不是int类型,这意味着c无法容下所有可能的字符,特…...
【C++上层应用】6. 信号 / 中断
文章目录 【 1. signal 函数 】【 2. raise函数 】 信号是由操作系统传给进程的 中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 CtrlC 产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中捕…...
树与二叉树堆:堆的意义
目录 堆的意义: 第一是堆的排序,第二是堆的top k 排行问题 堆的 top k 排行问题: 面对大量数据的top k 问题: 堆排序的实现:——以升序为例 方法一 交换首尾: 建立大堆: 根结点尾结点的…...
什么时候适合做ui自动化测试?什么时候做接口自动化测试
UI自动化测试和接口自动化测试都是软件测试中非常重要的部分,它们各自有适合的应用场景。 适合做UI自动化测试的场景包括: 用户界面(UI)变化频繁的应用程序。需要测试用户交互和流程的应用程序。需要验证页面布局、样式和交互的…...
[ABC261E] Many Operations(dp,位运算,打表)
[ABC261E] Many Operations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Problem Statement We have a variable X and N kinds of operations that change the value of X. Operation i is represented as a pair of integers (Ti,Ai), and is the following operati…...
一、爬虫-爬取豆瓣电影案例
1、环境配置 你需要一个pycharm和requests第三方库,在安装完成之后即可继续浏览。 2、操作流程 (1)打开豆瓣电影网站,点击排行榜,点击喜剧,检查 (2)可以看到鼠标每次下移࿰…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
