工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,内存优化和性能调优就成了我惯用的“伎俩”。
要对Java程序进行内存优化和性能调优,不了解虚拟机的内部原理(或者叫规范更严谨一点)是肯定不行的,这里推荐一本好书《深入Java虚拟机(第二版)》(Bill Venners著,曹晓刚 蒋靖 译,实际上本文正是作者阅读本书之后,对Java虚拟机的个人理解阐述)。当然了,了解Java虚拟机的好处并不仅限于上述两点好处。从更深一点的技术层面上看,了解Java虚拟机的规范和实现,将更加有助于我们编写高效、稳定的Java代码。比如,假如了解Java虚拟机的内存模型,了解虚拟机的内存回收机制,那么我们就不会过分依赖它,而会在需要的时候显式的"释放内存"(Java代码不能显式释放内存,但是可以通过释放对象引用告知垃圾回收器回收该对象需要被回收),以降低不必要的内存消耗;假如我们了解Java栈的工作原理,那么我们就可以通过减少递归层数,减少循环次数来降低堆栈溢出的风险。可能对于应用开发人员来说,可能不会直接去涉及这些Java虚拟机底层实现的工作,但是了解这些背景知识,或多或少,都会对我们写的程序产生潜移默化的好的影响。
本篇文章,将简明扼要的说明Java虚拟机的体系结构和内存模型,如有用词不妥或解释不准确之处,请不吝指正,深感荣幸!
Java 虚拟机体系结构
类装载子系统
Java虚拟机有两种类装载器,分别是启动类装载器和用户自定义装载器。
通类装载子系统通过类的全限定名(包名和类名,网络装载还包括 URL)将 Class 装载进运行时数据区。对于每一个被装载的类型,Java虚拟机都会创建一个java.lang.Class类的实例来代表该类型,该实例被放在内存中的堆区,而装载的类型信息则位于方法区,这一点和所有其他对象都是一样的。
类装载子系统在装载一个类型前,除了要定位和导入对应的二进制class文件外,还要验证导入类的正确性,为类变量分配并初始化内存,以及解析符号引用为直接引用,这些动作严格按照以下顺序进行:
装载——查找并装载类型的二进制数据;
连接——执行验证,准备以及解析(可选)
验证 确保被导入类型的正确性
准备 为类变量分配内存,并将其初始化为默认值
解析 把类型中的符号引用转换为直接应用
方法区
对于每一个被类装载子系统装载的类型,虚拟机都会保存下列数据到方法区:
类型的全限定名
类型超类的全限定名(java.lang.Object没有超类)
类型是类类型还是接口类型
类型的访问修饰符
任何直接超接口的全限定名有序列表
除了上述基本类型信息,还将保存如下信息:
类型的常量池
字段信息(包括字段名、字段类型、字段修饰符)
方法信息(包括方法名、返回类型、参数的数量和类型、方法修饰符,如果方法不是抽象和本地的,还将保存方法的字节码、操作数栈和该方法栈帧中的局部变量区的大小和异常表)
常量以外的所有类变量(其实就是类的静态变量,因为静态变量是所有实例共享的,且与类型直接相关,所以他们是类一级的变量,作为类的成员被保存在方法区)
一个到类ClassLoader的引用
-
-
String.class.getClassLoader();
//返回的就是刚才保存的ClassLoader引用 String.class.getClassLoader();
一个到Class类的引用
//将返回刚才保存的Class类的引用 String.class;
注意,方法区也是可以被垃圾回收器回收的,当一个类型不再被引用且方法区内存不足时,虚拟机将卸载该类型,回收内存。
堆
Java程序在运行时创建的所有类实例或数组都放在同一个堆中,而每一个Java虚拟机也只有一个堆空间,所有线程将共享这一个堆(这就是一个多线程的Java程序会产生对象访问的同步问题的原因了)。
由于每一种Java虚拟机都有对虚拟机规范的不同实现,所以我们可能不知道每一种Java虚拟机在堆中是以何种形式表示对象实例的,不过我们可以通过下面这可能的实现来一窥端倪:
程序计数器
对于运行中的Java程序而言,每一个线程都有自己的PC(程序计数器)寄存器,它是在该线程启动时创建的,大小为一个字长,用来保存需要被执行的下一行代码的位置。
Java栈
每一个线程都有一个Java栈,以栈帧为单位保存线程的运行状态。虚拟机对Java栈的操作有两种:压栈和出栈,二者都已帧为单位。栈帧保存了传入参数、局部变量、中间运算结果等数据,在方法完成时被弹出,然后释放。
看一下两个局部变量相加时栈帧的内存快照
本地方法栈
这是 Java 调用操作系统本地库的地方,用来实现 JNI(Java Native Interface,Java 本地接口)
执行引擎
Java虚拟机的核心,控制装入 Java 字节码并解析;对于运行中的Java程序而言,每一个线程都是一个独立的虚拟机执行引擎的实例,从线程生命周期的开始到结束,他要么在执行字节码,要么在执行本地方法。
本地接口
连接了本地方法栈和操作系统库。
注:文中所有提到"Java虚拟机"的地方都是指"JavaEE和JavaSE平台的Java虚拟机规范"。
分享到:
相关推荐
【PHP入门】 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,尤其适用于Web开发,能够嵌入HTML中。本篇笔记基于韩顺平老师的讲解,全面覆盖了从基础到精通的PHP知识体系。 1. **HTML基础** HTML,即超文本标记语言,用于创建网页内容。它包括各种标签来定义网页结构,如`<html>`、`<head>`、`<body>`等。HTML与CSS结合使用,可以实现页面样式控制。HTML5作为最新版本,引入了更多增强功能,如离线存储、拖放功能和媒体元素等。运行HTML有两种方式:本地运行(直接通过浏览器打开文件)和远程访问(通过HTTP协议在服务器上运行)。 2. **动态网页技术** 动态网页能够根据用户输入或服务器状态变化实时更新内容。PHP作为动态网页开发的重要技术之一,具有跨平台、安全性高、效率好、成本低、易于学习和丰富的开源社区支持等优点。PHP可以连接多种数据库,如MySQL,并在PHP4、PHP5和PHP6(及后续版本)中逐。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7% 两种标签: Good,Bad 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 详情查看地址:https://backend.blog.csdn.net/article/details/144983881
总务科(基建办)2024年工作总结.doc
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
广东省高清卫星地图全图
本文聚焦智能聊天机器人于电商客服领域的应用,开篇点明研究背景,剖析电商发展促使客服需求暴增,传统客服乏力,智能机器人应运而生。接着详述电商客服发展脉络、现存痛点,如高峰拥堵、知识滞后、服务同质化等。核心技术涵盖自然语言处理、机器学习、知识图谱,系统采用微服务架构,各模块分工协作。开发流程包括精细调研、多元数据采集、模型选型调优等。创新应用体现于售前精准导购、沉浸式营销,售中订单跟踪、答疑,售后问题处理与回访。经量化指标与用户调研评估成效显著,虽有挑战,但未来借助新技术有望重塑电商服务生态,助力企业与消费者双赢。
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
eap2025010741566905-1-1.pdf
双馈风机MATLAB simulink模型 多个模型打包发送
给小孩找的,看着还不错,分享出来~
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
bcolz-1.2.1-cp38-cp38-win-amd64.whl.rar
内容概要:本文详尽阐述了自动驾驶技术中的域控制单元(DCU)及其重要性。首先介绍了ADAS(高级驾驶辅助系统)和AD(自动驾驶)的区别和发展现状。接着讨论了域控制单元作为高级ECU,在自动驾驶系统中扮演的重要角色,包括高性能计算、高效的数据处理能力和与其他子系统的紧密配合。文中详细解释了DCU的构成元素——收发器、SoC、MCU和电源管理等模块的工作原理和技术细节,同时也探讨了市场趋势和技术发展趋势,如高集成度、智能化、低功耗等方面。最后展望了DCU在未来域集中式EE架构下的广阔应用前景。 适用人群:从事汽车工程、自动驾驶技术和嵌入式软件开发的专业技术人员,以及对此领域感兴趣的科研工作者。 使用场景及目标:①帮助开发者深入了解自动驾驶系统组成尤其是DCU的设计理念和技术特征;②指导相关领域的研究者把握当前行业发展动态和技术前沿。 其他说明:本文不仅深入浅出地讲解了专业知识,而且引用了一些作者个人感悟的文字,增加了可读性和启发性。
内容概要:文章主要介绍了Java和Python这两种流行的编程语言之间的区别和联系。首先详细讲述了Java的基本特性,包括跨平台性、面向对象编程、类型安全、自动化内存管理和多线程支持等特点,并概述了其在企业级开发中的广泛应用。接着深入探讨了Python的特点,指出它的简明语法、灵活性以及丰富的生态体系,特别提到了其在数据分析、人工智能等前沿领域的优势。文中还比较了两者的应用场景和技术实现方式的不同之处。最后为初学者提出了基于个人职业发展目标来选择编程语言的建议。 适合人群:对编程有兴趣的学生、编程新手以及想要转换编程方向的技术人员。 使用场景及目标:有助于读者理解两种编程语言各自的优劣,便于在实际工作中或者个人兴趣发展中做出明智的选择。 其他说明:通过对比讲解,不仅展示了两种编程语言的共同点,还强调了它们各自独特的优势所在。这有助于加深读者对其本质特征的认识,从而更好地应对不同类型的编程任务和挑战。
Java 飞机订票系统实训报告,有数据库
easy-interceptor修改请求头和响应头.zip
Python身份证识别系统源码(精准度非常高).zip,个人大三大作业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 Python身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
功能:利用深度学习模型(LSTM 网络)对电商用户咨询文本进行意图分类,相比简单规则匹配,能处理更复杂、语义模糊的文本,精准识别用户需求。 技术要点:使用 TensorFlow 构建 LSTM 模型,包括文本预处理将文本数字化,Embedding 层将数字映射为向量,LSTM 层捕捉序列特征,Dense 层输出分类结果,通过训练优化模型参数,实现准确意图识别。
国产银河麒麟V10和统信系统(linux)没有root用户的解决办法。如何在没有root用户的情况下,开通和启用root用户