关于 JVM 个人 NOTE

news2024/12/25 2:27:57

目录

1、JVM 的体系结构

2、双亲委派机制

3、堆内存调优

4、关于GC垃圾回收机制

4.1 GC中的复制算法

4.2 GC中的标记清除算法


1、JVM 的体系结构

"堆"中存在垃圾而"栈"中不存在垃圾的原因:

堆(Heap)

  1. 用途:堆主要用于存储对象实例和数组。在Java中,几乎所有通过new关键字创建的对象都会存储在堆内存中。
  2. 内存分配与释放堆内存的分配和释放由JVM的垃圾回收器(Garbage Collector, GC)自动管理。当对象不再被引用时,它们被认为是垃圾,但并不会立即被释放。相反,垃圾回收器会在合适的时机进行垃圾回收,以释放这些不再使用的内存空间。
  3. 垃圾存在的原因:由于垃圾回收器并不是实时运行的,且对象的生命周期可能跨越多个垃圾回收周期,因此在堆内存中可能会存在已经不被使用但仍未被回收的垃圾对象

栈(Stack)

  1. 用途:栈主要用于存储局部变量、方法调用信息和对象的引用变量(但对象本身存储在堆中)。每个线程都有自己独立的栈空间,用于存储该线程执行过程中的局部变量和方法调用信息。
  2. 内存分配与释放栈内存的分配和释放是自动的,且与方法的调用和返回紧密相关。每当一个方法被调用时,JVM会在栈上为该方法创建一个新的栈帧(Stack Frame),用于存储局部变量等信息。当方法执行完毕后,其对应的栈帧会自动从栈中弹出并销毁,局部变量占用的内存也会随之释放。
  3. 不存在垃圾的原因:由于栈内存的分配和释放都是自动的,且与方法的调用和返回紧密相关,因此栈内存中的局部变量和方法调用信息在不再需要时会自动被释放,不会出现像堆内存中那样的垃圾对象。此外,栈内存的生命周期与线程相同,当线程结束时,其栈内存也会被自动释放


2、双亲委派机制

一开始先从Java启动类加载器中寻找相关类,若没有,则在拓展类加载器中寻找,最后才会在当前应用类加载器中寻找

例:如图所示

这里创建了一个java.lang的包,定义了String以及toString,与Java自带包冲突;

说明了一开始是由Java启动类加载器(Boot)进行类的加载,发现具有相同重复的类,则抛出异常,主要是为了保证安全性,防止恶意的擅自更改善意的代码

报错信息:


3、堆内存调优

public static void main(String[] args) {
        
        //jvm试图使用的最大内存
        long max = Runtime.getRuntime().maxMemory();

        //jvm总内存
        long total = Runtime.getRuntime().totalMemory();

        System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
        System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB");
    }

这里进行输出JVM中默认配置下的相关内存大小:

存在问题:

若发生OOM内存溢出,默认的堆配置内存可能行不通,可能需要自己进行配置

点击编辑配置        --->        修改选项        --->        添加VM选项

这里进行输入的配置中,其中“1024m”表示内存的大小、“PrintGCDetails”表示打印相关信息(更多的参数去百度),可以自行根据情况调节,以尽量控制不会出现OOM内存溢出

输出结果:

可见,通过配置,堆中所分配的内存大小发生了改变


4、关于GC垃圾回收机制

GC的作用区域在 “堆内存区” 以及 “方法区”

4.1 GC中的复制算法

内部具体伪动态图:

由于谁空谁为To区,Eden以及From中的对象都会往To区集合;当集合完毕之后,原来的From区为空,所以变为了To区,与原来的To区进行了“身份交换”;而后续存活下来的对象则顺利进入“养老区”

优点:没有内存的碎片,即 “要走一块走,要留一块留”

缺点:浪费了内存空间,即 “To幸存区” 与 “From幸存区” 必须空一块

总结

复制算法最佳最佳使用场景:对象存活度较低的时候,即在新生区进行使用

4.2 GC中的标记清除算法

优点:不需要占用额外的空间

缺点:经过两次扫描,严重浪费空间,因为会产生内存碎片

对于标记清除算法,对应的优化算法还有 “标记压缩算法” 、“标记清除压缩算法”,但都存在利与弊,没有最优,只有最合适

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

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

相关文章

python-金币/打分/小理学数列3

一:金币 题目描述 国王将金币作为工资,发放给忠诚的骑士。 第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天&#xff09…

数值计算 --- 平方根倒数快速算法(下)

平方根倒数快速算法(下) --- 向Greg Walsh致敬! 数值计算 --- 平方根倒数快速算法(上)_开根号倒数快速-CSDN博客文章浏览阅读712次,点赞31次,收藏30次。由于平方根倒数快速算法实在是太过经典,出于对code中magic number"0x5f…

Temu、亚马逊如何建立稳固的测评系统、避免挂单?

在跨境电商的测评与补单过程中,许多卖家和测评工作室常常面临由于技术环境不足导致的下单成功率低的问题。尤其是新账号在首次下单时,往往会遇到F号或砍单的困扰,进而陷入频繁购买和账号损失的恶性循环。这不仅消耗了大量时间和精力&#xff…

【真实访问】那些选择土木专业的学生,后来怎么样了?

“你会让孩子报土木专业吗?” 7月15日,澎湃新闻在微博上发起线上调研,截至16日12时,8000多人参与了投票,结果显示近7000人选择“不会,天坑专业”。短短几年时间,土木工程专业的报考从“香饽饽”…

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志,会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具,它可以更快的帮助开发者调试应用程序。 步入正题,看图说话。 点…

如何实现Mybatis自定义插件

背景 MyBatis的插件机制,也可称为拦截器,是一种强大的扩展工具。它允许开发者在不修改MyBatis框架源代码的情况下,通过拦截和修改MyBatis执行过程中的行为来定制和增强功能。 MyBatis插件可以拦截四大核心组件的方法调用:Executor…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素&#xff0…

828华为云征文|华为云 Flexus X实例之家庭娱乐中心搭建

话接上文《828华为云征文|华为云Flexus X实例初体验》,这次我们利用手头的 Flexus X 实例来搭建家庭影音中心和密码管理环境。 前置环境 为了方便小白用户甚至运维人员,我觉得现阶段的宝塔面板 和 1Panel 都是不错的选择。我这里以宝塔为例…

数通 1

通信:需要介质才能通信电话离信号塔(基站)越远,信号越弱。信号在基站之间传递。你离路由器越远,信号越差。一个意思 比如想传一张图片,这张图片就是数据载荷 网关,分割两个网络。路由器可以是网…

全网最详细——OpenFlow 协议分析

目录 1 OpenFlow 交换机 2 流表 3 OpenFlow 通道 4 任务描述 5 任务要求 6 任务实施 7 任务验收 1 OpenFlow 交换机 Open Flow 交换机可以分成流表和安全通道两部分。在 Open Flow协议规范中,控制器可以给交换机下发流表项来指导交换机处理匹配流表项的数据包…

ELK--收集日志demo

ELK--收集日志demo 安装ELK日志收集配置启动容器springboot配置测试 之前项目多实例部署的时候,由于请求被负载到任意节点,所以查看日志是开多个终端窗口。后来做了简单处理,将同一项目的多实例日志存入同一个文件,由于存在文件锁…

如何从相机的记忆棒(存储卡)中恢复丢失照片

当您意识到不小心从存储卡中删除了照片,或者错误地格式化了相机的记忆棒时,这些是您会大喊的前两个词。这是一种常见的情况,每个人在他们的一生中都会面临它。幸运的是,有一些方法可以从相机的 RAW 记忆棒(存储卡&…

【专题总结】【一文解决】C++多继承下的构造函数执行顺序

多继承下的构造函数执行顺序 派生类构造函数执行顺序如下 ①调用基类构造函数→调用顺序按它们被继承时【从左至右】被说明的次序 ②调用子对象的构造函数→调用顺序按它们在【类中说明次序】 ③调用派生类的构造函数 【典型题1】13浙工大卷二读程序4题 【分析】下面①classC:p…

C语言指针详解与应用(不断更新)

指针简介 指针(Pointer)是C语言的一个重要知识点,其使用灵活、功能强大,是C语言的灵魂 指针与底层硬件联系紧密,使用指针可操作数据的地址,实现数据的间接访问 指针生活实例化 指针的本质是地址,在生活中比如你取快…

当年掏空身体的9款怀旧软件,满满回忆杀

有个网站掀起了一股怀旧软件的风潮,让人惊喜地发现,尽管许多软件已不再更新,但时至今日,部分软件依然能够正常运行。 想当年,电脑价格贵的很,一但有机会接触电脑,那就是全神贯注,以…

仕考网:国考省考考试内容区别

国考和省考备考内容有一定的相似之处,具体考哪些内容你了解多少?中仕为大家分享一下吧! 题量: ①国考:行测一般有130-135道题目; ②省考:题量大多在120道左右,胳臂省份不同; 常识判断: ①国考&#x…

latex打出邮箱图标和可点击的orcidID

如图所示: 邮箱的打法 \usepackage{bbding} \inst{(}\Envelope\inst{)}orcidID的打法 \newcommand{\myorcidID}[1]{\href{https://orcid.org/#1}{\includegraphics[width8pt]{res/orcid.png}}} \captionsetup[algorithm]{skip5pt} \definecolor{customblue}{RGB}{…

使用 Colly 在 Golang 中进行网页抓取的步骤

什么是 Colly? Go 是一种用途广泛的语言,它拥有可以完成几乎所有工作的包和框架。 今天,我们将使用一个名为 Colly 的框架,它是一个用 Go 语言编写的、高效且强大的网页抓取框架,用于从网络上抓取数据。它提供了一个…

IPD的定义和三大重组

目前,业界对IPD的一般理解是:IPD——Integrated Product Development(集成产品开发)是一套领先的、成熟的产品开发的管理思想、模式和方法。它是根据大量成功的产品开发管理实践总结出来的,并被大量实践证明的高效的研…

Oracle 配置恢复目录catalog

一.介绍 Oracle中使用RMAN备份的数据我们分为两类 RMAN知识库数据库的数据块 Oracle默认把 RMAN知识库 放在目标数据库的控制文件中,在以后进行恢复的时候 我们要先读知识库的信息然后才能恢复。 但这样就产生了一个问题,知识库放在了控制文件上&#xf…