性能优化(一)堆内存分析

JVM堆内存优化与SpringBoot配置 在当今的软件开发领域,随着业务需求的日益复杂和系统规模的不断扩大,对于Java虚拟机(JVM)和Spring Boot框架的深入理解变得尤为重要。特别是在处理大数据量和高并发场景时,如何合理地设置JVM的堆内存参数,以优化Spring Boot应用程序的性能和稳定性,成为了开发人员必须面对的问题。场景问题:假设我们正在开发一个处理大规模用户数据的在线分析平台,该平台使用Spring Boot框架构建。由于数据量巨大,系统在运行一段时间后,频繁出现内存溢出错误,导致服务不可用。 阅读详情

题图.png

前言

通过Android Studio的Memory Monitor工具,对各种数据类型,如:boolean,int,float,long,SparseArray,HashMap等在内存的占用情况进行分析。对一些特定场景下的代码编写,如:String拼接,OnClickListener等所消耗的内存情况进行分析。通过分析,更好的了解了不同情况下堆内存是如何分配的,也确切验证了以往诸多的代码经验,为高效合理的利用内存奠定基础。

Memory Monitor的基本使用

  • 新建MainActivity,启动APP
public class MainActivity extends AppCompatActivity {
   
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 在 Android Monitor -> Monitors -> Memory 中,点击”initiate GC”,先手动GC一次,把没用的内存进行回收。
    step1_gc.png

  • 点击”Dump Java Heap”,生成.hprof(hprof文件为特定时间点,Java进程的内存快照)
    step2_dump.png

以下是根据.hprof文件生成的内存分析表,本文主要关注Shallow Size和Retained Size,其他column含义可以参考官方-HPROF Viewer and Analyzer
heap_nothing.png

Shallow Size和Retained Size

Shallow Size:该对象本身占有内存大小
Retained Size:释放该对象后,节省的内存大小
Dominating Size:管辖的内存大小,大部分情况和Retained一致

shalow_and_retain.png

因为可以通过GC Roots直接访问,所以左图的obj3不是蓝色节点;而右图却是蓝色,因为它已经被包含在 Retained size 中。

Shallow Size Retained Size(左) Retained Size(右)
obj1 obj1 obj1+obj2+obj4
obj2 obj2 obj2+obj4

案例分析

如图heap_nothing.png,在MainActivity在新建的时候,初始占用内存1776(以下案例分析基于红米note3机型)。

  • case 1:空对象TestModel+未初始化。
public class TestModel {
   
   
}

public class MainActivity extends AppCompatActivity {
   
   
    private TestModel mModel;
    ...onCreate()
}

case1_TestModel.png

只定义TestModel成员变量的情况下,内存占用1780=初始内存+引用类型(4)。所以在项目发版前,要把一些没有使用到的变量都清理一遍,积少成多,免得造成内存浪费。

  • case 2:空对象TestModel+初始化。
public class MainActivity extends AppCompatActivity {
   
   
    private TestModel mModel = new TestModel();
    ...onCreate()
}

性能优化——内存分析工具的使用 本文将介绍比较常用的的内存泄漏检测工具,包括HeapSnapShot、HeapViewer、MAT一、HeapSnapShot的使用HeapSnapShot意思是堆快照,通过堆内存的信息来分析内存泄漏的问题。1、启动HeapSnapShot2、显示Heap SnapShot面板点击截图部分的左上角,可以看到有个App heap,点开,里面还有Image heap、Zygote heap,分别代码a... 阅读详情

相关推荐

性能优化实战:从火焰图分析到JVM调优

火焰图分析和JVM调优是性能优化的两个重要方面。通过火焰图,开发者可以快速定位性能瓶颈;通过JVM调优,可以显著提升Java应用的性能和稳定性。在实际项目中,建议结合具体业务需求和系统环境,采取综合的性能优化策略,并持续监控和分析系统性能,以确保应用的高效运行。通过本文的实战分析,希望开发者能够更深入地了解火焰图分析和JVM调优的技巧和方法,为应用的性能优化提供有力的支持。

shejizuopin的博客 1022

堆内存管理与性能优化实战指南

堆内存是程序运行时动态分配内存的核心区域,其管理机制直接影响应用性能。通过链表管理空闲内存块实现动态扩展,开发者需手动控制生命周期或依赖垃圾回收机制。在多线程环境下,全局共享特性要求同步机制,而现代分配算法如Jemalloc能显著降低内存碎片。垃圾回收策略如CMS与G1各有优劣,合理配置可优化延迟。在Elasticsearch等场景中,堆内存配置需遵循特定原则以避免性能问题。通过对象池化与堆外内存技术,可进一步提升系统吞吐量与稳定性。

weixin_31102231的博客 248

MAT堆内存分析工具实战指南

MAT(Memory Analyzer Tool)是一款专为Java应用设计的内存分析工具,广泛用于检测内存泄漏、分析堆内存使用情况及优化内存性能。它由Eclipse基金会维护,具备跨平台支持能力,适用于Windows、Linux和macOS系统。相比其他内存分析工具如JVisualVM和JProfiler,MAT在对象引用链分析、内存快照对比、以及内存泄漏自动检测方面表现出更强的专业性和高效性。通过解析Heap Dump文件,MAT能快速定位内存瓶颈,辅助开发人员精准优化Java应用的内存使用效率。

weixin_34535286的博客 1294

AD20/Altium designer——元器件批量命名与编号的高效技巧

本文详细介绍了在AD20/Altium Designer中实现元器件批量命名与编号的高效技巧。通过解析核心的“原理图标注”功能,从基础全局操作到进阶的按模块分区、利用标识符及合并BOM等智能方法,帮助硬件工程师彻底告别手动编号,大幅提升设计效率与文档规范性,并融入了一套完整的实战工作流。

whisky的博客 569

【全新官方接口】php检测微信域名拦截,检测微信域名被封

你的域名在微信被拦截的3种常见情况 1、域名因违规或有风险被拦截(红色拦截) 2、类似taobao.com,douyin.com这种的恶意竞争式拦截,淘宝、抖音等微信的竞争对手一般都是白色拦截(白色拦截) 3、有一个中间页的拦截,需要多次点击按钮才可以跳转到你的域名的,多是一些新型域名后缀,例如.top .xyz .link后缀,这种情况,备案后可以解决(备案拦截) 通过php get_headers()函数就可以分析到结果 这个下标为6是一个URL,在微信访问后正是这个讨厌的页面! 如果切换为

TANKING,开源开发者! 2880

博客系统 - 系统简介与首页设计

用Bootstrap实现手机端的博客导航栏效果。

m0_53450409的博客 1238

在 Windows 上安装 OpenCV – C++ / Python

而且,安装并不是一件容易的事。这些安装程序仅适用于安装 OpenCV for C++。如果您想安装适用于 Python 的 OpenCV,您将在博客后面找到相关信息。在这篇博文中,我们将在 Windows 上安装适用于 C++ 和 Python 的 OpenCV。C++ 安装是在自定义安装 exe 文件的帮助下完成的。而Python的安装是通过Anaconda完成的。从源代码安装 OpenCV 需要花费大量时间。根据您的硬件和安装配置,该过程可能需要 5 分钟到 2 小时不等。

Demondai999的博客 2092

el-upload自定义上传dwg/dxf文件并且携带额外参数(CAD)

需求:需要使用el-upload自定义上传cad的图片或普通图片,这边需要判断区分下,以及上传后清空上传文件列表。

请叫我欧皇!的博客 1535

STM32串口控制LED灯的亮灭

STM32中的串口控制LED灯的亮灭,分为两种方式,一种是直接发送数字0和1来控制灯的亮灭,另一种是通过发送字符串来控制。 我所使用的开发板主控芯片是STM32F401RET6,主频84MHz, 首先要进行串口的初始化: /* 函数功能:串口的初始化 函数名:Usart_Init 返回值:无 参数:u32 brr 备注: USART1_TXD->PA9 USART1_RXD->PA10 */ void Usart_Init(u32 brr) { float div; u16 div

博客 2万+

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoint有诸多细节需要优化,特此整理成技术文档。本文档描述了实验pytorch-superpoint与pytorch-superglue项目训练自己的图像配准模型。

a486259的博客 9507

ABAP 后台作业里的消息机制:把 MESSAGE 写对,避免作业莫名取消

SAP后台作业消息处理机制解析 本文深入剖析了SAP系统中后台作业的消息处理机制,揭示了前台与后台执行环境的关键差异。核心发现包括: 后台作业对消息的处理规则: 所有消息写入Job log而不显示 根据消息类型决定是否继续执行 W警告在列表处理阶段会被自动转为E错误 关键异常处理: 通过error_message可捕获E/A类型消息 A类型消息会触发隐式数据库回滚 未被捕获的E/A消息将导致作业中断 实用解决方案: 将业务提示改为S或I类型 使用DISPLAY LIKE保持前台体验 通过error_mess

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2221

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 6.0运行时权限的总结与实践
listen2code
博客等级 码龄10年 7粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值