Java核心篇之JVM探秘:内存模型与管理初探

系列文章目录

第一章 Java核心篇之JVM探秘:内存模型与管理初探

第二章 Java核心篇之JVM探秘:对象创建与内存分配机制

第三章 Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器

第四章 Java核心篇之JVM调优实战:Arthas工具使用及GC日志分析


目录

前言

一、JVM整体结构图

二、JVM内存区域概述 

三、JVM内存参数设置

XX:PermSize 

-XX:MaxMetaspaceSize和-XX:MetaspaceSize 

三、垃圾回收(Garbage Collection)

分代收集理论:

垃圾回收算法:

四、内存溢出与内存泄漏

内存溢出:

内存泄漏:

总结


前言

        在Java的世界里,JVM(Java Virtual Machine)扮演着至关重要的角色。它不仅提供了运行Java程序的环境,还负责管理内存,确保程序的高效和安全执行。本文将深入探讨JVM内存模型,理解其内部结构与工作原理,帮助开发者更好地优化代码,避免常见的内存问题。


一、JVM整体结构图

二、JVM内存区域概述 

  • 程序计数器(Program Counter Register)

每个线程都有一个独立的程序计数器,用于指示当前线程所执行的字节码指令的位置。当线程被中断或恢复时,程序计数器可以帮助JVM找到上一次执行的位置。

  • 虚拟机栈(Virtual Machine Stack)

也是线程私有的,用于存储局部变量、操作数栈、动态链接和方法出口等信息。每个方法调用都会创建一个新的栈帧,方法退出后,相应的栈帧也会被销毁。

  • 本地方法栈(Native Method Stack)

与虚拟机栈类似,但用于支持本地(非Java)方法的调用。在现代JVM中,它往往与虚拟机栈合并,使用相同的实现方式。

  • Java堆(Heap)

所有线程共享的内存区域,用于存储对象实例和数组。这是垃圾收集的主要区域。Java堆是JVM管理的内存中最大的一块,它的大小可以通过参数进行配置。

  • 方法区(Method Area)

也称为“非堆”,用于存储类信息、常量、静态变量、即时编译后的代码等数据。它与Java堆一样,由所有线程共享。

  • 直接内存(Direct Memory)

不属于JVM内存的一部分,但是通过java.nio.ByteBuffer.allocateDirect()等API分配的内存。直接内存的使用需要特别注意,因为不受JVM的常规内存管理机制控制。

  • 局部变量表(Local Variable Table):

局部变量表用于存储方法参数和方法内部定义的局部变量。局部变量包括基本类型的变量、对象引用和返回地址等。

每个局部变量占据一个或多个“slot”(槽),一个slot可以存放一个32位数据类型,如intfloat或对象引用;64位数据类型,如longdouble,则占用两个slot。

变量的生存周期是从方法被调用开始直到方法结束,此时局部变量表的内容会被销毁。

  • 操作数栈(Operand Stack):

操作数栈是一个后进先出(LIFO)的数据结构,用于存放中间运算结果,同时也作为方法调用和返回的参数传递的场所。

当执行任何计算表达式时,操作数栈用来存放运算符的左右操作数,以及存放运算结果。

方法调用时,参数会被压入操作数栈,方法返回时,返回值会被放入操作数栈,然后传递给调用者。

  • 动态链接(Dynamic Linking):

动态链接是指将方法调用解析为方法在内存中的直接引用。在JVM中,当一个方法调用另一个方法时,它需要知道目标方法的确切位置,即其在内存中的入口点。

这个过程在运行时完成,允许方法在不同的类加载器之间动态查找和链接。

  • 方法出口(Method Exit):

方法出口指的是方法执行完毕后,如何清理现场并返回调用者的过程。这包括恢复上层方法的局部变量表和操作数栈,将返回值(如果有的话)压入调用者的操作数栈中,以及恢复方法调用之前的程序计数器值,以便继续执行调用者的方法。

三、JVM内存参数设置

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加到bin目录下的catalina文件中即可)

java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar

XX:PermSize 

在JDK 8之前,类的元数据(包括类信息、常量池、字段信息、方法信息等)是存储在永久代(Permanent Generation)中的。XX:PermSize 参数用于设置永久代的初始大小,而 -XX:MaxPermSize 则用于设置永久代的最大大小。如果永久代的空间不足,JVM 将会抛出 OutOfMemoryError: PermGen space 的错误。

-XX:MaxMetaspaceSize和-XX:MetaspaceSize 

从JDK 8开始,永久代被移除,类元数据被移到了一个名为“Metaspace”的本机内存区域中。这意味着类元数据的管理不再受限于堆内存的限制,而是受限于系统可用的物理内存。

  • -XX:MaxMetaspaceSize:用于设置Metaspace的最大大小。默认情况下,Metaspace可以使用系统的大部分物理内存,但这可能会导致其他应用程序的内存不足。因此,在多应用服务器环境中,通常需要显式地限制Metaspace的大小。

  • -XX:MetaspaceSize:用于设置Metaspace的起始大小。当Metaspace的使用量超过这个值时,JVM会尝试增加Metaspace的大小,直到达到-XX:MaxMetaspaceSize指定的上限。

三、垃圾回收(Garbage Collection)

        垃圾回收是JVM内存管理的核心机制之一。JVM通过自动检测不再被引用的对象,并回收这些对象占用的内存,从而避免了手动内存管理带来的问题,如内存泄漏和野指针。

分代收集理论

  • Java堆通常分为新生代(Young Generation)和老年代(Old Generation)。新生代又细分为Eden空间和两个Survivor空间(S0和S1)。对象首先在Eden空间创建,经过几次GC后,存活的对象会被移动到Survivor空间,最终可能晋升到老年代。

垃圾回收算法

  • 包括标记-清除(Mark-Sweep)、复制(Copying)、标记-压缩(Mark-Compact)和分代收集等算法。每种算法都有其优缺点,适用于不同的场景。

四、内存溢出与内存泄漏

尽管JVM提供了自动内存管理,但在实际开发中,仍需警惕内存溢出和内存泄漏的问题。

内存溢出

  • 当JVM无法申请到足够的内存空间时,会抛出OutOfMemoryError异常。这可能是由于堆大小设置不当、内存泄露或大对象过多导致的。

内存泄漏

  • 即应用程序中存在不再使用的对象,但由于某些原因(如循环引用)它们仍然被引用,导致垃圾收集器无法回收它们,从而浪费内存资源。

总结

        深入理解JVM内存模型对于Java开发者至关重要。它不仅有助于编写更高效的代码,还能有效预防和解决内存相关的问题。随着Java应用的复杂度不断增加,对JVM内存管理的掌握将成为开发者技能树上的重要一环。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防火墙NAT和智能选路实验详解(华为)

目录 实验概述实验拓扑实验要求要求一要求二要求三要求四要求五 实验概述 从我上面一个博客能够了解到NAT和防火墙选路原理 ——>防火墙nat和智能选路,这一章我通过实验来详解防火墙关于nat和智能选路从而能熟练使用和配置防火墙,这里使用的是华为US…

安防监控视频平台LntonCVS视频融合共享平台智慧消防实现远程集中视频监控方案

近年来,电力系统内变电站着火事件频发,这对消防安全管理提出了严峻挑战。我国消防安全基础设施不完善、管理机制不健全、应急处置能力不足及公众消防安全意识淡薄等问题,严重制约了消防安全的提升。因此,加强变电站的消防安全管理…

【Linux 文件读写描述符重定向 Linux 一切皆文件缓冲区】

文章目录 一、文件的读写操作二、文件描述符三、文件重定向四、理解 Linux 一切皆文件五、文件缓冲区 一、文件的读写操作 文件内容属性 当文件没有被操作的时候,一般文件还是在磁盘当中 文件操作文件内容的操作文件属性的操作,文件操作有可能即改变内容…

最新版智能修图-中文luminar ai 1.55(13797) 和 neo1.20,支持m芯片和intel芯片(绝对可用)

Luminar AI for macOS 完整版本 这个程序是第一个完全由人工智能驱动的图像编辑器。有了它,创建引人注目的照片是有趣的,令人惊讶的容易。它是一个独立的照片编辑器和macOS插件。 Luminar AI for macOS 轻轻地塑造和完善一个肖像打造富有表现力的眼睛…

Arduino PID整定

Arduino PID整定 Tuning an Arduino PID Introduction to Tuning an Arduino PID 例如,我们可能想把一箱水加热到华氏 100 度。 我们需要能够在不同的条件下实现这一目标,例如房间的环境(周围)温度。 此外,我们可能会…

WPF学习(6) -- WPF命令和通知

一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…

无损音乐播放器推荐:Audirvana for Mac 中文激活版

udirvana 是一款高品质的音乐播放软件,专为Mac操作系统设计。它被设计来提供音频播放的最高标准,支持多种音频格式,包括高达32位/192kHz的高分辨率音频。Audirvana Plus 是其高级版本,提供了更多的功能和优化,例如音频…

LabVIEW远程实验数据采集系统

随着科学研究的不断发展,实验室对远程数据采集和监控的需求越来越高。传统的数据采集方式往往需要实验人员亲临现场,费时费力,且数据实时性较差。为了解决这些问题,基于LabVIEW开发了一套远程实验数据采集系统,实现对实…

【深度学习入门篇 ⑤ 】PyTorch网络模型创建

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

0/1背包

0/1背包 背包问题是DP最经典的类型之一,而0/1背包是最经典最基础的背包问题。 一个背包体积为 v v v,现有 n n n种物品,第 i i i个物品对应体积为 c i c_i ci​,价值为 w i w_i wi​,每件物品最多可放1次,…

初识影刀:EXCEL根据部门筛选低值易耗品

第一次知道这个办公自动化的软件还是在招聘网站上,了解之后发现对于办公中重复性的工作还是挺有帮助的,特别是那些操作非EXCEL的重复性工作,当然用在EXCEL上更加方便,有些操作比写VBA便捷。 下面就是一个了解基本操作后&#xff…

如何追踪ping连接中的所有路由器的数量和IP

如何快速判断ping连接经过的路由器个数和IP? 方法一: ping命令会返回一个TTL,TTL(Time To Live)存活时间,一般初始值为64,每经过一个路由器就减一,当TTL为0时丢弃网络包&#xff0…

【深度学习】PyTorch深度学习笔记01-Overview

参考学习:B站视频【《PyTorch深度学习实践》完结合集】-刘二大人 ------------------------------------------------------------------------------------------------------- 1. 基于规则的深度学习 2. 经典的机器学习——手动提取一些简单的特征 3. 表示学习…

Linux问题解决

1、打开VMware Workstation,开启需要安装VMware Tools的虚拟机,在顶部选择菜单栏的虚拟机选项卡,点击“安装VMware Tools(T)”。 或者有时在底部会弹出提示框安装tools,点击安装也可以。 2、进入ubuntu系统后&#xff…

《Linux系统编程篇》vim的使用 ——基础篇

引言 上节课我们讲了,如何将虚拟机的用户目录映射到自己windows的z盘,虽然这样之后我们可以用自己的编译器比如说Visual Studio Code,或者其他方式去操作里面的文件,但是这是可搭建的情况下,在一些特殊情况下&#xf…

【Linux】数据流重定向

数据流重定向(redirect)由字面上的意思来看,好像就是将【数据给它定向到其他地方去】的样子? 没错,数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或…

4G LTE 教程 物理通道结构

https://www.artizanetworks.com/resources/tutorials/phy_cha.html 下行物理信道: 物理下行链路共享信道 (PDSCH) 承载 DL-SCH 和 PCH。DL-SCH 包含实际用户数据。物理下行链路控制信道 (PDCCH) 通知UEPCH和DL-SCH的资源分配情况,以及DL-SCH相关的HARQ…

tongweb8 使用命令行对应用进行操作(by lqw)

文章目录 声明思路和概念新增应用更新应用启动应用停止应用删除应用 声明 本帖只是做一些简单的应用查看,新增,启动,停止,删除操作,仅供参考,详细内容建议参考TongwebV8.0 命令行工具参考,生产…

InjectFix 热更新解决方案

简介 今天来谈一谈,项目种的客户端热更新解决方案。InjectFix是腾讯xlua团队出品的一种用于Unity中C#代码热更新热修复的解决方案。支持Unity全系列,全平台。与xlua的思路类似,InjectFix解决的痛点主要在于Unity中C#代码写的逻辑在发包之后无…

Python爬虫:基础爬虫架构及爬取证券之星全站行情数据!

爬虫成长之路(一)里我们介绍了如何爬取证券之星网站上所有A股数据,主要涉及网页获取和页面解析的知识。爬虫成长之路(二)里我们介绍了如何获取代理IP并验证,涉及了多线程编程和数据存储的知识。此次我们将在…