《JVM由浅入深学习【五】 2024-01-08》JVM由简入深学习提升分享
目录
- JVM何时会发生堆内存溢出?
- 1. 堆内存溢出的定义
- 2. 内存泄漏的原因
- 3. 堆内存溢出的常见场景
- 4. JVM参数调优
- 5. 实际案例分析
- JVM如何判断对象可以回收
- 1.可达性分析的基本思路
- 2.实际案例
- 3.可以被回收的对象
- 4.拓展, 谈谈 Java 中不同的引用类型?
- 结语
- 感谢阅读
JVM何时会发生堆内存溢出?
前言:
欢迎来到本篇博客,我们将深入探讨 Java 虚拟机(JVM)中堆内存溢出的情况。理解这些情况对于避免内存问题和编写稳定的Java应用程序至关重要。
1. 堆内存溢出的定义
在Java中,堆内存溢出指的是当应用程序在堆内存中创建的对象无法被垃圾回收器有效回收,导致堆内存不足。这是一种常见的内存问题,经常会导致程序的崩溃。
2. 内存泄漏的原因
-
无效的引用: 对象的引用没有及时释放,导致垃圾回收器无法回收不再使用的对象。
-
循环引用: 对象之间存在相互引用,形成了循环链,使得这些对象都无法被垃圾回收。
3. 堆内存溢出的常见场景
-
大对象导致的溢出: 当创建大量大对象(如大数组)时,堆内存可能不足。
-
长时间运行的应用: 在长时间运行的Java应用程序中,由于对象的持续创建和保留,可能导致堆内存溢出。
4. JVM参数调优
-
堆内存大小设置: 可通过
-Xms
和-Xmx
参数设置堆内存的初始大小和最大大小,合理调整可以减少溢出的风险。java -Xms256m -Xmx512m -jar your-application.jar
5. 实际案例分析
考虑以下代码片段,它在一个循环中创建大量对象,但却没有释放引用:
import java.util.ArrayList;
import java.util.List;public class HeapMemoryOverflowExample {public static void main(String[] args) {List<String> stringList = new ArrayList<>();try {while (true) {// 创建大量字符串对象String largeString = new String(new char[1000000]);// 将字符串对象添加到集合中stringList.add(largeString);}} catch (OutOfMemoryError e) {System.out.println("堆内存溢出异常捕获:" + e.getMessage());}}
}
在这个例子中,由于对象持续被添加到stringList
列表中,垃圾回收器无法回收这些对象,最终导致堆内存溢出。
JVM如何判断对象可以回收
Java虚拟机(JVM)通过垃圾回收机制来自动管理内存,判断哪些对象可以被回收是垃圾回收的核心问题。JVM使用一种称为"可达性分析"的方法来判断对象的可达性,即判断对象是否还与引用链中的任何强引用相连。如果一个对象不再与任何强引用相连,那么它就成为不可达对象,可以被垃圾回收。
1.可达性分析的基本思路
-
根搜索算法(GC Roots): 通过一系列称为GC Roots的根对象作为起始点,从这些根对象开始向下搜索,能够到达的对象称为可达对象,不能到达的对象即为不可达对象。
-
GC Roots的类型:
- 虚拟机栈中引用的对象: 在方法的局部变量表中引用的对象。
- 本地方法栈中JNI(Java Native Interface)引用的对象: JNI是Java调用本地语言的接口,本地方法中引用的Java对象。
- 方法区中类静态属性引用的对象: 静态属性属于类的,它引用的对象也属于可达对象。
- 方法区中常量引用的对象: 常量池中的字符串常量等。
2.实际案例
考虑以下代码,演示了一个对象何时成为不可达对象:
public class GarbageCollectionExample {public static void main(String[] args) {Object obj1 = new Object(); // 强引用 obj1 指向新创建的对象Object obj2 = new Object(); // 强引用 obj2 指向新创建的对象obj1 = null; // obj1 不再指向对象,成为不可达对象System.gc(); // 提醒垃圾回收器进行垃圾回收// 在这里,垃圾回收器可能会回收 obj1 所指向的对象}
}
在上述代码中,obj1
一开始指向一个新创建的对象,后来被置为null
,不再与任何强引用相连。当程序调用System.gc()
提醒垃圾回收器进行垃圾回收时,垃圾回收器可能会回收obj1
原来所指向的对象。
要注意的是,垃圾回收器的执行是不确定的,调用System.gc()
并不一定会立即触发垃圾回收。这只是一个提示,实际回收时机由垃圾回收器自行决定。
3.可以被回收的对象
1、在虚拟机栈(栈中的本地变量表)中引用的对象,警如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等所引用的对象;
2、方法区/元空间中的类静态属性引用的对象
3、方法区/元空间中的常量引用的对象
4、在本地方法栈中JNI (即通常所说的 Native 方法) 引用的对象
5、Java 虚拟机内部的引用,如基本数据类型对应的 Class 对象,一些常驻的异常对象 (比如
NullPointExcepiton、OutOfMemoryError) 等,还有系统类加载器
6、所有被同步锁 (synchronized 关键字) 持有的对象;
7、反映 Java 虚拟机内部情况的JMXBean、JVMTI 中注册的回调本地代码缓存等
4.拓展, 谈谈 Java 中不同的引用类型?
Java 里有不同的引用类型,分别是强引用、软引用、弱引用 和 虚引用
强引用: Object object = new Object() ;
软引用: SoftReference 内存充足时不回收,内存不足时则回收;
弱引用: WeakReference 不管内存是否充足,只要 GC 一运行就会回收该引用对象
虚引用: PhantomReference 这个其实暂时忽略也行,因为很少用,它形同虚设,就像没有引用一样,其作用就是该引用对象被 GC 回收时候触发一个系统通知,或者触发进一步的处理
结语
在Java中,垃圾回收机制是一项重要的特性,它通过判断对象的可达性来自动管理内存,确保程序运行时不会因为内存泄漏而导致性能问题。了解对象何时成为不可达对象,以及垃圾回收的基本原理,对于编写高效的Java程序至关重要。
通过本文的介绍,我们深入了解了JVM如何判断对象是否可以回收,以及可达性分析的基本思路。在编写Java程序时,及时释放不再需要的对象引用是一种良好的编程习惯,有助于提高程序的性能和资源利用率。
感谢阅读
感谢您阅读本篇关于JVM的文章。希望通过这篇分享,您对Java内存管理和垃圾回收有了更深入的理解。如果有任何问题或建议,欢迎在评论区与我们分享。愿您的编程之路愉快!
相关文章:
《JVM由浅入深学习【五】 2024-01-08》JVM由简入深学习提升分享
目录 JVM何时会发生堆内存溢出?1. 堆内存溢出的定义2. 内存泄漏的原因3. 堆内存溢出的常见场景4. JVM参数调优5. 实际案例分析 JVM如何判断对象可以回收1.可达性分析的基本思路2.实际案例3.可以被回收的对象4.拓展, 谈谈 Java 中不同的引用类型? 结语感…...
FastDFS之快速入门、上手
知识概念 分布式文件系统 通过计算机网络将各个物理存储资源连接起来。通过分布式文件系统,将网络上任意资源以逻辑上的树形结构展现,让用户访问网络上的共享文件更见简便。 文件存储的变迁: 直连存储:直接连接与存储…...
Vue 中的 ref 与 reactive:让你的应用更具响应性(中)
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
【数据库基础】Mysql与Redis的区别
看到一篇不错的关于“Mysql与Redis的区别”的文章,转过来记录下~ 文章目录 一、数据库类型二、运行机制三、什么是缓存数据库呢?四、优缺点比较五、区别总结六、数据可以全部直接用Redis储存吗?参考资料 一、数据库类型 Redis:NOS…...
JVM工作原理与实战(六):类的生命周期-连接阶段
专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载(Loading) 2.连接(Linking) 3.初始化(Initialization) 4.使用(Using&…...
【OCR】 - Tesseract OCR在Windows系统中安装
Tesseract OCR 在Windows环境下安装Tesseract OCR(Optical Character Recognition)通常包括以下几个步骤: 下载Tesseract 访问Tesseract的GitHub发布页面:https://github.com/tesseract-ocr/tesseract/releases找到适合你操作系…...
YOLOv8改进 | 损失函数篇 | SlideLoss、FocalLoss分类损失函数助力细节涨点(全网最全)
一、本文介绍 本文给大家带来的是分类损失 SlideLoss、VFLoss、FocalLoss损失函数,我们之前看那的那些IoU都是边界框回归损失,和本文的修改内容并不冲突,所以大家可以知道损失函数分为两种一种是分类损失另一种是边界框回归损失,上一篇文章里面我们总结了过去百分之九十的…...
计算机网络试题——填空题(附答案)
在OSI模型中,第一层是____________层。 答案:物理(Physical) TCP协议是一种_____________连接的协议。 答案:面向连接(Connection-oriented) IPv6地址的位数是____________。 答案:1…...
第二证券:股票私募仓位指数创近八周新高
1月8日,A股几大首要指数全线收跌,上证指数收于日内最低点2887.54点,间隔上一年5月份的阶段高点3418.95点现已跌去了15.54%。 不过,虽然商场仍未清晰止跌,私募基金们却现已进场“抄底”。私募排排网最新发布的私募仓位…...
35-javascript基础,引入方式;变量命名规范
html分为三部分;结构html,表现css,行为js;js就是javascript js包含三部分: ECMAScript:简称ES,ES5,ES6核心语法 DOM:获取和操作html元素的标准方法;BOM&am…...
笔试案例2
文章目录 1、笔试案例22、思维导图 1、笔试案例2 09)查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…...
【嵌入式-网络编程】vmware中使用UDP广播失败问题
问题描述: 自己在vmware中搭建了2台虚拟机,虚拟机A向虚拟机A和虚拟机B发送广播信息,接收端在虚拟机A和虚拟机B,这个时候,由于没配置sin.sin_addr.s_addr htonl(INADDR_ANY);,而是配置的inet_pton(AF_INET,…...
2020年认证杯SPSSPRO杯数学建模D题(第二阶段)让电脑桌面飞起来全过程文档及程序
2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现: 对于一些必须每天使用电脑工作的白领来说,电脑桌面有着非常特殊的意义,通常一些频繁使用或者比较重要的图标会一直保留在桌面上,但是随着时间的推移,…...
vue3 修饰符大全(近万字长文)
系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符(Event Modifiers)1、.stop(阻止事件冒泡)2、.prevent(阻止事件的默认行为)3、.capture(使用事件捕获模式…...
HarmonyOS@State装饰器:组件内状态
State装饰器:组件内状态 State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。 在状态变量相关装饰器中,State是最基础的&…...
如何让GPT支持中文
上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…...
使用开源通义千问模型(Qwen)搭建自己的大模型服务
目标 1、使用开源的大模型服务搭建属于自己的模型服务; 2、调优自己的大模型; 选型 采用通义千问模型,https://github.com/QwenLM/Qwen 步骤 1、下载模型文件 开源模型库:https://www.modelscope.cn/models mkdir -p /data/…...
Java工程师面试题解析与深度探讨
Java工程师面试题解析与深度探讨 第一部分:引言 Java作为一门广泛应用的编程语言,拥有庞大的生态系统,Java工程师因此成为众多企业追逐的目标。而在Java工程师的招聘中,面试是了解候选人技能和经验的核心环节。本文将深入探讨一…...
Linux下安装JET2
0. 说明: JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件,详情见: http://www.lcqb.upmc.fr/JET2/JET2.html,http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…...
【PostgreSQL】表管理-表继承
PostgreSQL 表继承 PostgreSQL 实现了表继承,这对于数据库设计人员来说是一个有用的工具。(SQL:1999 及更高版本定义了类型继承功能,该功能在许多方面与此处描述的功能不同。 让我们从一个例子开始:假设我们正在尝试…...
Dijkstra算法——邻接矩阵实现+路径记录
本文是在下面这篇文章的基础上做了一些补充,增加了路径记录的功能。具体Dijkstra的实现过程可以参考下面的这篇文章。 [jarvan:Dijkstra算法详解 通俗易懂](Dijkstra算法详解 通俗易懂 - jarvan的文章 - 知乎 https://zhuanlan.zhihu.com/p/338414118) …...
Vim基础操作
参考B站UP:正月点灯笼 vim入门教程(共3讲) 以下总结,部分搬运自评论区,楼主:-不是飞鱼QAQ,修改部分内容。 vim分为 命令 和 编辑 模式 i进入编辑模式( - - INSERT - - )…...
Mac上安装 Node.js 的版本管理工具 n,以及 n 使用,的使用
安装 最近刚更换 Mac 本进行项目的开发,刚上手 Mac 本还不是很熟练,需要安装 Node.js 的包管理工具 在 Windows 上我是实用的 nvm 来管理的 Node 版本,但是我尝试下载 Nvm ,发现下载安装后的 Nvm 无法使用,提示 “Th…...
Node.js和npm
目录 01_Node.js01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.认识URL中的端口号目标讲解小结 06.http模块-创建Web服务目标讲解小结 07.案例-浏览时钟目标讲解小结 02_Node.js模块化…...
leetcode每日一题43
116. 填充每个节点的下一个右侧节点指针 层序遍历嘛 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(N…...
每天刷两道题——第十天
1.1和为k的子数组 给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你统计并返回 该数组中和为 k k k 的子数组的个数 。子数组是数组中元素的连续非空序列。 输入:nums [1,2,3], k 3 输出:2 前缀和 1.2如何使用 前缀和的…...
C语言入门教程,C语言学习教程(第一部分:编程基础 )一
C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言。C语言是计算机产业的核心语言,操作系统、硬件驱动、关键组件、数据库等都离不开C语言;不学习C语言,就不能了解计算机底层。 这套「C语言入门教程」…...
uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户信息修改实现
锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...
C语言PDF编程书籍下载
[C.Primer.Plus(第6版)中文版].(美)普拉达.扫描版.pdf 链接: https://pan.baidu.com/s/1difCyykkBdLqgLu32PgYLw 密码: tv05 C语言程序设计教程_基于Visual.Cpp.6.0环境.pdf 链接: https://pan.baidu.com/s/1q3nRrRJyUd4H3Yp_PgA…...
VScode/Xshell连接学校服务器
vscode连学校服务器 1.连接atrust VPN2.Xshell连接服务器2.1创建一个自己的用户 3.xftp传文件4.vscode连接服务器4.1下载remote-ssh4.2连接服务器4.3激活conda环境4.4运行代码 5. pytorch版本不兼容解决方案 1.连接atrust VPN 如果是使用的是校园网,可以不连接 2…...
哪个网站做h5好用/宁波优化关键词首页排名
Nsxpose 扫描器 2019-05-10 10:30:22 昨晚折腾完openvas 今天继续折腾业界鼎鼎大名的Nsxpose,我的目标是社区版,因为使用授权为一年 安装过程参考 https://www.fujieace.com/hacker/rapid7-nexpose.html 这里主要说说注册的事情。 社区版注册地址为https://www.r…...
wordpress如何关闭评论功能/艾瑞指数
目录 vim编辑器 vi 编辑器简介 vim 基本使用 vim 的工作模式 命令模式操作 移动光标 删除或剪切 复制 撤销 替换 查找 替换 vim 配置文件 vim 使用技巧 在 vim 中导入其他文件内容或命令结果 在 vim 中执行系统命令 导入命令结果 设定快捷键 字符替换 …...
个人网站怎么做银行卡支付/长春网站搭建
MySQL安装指南 <!-- start content --> 要安装 MySQL,可以在终端提示符后运行下列命令: sudo apt-get install mysql-server mysql-client 一旦安装完成,MySQL 服务器应该自动启动。您可以在终端提示符后运行以下命令来检查 MySQL 服务…...
wordpress首页添加幻灯片/网上培训
这是一个2019年你成为前端,后端或全栈开发者的进阶指南: 你不需要学习所有的技术成为一个web开发者 这个指南只是通过简单分类列出了技术选项 我将从我的经验和参考中给出建议 首选我们会介绍通用的知识, 最后介绍2019年的Web的一些趋势 视频地址: …...
小公司网站建设费用/seo搜索引擎优化报价
----拨号720错误解决记.txt---本来一直用ADSL拨号和手机GPRS拨号和电话线拨号好好的...后来,用了一断时间LAN,再用手机或ADSL/3G MODEM拨号时,都提示720错误..困扰了我半个月的时间...上网查一直没好的方法..重装了TCP/IP协议也不行. 删除KB893066、 KB911280、 KB913446 、KB9…...
做网站要商标吗/百度指数查询官网大数据
版权声明:本文为博主原创文章,转载请注明出处:https://twocups.cn/index.php/2020/02/05/18/ 有时我们需要对同一类型的对象进行多种不同方式的排序,而自然排序 Comparable 并不能实现。这里我们就需要重写比较器,可以…...