【后端秘籍】【JVM】第二篇

过去一年,工作忙碌,博客成了被遗忘的角落。时间飞逝,我决定重拾这段旅程,重新在这里记录我的思考与成长。
还是那句话,学起来:基础不牢,地动山摇。
写博客不仅是分享,更是与大家的连接。我希望通过这条渠道,找回那份灵感与激情。未来的日子,我会用心去记录,期待与每一位读者共同成长。关注我吧!

1.JVM 中的 Just-In-Time (JIT) 编译器的作用

JIT 编译器是 JVM 中的一个重要部分,负责将字节码即时转换为机器码,这个过程称为即时编译。JIT 的魔力在于它能显著提高程序的运行速度,编译后的代码可以直接在硬件上执行,而不需要依赖 JVM 的解释执行。

想象一下一个高并发的金融交易系统,每一笔交易都需要在毫秒级内完成。JIT 编译器能快速优化频繁执行的交易处理代码,将其转化为高效的机器码,从而加快交易速度,确保交易的及时性和准确性。同时,JIT 还可以根据程序的运行情况进行动态优化,比如内联函数和循环展开,进一步提升性能。

例如,在复杂的数学计算中,JIT 编译器能够识别出常用的计算代码并进行优化。它通过内联函数减少函数调用的开销,或通过循环展开减少循环控制的开销,从而提高执行效率。

2.JVM 调优的艺术

JVM 调优是一门复杂的艺术,涉及多个关键方面。调整堆大小是其中的重要步骤,通过设置 -Xmx 和 -Xms 参数,我们可以精确控制堆内存分配,避免内存溢出和频繁的垃圾回收。

选择合适的垃圾收集器也是至关重要的。不同的应用场景适合不同的垃圾收集器。例如,在线游戏需要快速响应,适合使用 CMS 或 G1 垃圾收集器;而处理大数据任务时,Parallel Scavenge 垃圾收集器则更为高效。此外,调整堆内不同区域的大小比例也会显著影响性能。

在实际调优过程中,结合应用的具体情况进行分析和调整非常重要。我们可以利用 JConsole、VisualVM 等监控工具,观察 JVM 的运行状态,找出性能瓶颈。例如,观察堆内存使用情况以判断是否存在内存泄漏,或通过监控垃圾回收的频率和停顿时间评估垃圾收集器的性能。

同时,根据应用特点进行针对性调优也是有效的。如果应用中存在大量短期对象,可以适当增大新生代的大小,以减少 Minor GC 的频率;如果存在大量长期存活对象,可以增大老年代的大小,以避免频繁的 Full GC。

3.如何在 JAVA 程序中触发 GC

在 Java 程序中,我们可以通过调用 System.gc() 或 Runtime.getRuntime().gc() 来建议 JVM 执行垃圾收集。但需要注意的是,这只是一个建议,JVM 何时执行垃圾收集并不确定。

在实际应用中,谨慎使用这种方式非常重要,频繁触发 GC 可能会对性能产生负面影响,尤其是 Full GC 可能导致较长的停顿时间。例如,在实时在线视频播放中,频繁触发 GC 可能导致视频卡顿,影响用户体验。因此,尽量通过合理的内存管理和垃圾回收策略来减少 GC 的频率。

4.类的主动使用和被动使用的区别

类的主动使用就像一场精彩的演出,包括创建实例、访问静态字段、调用静态方法、反射(例如 Class.forName(“com.example.MyClass”))和初始化子类等。这些行为会导致类的初始化,而被动使用则相对低调,比如通过子类引用父类的静态字段时,父类不会被初始化。

理解这两者的区别在复杂的程序架构中至关重要,可以帮助我们优化程序性能。在大型企业级应用中,识别主动和被动使用可以避免不必要的类初始化,从而减少内存占用和提高启动速度。

如果某个类很少被主动使用,可以考虑延迟加载,只有在需要时才初始化,以降低程序启动时的内存占用和初始化时间。

5.说一说内存泄漏和内存溢出

内存泄漏就像一个隐秘的陷阱,指的是程序已分配的内存未能释放,导致无法使用的内存逐渐增加。长时间的内存泄漏如同一个不断膨胀的气球,最终可能引发内存溢出。而内存溢出是指程序试图使用超过可用内存资源的情况,常见的错误有 OutOfMemoryError。

以繁忙的电商平台为例,内存泄漏可能导致性能逐渐下降,最终崩溃。如果在处理用户订单时未及时释放不再使用的内存,系统可用内存会减少,直至引发内存溢出。而内存溢出通常发生在高流量的促销活动中,当大量用户同时访问时,系统可能因内存不足而崩溃。

为了避免内存泄漏和内存溢出,编程时应养成良好习惯,如及时释放不再使用的资源,避免持有长时间的对象引用,以及合理设置 JVM 内存参数。

6.类加载器为什么采用双亲委派模型

双亲委派模型如同一座坚固的城堡,为类加载提供清晰的顺序。这一模型确保 Java 核心库的类型安全,避免不同版本的类冲突和重复加载,使得 JVM 保证全局范围内类的唯一性。

理解双亲委派模型对于构建稳定、可靠的应用程序至关重要。在企业级应用中,多个第三方库和框架的使用可能导致相同类被不同版本加载,若没有双亲委派模型,这会引发不可预测的错误。

此外,双亲委派模型也保障了类的安全性,恶意类无法通过自定义加载器加载 Java 核心库中的类,从而避免安全漏洞。

7.讲一讲 JAVA 对象的创建过程

创建 Java 对象的过程就像雕刻一件艺术品。首先,Java 会检查类是否已经加载和初始化,如果没有,就像为艺术家准备画布。接着,在堆内存中分配空间,初始化对象的成员变量为默认值,然后执行构造函数,就像艺术家用画笔为作品赋予生命,最后返回对象的引用,如同将艺术品展现给大家。

理解这个过程对于掌握 Java 的内存管理和对象生命周期非常重要。在多线程环境中,创建对象可能会受到线程安全问题的影响,比如多个线程同时创建同一个对象,可能导致数据不一致。因此,我们需要采取措施确保对象的创建过程是线程安全的。

同时,可以通过对象池技术来优化对象的创建和销毁,减少资源消耗,提高性能。

8.什么是强引用、软引用、弱引用和虚引用

在 Java 中,引用的类型有很多,主要包括四种:

  • 强引用:像坚固的铁链,只要强引用存在,对象就不会被垃圾回收。
  • 软引用:像温柔的丝带,只有在内存不足时才会被回收,适合用于实现内存敏感的缓存。
  • 弱引用:像脆弱的丝线,内存足够时也会被回收,生命周期比强引用和软引用短。
  • 虚引用:像幽灵的触摸,无法直接获取对象,随时可能被垃圾回收,并在被回收时发出通知。

理解这些引用类型可以帮助我们灵活管理内存。例如,在图片加载应用中,可以使用软引用来缓存图片。当内存紧张时,软引用会被回收。而在需要实时监控对象状态的应用中,虚引用可以用来接收对象被回收的通知,以便做出相应处理。

我们还可以结合不同引用类型,实现更复杂的内存管理策略,比如使用强引用和弱引用组合管理对象的生命周期。

9. Metaspace 与 PermGen 有什么区别
PermGen(永久代)就像一个古老的宝库,在 JDK 8 之前用于存储 JVM 加载的类信息。但它有一些问题,比如容易导致内存溢出,因为其大小有限。而 Metaspace(元空间)则是现代化的解决方案,自 JDK 8 起取代了 PermGen。它使用的是本地内存,默认大小仅受本地内存限制,更加灵活,不容易出现内存溢出问题。

就像从旧式宝库升级到现代仓库,Metaspace 更能适应大型分布式系统等复杂应用,支持加载大量类和资源。同时,Metaspace 还提高了性能和可管理性,避免了与 PermGen 相关的内存碎片和频繁垃圾回收的问题。

通过理解以上这些内容,大家可以更好地进行内存管理,提升 JAVA 应用的稳定性和性能。

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

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

相关文章

React中的hook

React中的hook究竟是什么? 有哪些hook? hook的两大规则 为什么hook要在顶层调用? hook的调用需要在每一次render后都按照一样的顺序进行调用,否则会出现类似“野指针”的情况,但是要做到这一步,就需要hook在…

新手直播方案

简介 新手直播方案 ,低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑(高成本方案) 直播推流方案 需要摄像头 方案一 :手机 电脑同步下载 网络摄像头 软件&#xff08…

spring整合使用xml方式整合Druid数据源连接池

1.普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求 一个,执行完成后再断…

【WIN】WIN10_WSL_Ubuntu18.04_ROS_rviz_docker

WIN10安装WSL Microsoft Store 安装编译套件 sudo apt-get install build-essential apt换源 Debian / Ubuntu 的官方源在国内访问很慢,咱们更换为清华大学 TUNA 的软件源镜像 执行下面命令,备份 apt 安装源: sudo cp /etc/apt/sources.l…

【问题解决】pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

今天配置完poetry环境变量之后pnpm不能用了 具体报错 pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1pnpm run dev~~~~ Ca…

计算机毕业设计Python+大模型租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 用到的技术: 1. python…

大一物联网要不要转专业,转不了该怎么办?

有幸在2014年,踩中了物联网的风口,坏消息,牛马的我,一口汤都没喝上。 依稀记得,当时市场部老大,带我去上海参加电子展会,印象最深的,一些物联网云平台,靠着一份精美PPT&a…

2024年项目管理新风向:敏捷开发与瀑布开发,哪个更优?

一、项目管理的多样格局 2024 年,项目管理领域展现出丰富多样的格局。数字化趋势愈发明显,项目管理软件普及度不断提高,据相关资料显示,随着云计算、大数据等技术的成熟,项目管理软件将更加普及,实现项目信…

OpenCV双目相机外参标定C++

基于OpenCV库实现双目测量系统外参标定过程。通过分析双目测量系统左右相机拍摄的棋盘格标定板图像,包括角点检测、立体标定、立体校正和畸变校正的步骤,获取左右相机的相对位置关系和姿态。 a.检测每张图像中的棋盘格角点,并进行亚像素级精…

Python游戏开发超详细(基础理论知识篇)

一、引导: Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python,你可以利用其强大的库和框架来创建各种类型的游戏,从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识,帮助你入门Python游戏开发。 二、理论知识…

使用Prometheus对微服务性能自定义指标监控

背景 随着云计算和容器化技术的不断发展,微服务架构逐渐成为现代软件开发的主流趋势。微服务架构将大型应用程序拆分成多个小型、独立的服务,每个服务都可以独立开发、部署和扩展。这种架构模式提高了系统的可伸缩性、灵活性和可靠性,但同时…

【数据结构和算法】三、动态规划原理讲解与实战演练

目录 1、什么是动态规划? 2、动态规划实战演练 2.1 力扣题之爬楼梯问题 (1)解题思路1: (2)解题思路2: (3)动态规划(DP):解题思路 (4&#x…

ArcGIS必会的选择要素方法(AND、OR、R、IN等)位置选择等

今天来看看ArcGIS中的几个选择的重要使用方法 1、常规选择、 2、模糊查询、 3、组合复合条件查询(AND、OR、IN), 4、空值NULL查询 5、位置选择 推荐学习: 以梦为马,超过万名学员学习ArcGIS入门到实战的应用课程…

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数,用于绘制数据框中的数据。它是基于 Matplotlib 库构建的,可以轻松地创建各种类型的图表,包括折线图、柱状图、散点…

【纯血鸿蒙】专项测试工具 DevEco Testing

DevEco Testing 为生态合作伙伴接入 HarmonyOS 生态提供专业的测试服务,共筑高品质的智能硬件产品。 云端服务平台面向开发者提供724 小时的远程多终端真机实验室,提供华为专业的应用安全隐私检测,提供基于华为真机的应用自动化测试。 访问地址:https://devecostudio.huawe…

线程的互斥与同步

目录 一、互斥 1、数据不一致问题 2、锁 3、饥饿问题 4、锁的原理 5、封装锁 6、抢票逻辑中加入封装的锁 7、可重入VS线程安全 8、死锁 二、同步 1、什么是同步 2、如何实现同步 3、条件变量 4、生产消费者问题 (1)CP问题 (2&am…

SLAM|2. 差异与统一:坐标系变换与外参标定

本章主要内容 1.坐标系变换 2.相机外参标定 上一章我们了解了相机内参的概念,内参主要解决三维世界与二维图像之间的映射关系。有了内参我们可以一定程度上还原相机看到了什么(但缺乏尺度)。但相机看到的数据只是处于相机坐标系,为…

C# Unity 同步/异步编程和多线程什么关系?async/await和coroutine又是什么?

目录 不用模板生成的目录怎么这么丑啊 1.同步?异步?多线程? 2.async/await和coroutine? 证明 单线程中的同步/异步 同 异 多线程中的同步异步 同 异 1.同步?异步?多线程? 首先&#…

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等

HTML/CSS 面试题 什么是语义化 HTML&#xff1f; 说明&#xff1a;语义化 HTML 使用 HTML 标签来描述内容的含义&#xff0c;而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性&#xff0c;并对 SEO 友好。示例&#xff1a; <header><h1>网站标题</h1&…

第二代 GPT-SoVITS V2:解锁语音克隆与合成的无限可能

在 AI 技术蓬勃发展的今天&#xff0c;第二代 GPT-SoVITS V2 如一颗璀璨的明星闪耀登场&#xff0c;为语音处理领域带来了前所未有的变革。它是一款集先进技术与强大功能于一身的声音克隆与语音合成工具&#xff0c;由 RVC 变声器创始人 “花儿不哭” 与 AI 音色转换技术 Sovit…