深圳 外贸 网站建设 龙,wordpress模板排行榜,网站诊断与优化的作用,制作网站商关于作者#xff1a;CSDN内容合伙人、技术专家#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 #xff0c;擅长java后端、移动开发、人工智能等#xff0c;希望大家多多支持。 目录 一、导读二、概览三、案例分析3.1 使用memory-profiler3.2 使用 cp… 关于作者CSDN内容合伙人、技术专家 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 擅长java后端、移动开发、人工智能等希望大家多多支持。 目录 一、导读二、概览三、案例分析3.1 使用memory-profiler3.2 使用 cpu-profiler 四、 推荐阅读 一、导读
我们继续总结学习Java基础知识温故知新。
二、概览
内存抖动是指内存不稳定频繁分配和回收导致内存不稳定其表现形式为频繁GC
内存抖动可能会导致以下问题
性能下降由于频繁的内存分配和回收操作系统的性能会受到影响导致运行速度变慢。程序崩溃、OOM内存抖动可能导致内存分配错误或者内存泄漏导致程序崩溃或者运行不稳定。系统资源消耗内存抖动会增加系统资源的消耗包括内存和CPU的占用率可能导致系统负载增加。
内存抖动大部分都是由于频繁创建对象导致会占用大量内存同时会产生大量的内存碎片不连续的内存碎片很多情况下是无法被分配的。 从而导致OOM的产生。
要防止内存抖动可以采取以下几个方法和策略 合理规划内存分配在设计和编写代码时要合理规划内存的分配和释放避免频繁的内存分配和回收操作。可以使用对象池、缓冲区等技术来预先分配和管理一块内存减少内存分配的开销。 避免内存碎片内存碎片是指内存中存在一些被分割成小块的未被使用的空间。内存碎片会导致内存分配失败或效率低下。可以通过使用内存池、内存复用等方法来减少内存碎片的产生。另外考虑使用内存管理工具或垃圾回收机制来自动进行内存碎片整理和回收。 优化算法和数据结构一些算法和数据结构可能会导致内存抖动例如频繁的动态数组扩容和收缩操作。可以使用更合适的数据结构或算法降低内存抖动的概率或频率。比如使用链表代替数组使用平衡二叉树代替线性查找等。 设置适当的内存分配策略根据实际情况可以根据内存使用情况和需求设置合适的内存分配策略。可以使用内存池、内存缓存等技术来预先分配和管理内存减少频繁的内存分配与回收操作。 进行内存性能优化对于大型或长时间运行的应用程序可以进行内存性能优化。可以使用内存分析工具和性能分析工具来检测内存使用情况找出内存抖动的原因并针对性地进行优化。 进行定期的内存测试和性能评估定期进行内存测试和性能评估可以发现潜在的内存抖动问题并进行及时修复和优化。
三、案例分析
不同的工具有不同的使用场景对应线下场景我们先用 android studio自带的工具
3.1 使用memory-profiler
可以直观的展示内存使用情况我们先上一段代码来模拟内存申请及释放
public class MainActivity extends AppCompatActivity {// Used to load the example library on application startup.static {System.loadLibrary(example);}private static Handler mHandler new Handler() {Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);// 循环1000次for (int index 0; index 1000; index){// 然后弄一个相对耗内存的操作制造内存抖动String args[] new String[1000000];}mHandler.sendEmptyMessageDelayed(0,50);}};private ActivityMainBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv binding.sampleText;tv.setText(stringFromJNI());tv.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {mHandler.sendEmptyMessageDelayed(0,2000);}});}/*** A native method that is implemented by the example native library,* which is packaged with this application.*/public native String stringFromJNI();
}代码运行后我们进行内存的保存快速查看Java 和 Kotlin 分配情况分析 通过上面的图我们可以看到在频繁的gc
那我们怎么才能知道内存抖动真正发生在哪里呢看上图string数组非常多我们点一下这个string数组如下图 上面就出现了一个Call Stack 标签页显示该实例被分配到何处以及在哪个线程中我们可以明显的看到 handlemessage 然后右键选择jump to source之间跳转到源码查看。
Allocations: 此类创建的实例对象数量 Total count对象在堆中未被回收的数量
3.2 使用 cpu-profiler
使用方式跟上面差不错我们保存文件然后查看 跟踪这一段CPU执行的时间 如果发现某一段应用自有函数的调用代码即绿色的条形段在反复地被执行便是内存抖动的地方 四、 推荐阅读
Java 专栏
SQL 专栏
数据结构与算法
Android学习专栏