Java内存回收机制(续续)

Java为了更好的避免内存泄漏,根据上两篇介绍的内存回收机制,下面给出Java内存回收的几点建议:

1、使用直接量:

当需要使用字符串时,还有Byte/Short/Integer/Long/Float/Double/Boolean/Character包装类的实例时,程序不应该使用new的方式来创建,而应该采用直接量来创建它们

String str=“hello”,创建了一个“hello”字符串,而且JVM的字符串缓存池还会缓存这个字符串

String str=new String(“hello”),此程序创建了一个缓存在字符串池中的“hello”字符串,除此之外str所引用的String对象底层还包含一个char[]数组,这个char[]数组里依次存放着h、e、l、l、o等字符。


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

大家如果不知道String、StringBuilder、StringBuffer之间区别的,可以看我之前的一篇博文,上面已经进行一些比较详细的分析,

总之一句话,如果使用多个String对象进行字符串连接运算,在运行的时候会产生大量的临时字符串,这些字符串会保存在内存中从而导致程序性能下降。


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

大部分情况下,方法的局部引用变量所引用的对象会随着方法的结束而变成垃圾,因为局部变量的生存周期很短,所以一般情况下不需要直接将局部引用变量直接赋值为null,但是如果一个方法很大,里面有很多耗费内存的调用,那么把巨变引用变量赋为null就是十分必要的了,而且应该这么做。


4、尽量少使用静态static变量:

因为垃圾回收机制判断一个对象是否是垃圾的唯一标准就是该对象是否有引用变量引用它,当某个对象被static变量所引用,那么垃圾回收机制通常不会回收这个对象所占用的内存,如下:

package com.crazyit;

public class Student {
	static Student obj = new Student();
}
obj变量是Student类的静态变量,因此它的生命周期与Student同步,在Student类不被卸载的情况下,Student类对应的Class对象会常驻内存,知道程序运行结束,因此obj所引用的Student对象一旦被创建,也会常驻内存,知道程序运行结束。 同时obj应用变量在Permannent代里。


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

经常调用的方法和循环有一个共同的特征,这段代码会被重复调用,如果在循环体内创建新的对象,则要不断地为对象分配内存和执行初始化操作,而且还要不断地回收内存空间,这样重复的操作会让程序的性能性能很慢。


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

弱国一些对象需要被经常使用,可以考虑把这些对象用缓存池保存起来,这样当下次需要的时候就可以直接拿出这些对象来使用,典型的缓存就是数据库连接池,数据连接池里缓存了大量的数据库连接,每次程序需要访问数据库时都可以直接取出数据库连接池。

实现缓存有两种方法:

(1)使用HashMap缓存

(2)直接使用某些开源缓存项目


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

垃圾回收机制的工作量十分大,尤其在回收Young代内存的时候,大都会引起应用程序的暂停,这样会使用户难以忍受。


8、考虑使用SoftReference:

这里只需要记住软引用会产生的一些意外即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java内存Java虚拟机(JVM)中用于存储对象实例的主要区域。垃圾回收(Garbage Collection, GC)机制Java设计的核心特性之一,它负责自动管理和回收不再使用的内存,以防止内存泄漏和内存溢出。Java内存的垃圾回收主要包括以下几个关键概念和过程: 1. **可达性分析**:GC通过可达性分析确定哪些对象是“活着”的。如果一个对象能通过当前存在的引用路径到达,那么它是可达的,否则就是垃圾。 2. **标记-清除算法**:从根对象(如静态变量、本地方法栈引用的对象)开始,标记所有可达的对象,然后清除未标记的对象。这个过程中可能会产生内存碎片。 3. **复制算法**:将堆分为两个部分,每次只使用一部分,使用完毕后把存活的对象复制到另一部分,然后清除旧的部分。这种方法避免了碎片化,但空间效率较低。 4. **标记-整理算法**:标记垃圾对象后,将存活对象向一端移动,腾出的空间整理为连续区域,便于后续内存分配。 5. **分代回收**:根据对象生命周期的不同,分为新生代(短生命周期的对象)和老年代(长生命周期的对象)。新生代采用 Minor GC,老年代则进行 Major GC,这有助于优化回收性能。 6. **引用计数**:虽然Java不直接使用引用计数,但在某些情况下(如JNI环境),引用计数也可能被用作辅助机制。 **相关问题--:** 1. Java内存的垃圾回收频率由哪个参数控制? 2. 如何避免新生代的内存溢出? 3. 什么是GC Roots?它们在可达性分析中的作用是什么?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值