Java的内存回收——内存管理小技巧

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配) 本文详细解析了STM32驱动ADXL345传感器的全流程,包括IIC和SPI双模式适配、硬件连接、寄存器配置及数据采集处理。通过实战代码示例和常见问题排查指南,帮助开发者快速实现高精度加速度数据采集,适用于运动检测、姿态识别等多种嵌入式应用场景。 阅读详情

4、内存管理小技巧

4、1 尽量使用直接量

       当需要使用字符串,还有Byte、Short、Integer、Long、Float、Double、Boolean、Character包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建它们。
       例如,程序需要"hello"字符串,应该采用如下代码:
     String str = "hello";
      上面方式会创建一个"hello"字符串,而且JVM的字符串缓存池还会缓存这个字符串。但是如果程序使用如下代码:
     String str = new String("hello");
      此时程序同样创建了一个缓存在字符串缓存池中的"hello"字符串。除此之外,str所引用的String对象底层还包含了一个char[]数组,这个char[]数组里依次存放了h、e、l、l、o等字符串。

4、2 使用StringBuilder和StringBuffer进行字符串连接

       String、StringBuilder、StringBuffer都可以代表字符串,其中String代表字符序列不可变的字符串,而StringBuilder、StringBuffer都代表字符串序列可变的字符串。
       如果程序使用多个String对象进行字符串连接运算,在运行时将生成大量的临时字符串,这些字符串会保存在内存中从而导致程序性能下降。

4、3 尽早释放无用对象的引用

       大部分时候,方法的局部引用变量所引用的对象会随着方法的结束而变成垃圾,因为局部变量的生存期限很短,当方法运行结束时,该方法内的局部变量就结束了生存期限。因此,大部分时候程序无须将局部变量显示设为null,但是有时候涉及到消耗内存的部分则需要显示的设置为null。

4、4 尽量少用静态变量

       从理论上来说,Java对象何时被回收由垃圾回收机制决定,对程序员来说是不确定的。由于垃圾回收机制判断一个对象是否是垃圾的唯一标准就是该对象是否有引用变量引用它,因此推荐尽早释放对象的引用。
       最坏的情况是,某个对象被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存。示例如下:
     class Person {
         static Object obj = new Object();
     }
       对于上面的Object对象而言,只要obj变量还引用到它,它就不会被垃圾回收机制所回收。obj变量是Person类的静态变量,因此它的生命周期与Person类同步。在Person类不被卸载的情况下,Person类对应的Class对象会常驻内存,直到程序运行结束。因此,obj所引用的Object对象一旦创建,也会常驻内存,直到程序运行结束。
提示:根据分代回收机制,JVM会将程序中Person类的信息存入Permanent代。也就是说,Person类、obj引用变量都将存在Permanent代里,这将导致obj对象一直有效,从而使得obj所引用的Object得不到回收。

4、5 避免在经常调用的方法、循环中创建Java对象

       经常调用的方法和循环有一个共同的特征:这些代码段会被多次重复调用。
     public class Test {
        public static void main(String[] args) {
           for(int i = 0 ; i < 10 ; i ++) {
              Object obj = new Object();
              //执行其他操作...
           }
        }
     }
       上面代码在循环中创建10个Object对象,虽然上面程序中的obj变量都是代码块的局部变量,当循环执行结束时这些局部变量都会失效,但由于这段循环导致Object对象会被创建10次,因此系统需要不断地为10个对象分配内存空间并执行初始化操作。这10个对象的生存时间并不长,接下来系统又需要回收它们所占用的空间。在这种不断的分配、回收操作中,程序的性能受到巨大的影响。

4、6 缓存经常使用的对象

       如果有些对象需要被经常使用,则可以考虑把这些对象用缓存池保存起来,这样当下次需要时就可以直接拿出这些对象来使用。典型的缓存就是数据连接池,数据连接池里缓存了大量的数据库连接,每次程序需要访问数据库时都可以直接取出数据库连接。
       除此之外,如果系统中还有一些常用的基础信息,比如信息化信息里包含的员工信息等。实现缓存时通常由两种方式。
  • 使用HashMap进行缓存。
  • 直接使用某些开源项目。
       如果直接使用HashMap进行缓存,程序员需要手动控制HashMap容器里的key-value对不至于太多,因此当key-value对太多时将导致HashMap占用过大的内存,从而导致系统性能下降。如果使用一些开源的缓存项目进行缓存,这些缓存项目都会主动分配一个具有一定大小的缓存容器,再按照一定算法来淘汰容器中不需要继续缓存的对象。这样一方面开源通过缓存已用过的对象来提高系统的运行效率,另一方面又可以控制缓存容器的无限制扩大,从而减少系统的内存占用。对于这种开源的缓存实现有很多选择,如OSCache、Ehcache等,大多实现了FIFO、MRU等常见的缓存算法。

4、7 尽量不要使用finalize方法

       在一个对象失去引用之后,垃圾回收器准备回收该对象之前,垃圾回收机制会先调用该对象的finalize()方法来执行资源清理。出于这种考虑,可能会考虑使用finalize()方法来进行资源清理。
       实际上,将资源清理放在finalize()方法中完成不是一个好选择,在垃圾回收器本身已经严重制约应用程序性能的情况下,如果再选择使用finalize()方法进行资源清理,无疑是火上浇油的行为,这将导致垃圾回收器负担更大,导致程序运行效率更差。

4、8 考虑使用SoftReference

       当程序需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素,而不是直接让数组元素来引用对象。SoftReference是一个很好的选择:当内存足够时,它的功能等同于普通引用;当内存不够时,会牺牲自己,释放软引用所引用的对象。
       使用软引用引用对象时不要忘记引用的不确定性。程序通过软引用所获取的对象有可能为null。当系统内存紧张时,SoftReference所引用的Java对象将被释放。由于通过SoftReference获取的对象可能为null,因此应用程序取出SoftReference所应用的Java对象之后,应该显示判断该对象是否为null;当该对象为null时,应重建该对象。




【毕设救星】从0到1打造YOLOv8货架商品检测与可视化系统,让你的毕设脱颖而出 本文介绍了一个基于YOLOv8的货架商品检测系统毕设项目。系统采用YOLOv8模型进行商品检测,包含环境搭建、数据集准备、模型训练与验证等完整流程,并开发了可视化UI界面。项目聚焦智能零售应用场景,技术栈完整且易于实现,适合作为计算机视觉方向的毕业设计。文章详细指导了从数据标注、模型训练到界面开发的全过程,提供代码示例和实用建议,帮助学生快速完成毕设并提升答辩表现。 阅读详情

相关推荐

025、空间降噪与时域降噪:噪声抑制与细节保留的平衡艺术

《降噪技术的平衡艺术:空间与时域降噪的协同优化》 本文深入探讨了图像处理中空间降噪与时域降噪的技术原理与工程实践。空间降噪通过像素级处理提升单帧质量,而时域降噪则利用帧间信息增强稳定性。文章揭示了两种方法在实际应用中的矛盾点:过度降噪会导致细节损失,影响后续算法性能。作者结合车载环视系统等实战案例,详细分享了参数调优经验,包括运动自适应策略、边缘保持技巧和嵌入式平台优化方案。特别强调降噪的最终目标应服务于下游算法需求,而非单纯追求图像美观。文章为工程人员提供了从理论到实践的完整指导,展现了降噪技术在效果与性

sundong_81的博客 171

java 强制垃圾回收_Java垃圾回收机制

Java垃圾回收机制垃圾回收机制用到finalize。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就会变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制特征:垃圾回收机制只负责回收内存中的对象,不会回收任何物理资源(例如:数据库连接,网络IO)程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运...

weixin_34377666的博客 876

基于STC8G1K08A单片机的7位PWM输出程序(PCA功能实现呼吸灯效果)

摘要:本文展示了基于STC8G单片机的PWM占空比控制实现。通过定时器0中断每5ms调整占空比(0-127范围),实现呼吸灯效果。关键代码包括:1)PWM初始化(7位PWM模式);2)定时器配置(1ms中断);3)主循环根据标志位动态调整占空比。硬件采用P5.4引脚输出PWM信号,通过direction标志实现占空比自动增减循环。该方案适用于LED亮度调节等场景,系统时钟24MHz,采用12T模式。

weixin_74013772的博客 815

深入Java核心 Java内存分配原理精讲

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java内存管理内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java内存分配方面的知识。一般Java内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ...

燕云十六州 234

BufferedOutputStream和BufferedInputStream字节缓冲流如何使用呢?

有关BufferedOutputStream和BufferedInputStream流的使用,它的构造方法是什么,怎么样去使用,这里给出了详细的使用案例。另外,既然这两个类被称为高效类,那肯定速度是very good!我最后做了个文件复制的操作来观察它的执行速度,果然是非常的快。...

JavaNewMans的博客 1546

Java内存回收

Java虚拟机内存原型寄存器:我们在程序无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是堆中 存取速度比堆块,仅次于寄存器,栈数据可以共享,栈的数据大小与生存期必须是确定的,缺乏灵活性。 堆:存放new产生的数据 可以动态分配内存大小,生存期也不必事先告诉编译器,因为它在运行时动态分配内存Java的垃圾收集器会自动收走这些不再使用的数据,但缺点是,由于在运行时分配

w 4844

Java内存回收机制

C、C++等语言中,内存的分配和释放由程序代码来完成,容易出现由于程序员漏写内存释放代码引起的内存泄露,最终导致系统内存耗尽。 Java代码运行在JVM中,由JVM来管理 堆Heap 内存的分配和回收(Garbage Collection),把程序员从繁琐的内存管理工作中释放出来,更专注于业务开发。Java内存回收工作由标记(识别可回收对象)和回收(释放可回收对象)两个步骤组成。 和程序代码释放内存相比,内存自动管理会占用一部分CPU时间,Stop The World特点回暂停业务程序运行,非常影响执行效率

hequnwang10的博客 6316

Java内存回收机制

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752 我们一起学Java! 在Java中,它的内存管...

chuifuhuo6864的博客 112

[转载]Java内存回收机制

转自:http://www.admin10000.com/document/1671.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,...

a1752807634的博客 462

Java提高——Java内存回收(2)

Java内存泄漏内存泄漏:程序运行过程中,不断的分配内存空间,那些不再使用的内存空间应该即时回收,,从而保证系统可以再次使用这些内存。如果存在无用的内存没有被回收,那么就是内存泄漏。垃圾回收机制垃圾回收机制主要完成以下两件事:1、跟踪并监控每个Java对象,当某个对象处于不可达状态则回收该对象所占用的内存2、清理内存分配、回收过程中产生的碎片垃圾回收的基本算法实际上,垃圾回收机制不可能实时监测到...

一颗洛米 264

java内存回收--读《疯狂java》 笔记

内存回收引用强引用软引用弱引用虚引用Java内存泄漏垃圾回收机制现行的垃圾回收器Young(年轻代)Old代Permanent代与垃圾回收的附加选项常见垃圾回收内存管理小技巧 程序员需要通过关键字new创建Java对象,即可视作为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间;当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除它们,并回收它们所占用的内存空间。 对于JVM的垃圾回收机制来说,是否回收一个对象的标准在于:是否还有引用变量引用该对象?只要有引用变量引用该对象,垃圾

我的LOG 616

java内存垃圾回收机制GC

垃圾收集 Garbage。

u011669370的博客 2639

【JVM】万字长文!深入详解Java垃圾回收(GC)机制

如果不进行垃圾回收内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

陈宝子的博客 6695

java垃圾回收机制

将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。双亲委派模型的好处:双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java 的核心 API 不被篡改。

2301_76607156的博客 3580

java回收内存_java内存回收

Gc1 对象是否存活​ 1.1 引用计数算法:​ 对象创建时,添加引用就计数器,每当引用时,计数器加一;引用失效是,计数器减一;当计数器的值为0时,不再使用。 缺点,难以解决对象之间的循环引用。​ 1.2可达性分析算法:​ 使用“GC roots”的对象作为起始点,以该节点,向下搜索,形成引用链,gc回收不再引用链上面的对象。​ gc roo...

weixin_32511247的博客 537

Java垃圾回收机制详解

垃圾回收(GC)是指Java虚拟机(JVM)自动管理堆内存的一种机制,主要负责回收不再使用的对象并释放内存空间。当一个对象不再有任何引用指向它时,它就成为了垃圾对象,GC会自动检测并销毁这些垃圾对象,以便回收其占用的内存资源。JVM通过垃圾回收器(Garbage Collector)来执行GC工作。GC的目的是在保证程序正常运行的前提下,尽可能有效地回收内存,避免内存泄漏和内存溢出等问题。

一碗黄焖鸡三碗米饭的博客 688

语音质量客观评价(PESQ)matlab.rar

此代码可用于语音合成或语音编解码后进行语音质量的客观评估。打开“evaluation.m”和“pesqbin.m”,修改文件路径后即可使用,主文件为“evaluation.m”

"inttypes.h","stdint.h" 这两个文件

想设置0分但是最低只能2分,大家请去这里免费下载https://code.google.com/archive/p/msinttypes/downloads别人的东西可以随便下到的你们拿来卖还要脸吗?

上一篇: Java的内存回收——垃圾回收机制
下一篇: Java表达式的陷阱——关于字符串的陷阱
Never_Blue
博客等级 码龄9年 5粉丝 49原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值