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位数据类型,如int
、float
或对象引用;64位数据类型,如long
和double
,则占用两个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内存管理的掌握将成为开发者技能树上的重要一环。
相关文章:

Java核心篇之JVM探秘:内存模型与管理初探
系列文章目录 第一章 Java核心篇之JVM探秘:内存模型与管理初探 第二章 Java核心篇之JVM探秘:对象创建与内存分配机制 第三章 Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战:Arthas工具使用及…...

未来互联网的新篇章:深度解析Facebook的技术与战略
随着科技的飞速发展和社会的不断变迁,互联网作为全球信息交流的重要平台,正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一,Facebook不仅是人们沟通、分享和互动的重要场所,更是科技创新和数字化进程的推动者。本文…...

MySQL卸载 - Windows版
MySQL卸载 - Windows版 1. 停止MySQL服务 winR 打开运行,输入 services.msc 点击 “确定” 调出系统服务。 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数据存放目录是在 …...

Java核心篇之JVM探秘:对象创建与内存分配机制
系列文章目录 第一章 Java核心篇之JVM探秘:内存模型与管理初探 第二章 Java核心篇之JVM探秘:对象创建与内存分配机制 第三章 Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战:Arthas工具使用及…...

Nuxt框架中内置组件详解及使用指南(五)
title: Nuxt框架中内置组件详解及使用指南(五) date: 2024/7/10 updated: 2024/7/10 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt框架中和组件的使用方法与配置,包括安装、基本用法、属性详解、示例代码以及高级功能如…...

python开发遇到的坑汇总
文章目录 1.点击导入操作,所有配置全没了 1.点击导入操作,所有配置全没了 在 PyCharm 中,如果你遇到了点击导入(import)操作后,项目似乎进行了重新安装或重新部署的情况,这通常不是由简单的导入…...

【线性表,线性表中的顺序表和链表】
目录 1、线性表的定义和基本操作1.1、线性表的定义1.2、线性表的基本操作 2、顺序表和链表的比较2.1、顺序表2.1.1、顺序表的定义和特点2.1.2、顺序表的实现(1)顺序表的静态分配:(2)顺序表的动态分配 2.1.3、顺序表的基…...

46 mysql 客户端拿不到具体的错误信息
前言 这是最近碰到的一个问题 同样的一个 环境的问题, 在正常的 mysql 环境会返回 具体的错误信息, 然后 在我的另外一个环境里面 只能返回一些 unknown error 之类的 十分抽象的环境 然后 我们这里 来看一下 具体的情况 我们这里从 错误的环境 往前推导 来查看 并解决这个…...

Java语言程序设计——篇三(2)
循环结构 概述1️⃣while循环例题讲解 2️⃣do-while循环例题讲解 🚩while循环与do-while循环区别3️⃣for循环例题讲解 4️⃣循环的嵌套🏮例题讲解 概述 ⭐️Java语言提供了4种循环结构: (1) while循环 (2) do-while循环 (3) for循环 (4)增…...

如何实现一个分布式锁
如何实现一个分布式锁 本篇内容主要介绍如何使用 Java 语言实现一个注解式的分布式锁,主要是通过注解AOP 环绕通知来实现。 1. 锁注解 我们首先写一个锁的注解 /*** 分布式锁注解*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documente…...

Ajax从零到实战
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

编程参考 - 在C++移动构造函数声明中使用noexcept
在 C 中,noexcept 是用于表示函数不抛出异常的指定符。它既可用于常规函数,也可用于特殊成员函数,包括构造函数和析构函数。使用 noexcept 可以帮助编译器进行优化,提高代码的安全性和正确性。 In C, noexcept is a specifier use…...

Vue2/Vue3实现全局/局部添加防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。
水印目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识别:水印可以用作作者或品牌的标识符,使观众能够轻松识…...

GuLi商城-商品服务-API-属性分组-获取分类属性分组
获取分类属性分组接口开发 操作的是这张表 造数据: 后台代码: @Override public PageUtils queryPage(Map<String, Object> params, Long catelogId) {//select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like %key%)Stri…...

安全测试理论
安全测试理论 什么是安全测试? 安全测试:发现系统安全隐患的过程安全测试与传统测试区别 传统测试:发现bug为目的 安全测试:发现系统安全隐患什么是渗透测试 渗透测试:已成功入侵系统为目标的的攻击过程渗透测试与安全…...

序列化和反序列化
面试题:对序列化和反序列化的理解? 我们之所以需要序列化,它核心的目的是为了解决网络通信之间的对象传输的问题,也就是说,如何把当前JVM进程的一个对象,通过跨网络传输到另一个JVM进程里面,而序…...

OpenCV中使用Canny算法在图像中查找边缘
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出,旨在寻找给定噪声条件下的最佳边…...

基于springboot+vue+uniapp的机电公司管理信息系统
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...

电子期刊制作实战教程:从零开始制作
随着互联网的普及,电子期刊已经成为了信息传递的重要载体。它以便捷、环保、互动性强等特点受到了越来越多人的青睐。那么,如何从零开始制作一份吸引人的电子期刊呢? 1.要制作电子杂志,首先需要选择一款适合自己的软件。比如FLBOOK在线制作…...

11.FreeRTOS_事件组
事件组概述 事件组的作用: 可以等待某一个事件发生可以等待若干个事件发生可以等待若干个事件中的某一个事件发生 同步点是事件组的另一个使用方式,它可以让多个任务进行阻塞等待,当全部事件完成后,再一起解除任务的阻塞。常常…...

Python爬虫-爬取三国演义文本数据-bs4
bs4进行数据解析 -数据解析的原理: - 1.标签定位 -2.提取标签、标签属性中存储的数据值 - bs4数据解析的原理: - 1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中 -2.通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取 - 环境安装: - pi…...

html5——列表、表格
目录 列表 无序列表 有序列表 自定义列表 表格 基本结构 示例 表格的跨列 表格的跨行 列表 无序列表 <ul>【声明无序列表】 <li>河间驴肉火烧</li>【声明列表项】 <li>唐山棋子烧饼</li> <li>邯郸豆沫</li> <l…...

【Python字符串攻略】:玩转文字,编织程序的叙事艺术
文章目录 🚀一.字符串基础🌈二.查看数据类型⭐三.转化❤️四.字符串索引🚲五.字符串切片🎬六.字符串切片-步长☔七.反向切片注意事项🚲八.字符串💥查💥改💥删 ❤️九.字符串拼接&…...

element form表单中密码框被自动赋值,并默认背景色为白色,手动输值后背景色才是自己配置的背景色,与表单的自动填充有关
事件背景: 一个表单,有两组需要输入密码的地方,两组都被填充用户名密码,其中一组是其他信息,不是用户名密码,也被填充了,且input背景色是白色,表单中的input已经手动配置为无背景色&…...

【UE5.1 角色练习】15-枪械射击——子弹发射物
目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中(【UE5.1 角色练习】06-角色发射火球-part1)我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”,用于表示…...

Zynq7000系列FPGA中的DMA控制器的编程限制
有关DMAC编程时适用的限制信息,有四个考虑因素: 固定非对齐突发Endian swap size restrictions:在数据传输或处理过程中,不同字节序(Endian)之间的转换和对应的限制在DMA周期内更新通道控制寄存器当MFIFO满…...

超简易高效的 AI绘图工具—与sd-webui一致界面,6G显存最高提升75%出图速率!(附安装包)
大家好,我是灵魂画师向阳 今天给大家分享一个基于Stable Diffusion WebUI 构建的AI绘图工具—sd-webui-forge,该工具的目标在于简化插件开发,优化资源管理,加速推理。 Forge承诺永远不会对Stable Diffusion WebUI用户界面添加不…...

ArduPilot开源代码之OpticalFlow_backend
ArduPilot开源代码之OpticalFlow_backend 1. 源由2. Library设计3. 重要例程3.1 OpticalFlow_backend::_update_frontend3.2 OpticalFlow_backend::_applyYaw 4. 总结5. 参考资料 1. 源由 光流计是一种低成本定位传感器,所有的光流计设备传感驱动代码抽象公共部分统…...

设计模式探索:适配器模式
1. 适配器模式介绍 1.1 适配器模式介绍 适配器模式(adapter pattern)的原始定义是:将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。 适配器模式的主要作用是把原本不兼容的接口,…...

OpenCV 寻找棋盘格角点及绘制
目录 一、概念 二、代码 2.1实现步骤 2.2完整代码 三、实现效果 一、概念 寻找棋盘格角点(Checkerboard Corners)是计算机视觉中相机标定(Camera Calibration)过程的重要步骤。 OpenCV 提供了函数 cv2.findChessboardCorners…...