首页 Java java教程 将 Java 应用程序的启动时间和内存占用量减少最多的策略

将 Java 应用程序的启动时间和内存占用量减少最多的策略

Nov 09, 2024 pm 10:52 PM

1.了解Java应用程序启动时间和内存占用

在我们开始讨论策略之前,让我们先了解启动时间和内存占用在 Java 应用程序的上下文中意味着什么。

1.1 什么是启动时间?

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

启动时间是指Java应用程序启动后到准备好处理请求所需的时间。对于快速部署和可用性至关重要的应用程序来说,最大限度地缩短启动时间至关重要。

1.2 什么是内存占用?

Java 应用程序的内存占用是其运行时消耗的内存量。较大的内存占用可能会导致更高的成本和增加的延迟,尤其是在云环境中。

2. 减少 Java 应用程序启动时间的技术

在这里,我们将探索各种方法来减少 Java 应用程序的启动时间。

2.1 启用类数据共享(CDS)

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

类数据共享(CDS)是一种允许 JVM 在多个 Java 进程之间共享公共类元数据的技术,从而减少加载类所需的时间。

示例:

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
登录后复制
登录后复制
登录后复制

此命令生成一个共享存档,可用于通过使用预加载的类更快地启动应用程序。

启用 CDS 可以减少大约 15% 的启动时间,具体取决于应用程序的复杂性。

2.2 使用 GraalVM 原生镜像

GraalVM 允许您将 Java 代码编译为本机二进制文件,通过避免 JVM 预热来显着减少启动时间。

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

GraalVM 是一种先进的多语言虚拟机,不仅支持多种语言,还提供用于优化 Java 应用程序的强大功能。 GraalVM 的突出功能之一是将 Java 应用程序编译为本机二进制文件的能力。此过程称为提前 (AOT) 编译,它带来了显着的性能优势,特别是在减少启动时间方面。

当您使用 GraalVM 的 Native Image 工具编译 Java 应用程序时,整个应用程序及其依赖项和 JVM 的必要部分将被编译为单个本机可执行文件。该可执行文件可以直接在操作系统上运行,无需 Java 虚拟机 (JVM) 来解释字节码。

示例:

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
登录后复制
登录后复制
登录后复制

此命令将您的应用程序转换为本机可执行文件,从而几乎瞬时启动。

使用 GraalVM Native Image 可以减少高达 90% 的启动时间,尽管这需要彻底的测试,因为它可能不支持所有 Java 功能。

2.3 AOT编译(提前)

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

AOT 编译涉及在应用程序运行之前将 Java 字节码提前翻译为本机机器代码。此过程生成一个可执行二进制文件,其中包括已编译的机器代码和任何必要的运行时组件。目标是消除或最小化应用程序启动和执行期间对 JIT 编译的需求。

在 AOT 编译过程中,Java 编译器或 GraalVM 的 Native Image 等专用工具会从 Java 源代码生成本机可执行文件。然后,使用该本机代码直接执行应用程序,无需 JVM 即时执行 JIT 编译。

示例:

native-image -jar myapp.jar
登录后复制
登录后复制

该命令预编译特定方法,减少 JIT 编译的时间。

AOT 可以减少大约 10% 的启动时间,特别是对于具有复杂初始化序列的应用程序。

2.4 优化类路径

减少类路径中的类和库的数量也有助于缩短启动时间。

示例 :使用 jlink 等工具创建自定义 JRE:

java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
登录后复制
登录后复制

这个自定义 JRE 仅包含您的应用程序所需的模块,从而减少了开销。

此优化可以通过消除加载不必要的类来减少 5-10% 的启动时间。

3. 减少 Java 应用程序内存占用的技术

减少内存占用对于扩展应用程序至关重要,尤其是在资源根据使用情况计费的云环境中。

3.1 使用G1垃圾收集器

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

G1 垃圾收集器旨在最大限度地减少暂停时间,并可以通过压缩活动对象来减少内存使用量。

示例

jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.sql --output custom-jre
登录后复制

此命令将 JVM 配置为使用具有优化堆设置的 G1 GC。

G1 GC 在具有大量实时数据的应用程序中可以减少高达 30% 的内存占用。

3.2 启用 JVM 内存调优

Strategies to Reduce the Startup Time and Memory Footprint of Your Java App by Up to

调整 JVM 内存设置(例如堆大小、堆栈大小和元空间)可以显着减少内存占用。

示例:

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
登录后复制
登录后复制
登录后复制

此命令微调堆和元空间设置以减少内存消耗。

仔细的内存调整可以使内存使用量减少 20-30%。

3.3 使用字符串去重

JVM 可以检测重复的字符串并在内存中仅存储一份副本,从而在应用程序使用许多相同的字符串时节省空间。

示例:

native-image -jar myapp.jar
登录后复制
登录后复制

此命令启用字符串去重,在存在许多重复字符串时减少内存使用。

字符串去重可以减少高达 10% 的内存使用量,特别是在文本较多的应用程序中。

3.4 减少不必要的对象创建

过多的对象创建会增加内存使用量。使用对象池或不可变对象来最大限度地减少不必要的分配。

示例:

java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
登录后复制
登录后复制

这种单例模式减少了应用程序生命周期中创建的对象数量。

减少对象创建可以减少 10-20% 的内存使用量,具体取决于应用程序的结构。

4. 结论

优化 Java 应用程序的启动时间和内存占用可以显着提高性能并节省成本。通过实施所讨论的策略(例如启用 CDS、使用 GraalVM、AOT 编译和内存调整),您可以实现所需的启动时间减少 60% 和内存使用量减少 50%。这些优化在云平台​​等资源受限的环境中特别有效。

请记住,每个应用程序都是独一无二的,因此必须在您的特定环境中测试这些策略,以确保它们提供预期结果。

如果您对这些技术有任何疑问或需要进一步说明,请随时在下面发表评论!

阅读更多帖子:将 Java 应用程序的启动时间和内存占用减少多达 60% 的策略

以上是将 Java 应用程序的启动时间和内存占用量减少最多的策略的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

如何利用Redis缓存方案高效实现产品排行榜列表的需求? 如何利用Redis缓存方案高效实现产品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...

See all articles