`
robinjoe
  • 浏览: 45808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Java高级进阶学习-Java的内存回收(5)

阅读更多
内存管理的小技巧
  尽可能多的掌握Java的内存回收,垃圾回收机制是为了更好地管理JVM的内存,这样才能提高java程序的运行性能。根据前面介绍的内存机制,下面给出java内存管理的几个小技巧。
(1)尽量使用直接量
  当需要使用字符串,还有Byte,Short,Integer,Long,Float,Double,Boolean,Charater包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建它们。
例如,程序需要"hello"字符串,应该采用如下代码
String str="hello"'
上面这种方式创建一个"hello"字符串,而且JVM的字符串缓存池还会缓存这个字符串。但如果程序采用
String str=new String("hello");
  此时程序同样创建了一个缓存在字符串缓存池中的"hello"字符串。除此之外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组里依次存放了h,e,l,l.o等字符串。


(2)使用StringBuffer和StringBuilder进行字符串拼接
  如果程序中采用多个String对象进行字符串连接运算,在运行时将生成大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降


(3)尽早释放无用对象的引用
  大部分时候,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因为局部变量的生存周期很短,当方法运行结束之时,该方法内的局部变量就结束了生命周期。因此,大部分时候程序无需将局部引用变量显工设为null.
但是下面程序中的情形则需显式设为null比较好了

public void info()
{
Object obj=new Objec();
System.out.println(obj.toString());
System.out.println(obj.toString());
obj=null;
//执行耗时,耗内存的操作
//或者调用耗时,耗内存的操作的方法
..
}

  对于上面程序所示的info()方法,如果需要“执行耗时,耗内存的操作”或者"或者调用耗时,耗内存的操作的方法",那么上面程序中显式设置obj=null就是有必要的了。可能的情况是:当程序在“执行耗时,耗内存的操作”或者"或者调用耗时,耗内存的操作的方法",obj之前所引用的对象可能被垃圾加收了。

 

(4)尽量少用静态变量
  从理论来说,Java对象对象何时被回收由垃圾回收机制决定,对程序员来说是不确定的。由于垃圾回收机制判断一个对象是否是垃圾的唯一标准就是该对象是否有引用变量引用它,因此要尽早释放对象的引用。
  最坏的情况是某个对象被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占用的内存的。

Class Person
{
static Object obj=new Object();
}
  对于上面的Object对象而言,只要obj变量还引用它,就会不会被垃圾回收机制所回收
Person类所对应的Class对象会常驻内存,直到程序结束,因此obj所引用的Object对象一旦被创建,也会常驻内存,直到程序运行结束。

 

(5)避免在经常调用的方法,循环中创建Java对象

public class Test
{
public static void main(String[] args)
{
for(int i=0;i<10;i++)
{
Object obj=new Object();
//执行其它操作...
}
}
}

  上面物循环产生了10个对象,系统要不断地为这些对象分配内存空间,执行初始化操作。它们的生存时间并不长,接下来系统又需要回收它们所占用的内存空间是,这种不断分配内存,回收操作中,程序的性能受到了很大的影响。

(6)缓存经常使用的对象
  如果有些对象需要经常使用,可以考虑把这些对象用缓存池保存起来,这样下次需要时就可直接拿出来这些对象来用。典型的缓存谅是数据连接池,数据连接池里缓存了大量的数据库连接,每次程序需要访问数据库时都可直接取出数据库连接。
  除此之外,如果系统里还有一些常用的基础信息,比如信息化信息里包含的员工信息,物料信息等,也可以考虑对它们进行缓存。
使用缓存通常有两种方法
1.使用HashMap进行缓存
2.直接使用开源缓存项目。(如OSCache,Ehcahe等)

 

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

 

(8)考虑使用SoftReference软引用
   关于软引用,阿堂在前面已经了详细介绍,这里,就不再重复说明

 

转自:http://hi.baidu.com/javabbs/blog/item/a0a0b7442554fb8fb2b7dc8f.html

分享到:
评论

相关推荐

    Java语言程序设计-进阶篇-原书第8版

    以下是一些Java进阶编程中常见的知识点: 1. 面向对象的高级特性:包括继承、封装、多态的深入理解,以及抽象类和接口的使用,泛型编程,注解以及反射机制。 2. Java集合框架:深入学习List、Set、Map等集合接口的...

    重塑java基础高级进阶资源分享

    根据提供的文件信息,我们可以推断出这是一份关于Java编程语言高级进阶的学习资源分享。虽然分享者在描述中提到“仅仅是分享!实在没有c币可以留言我,我可以私发”,这里的“c币”可能是指某个社区或平台内的虚拟...

    java高级进阶知识

    2. **垃圾回收机制**:Java的自动内存管理依赖于垃圾回收,包括新生代GC、老年代GC、全停顿GC等策略。理解这些机制有助于我们优化内存使用,减少垃圾回收带来的性能影响。 3. **类加载机制**:JVM的类加载过程包括...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    Java的垃圾回收(GC)自动管理内存,回收不再使用的对象所占用的空间。手动触发GC可以通过`System.gc()`,但不推荐,因为GC策略由JVM管理,频繁调用可能导致性能下降。 设计模式是解决软件设计中常见问题的模板,如...

    Java进阶学习资料.zip

    在Java进阶学习中,你需要掌握以下几个关键的知识点: 1. 高级数据结构与算法:理解并能熟练运用ArrayList、LinkedList、HashMap等集合框架,深入研究Set、Queue、Stack等接口及其实现类。同时,学习并应用高级排序...

    Java高级进阶面试题目.pdf

    标题“Java高级进阶面试题目.pdf”表明这是一份涵盖Java高级技术点的面试题资料,它适用于那些寻求在Java领域深入发展的求职者或者技术提升者。描述中的“Java高级进阶面试题目”进一步细化了这份资料的定位,即为...

    java 高级架构进阶学习

    ### Java高级架构进阶学习知识点概述 #### 一、思维导图 - **知识点概览**:思维导图是理解Java高级架构的关键工具之一。它能够帮助开发者快速掌握架构设计的核心概念和技术要点。 - **核心内容**: - **基础知识...

    Java面向对象(进阶)- Object类的详细概述

    在Java编程语言中,面向对象是其核心特性之一。Object类是所有Java类的根父类,无论何时我们创建一个新的类,除非明确指定其他父类,否则它都会默认继承Object类。这使得Object类中的方法对所有Java类都可用,体现了...

    java大神进阶之路.pdf

    Java大神进阶之路是一份针对Java开发者进阶提升的学习指南,详细描述了从编程基础到Java语言本身的精通,再到数据库以及Java Web核心技术的掌握,以及每个阶段所需要学习和掌握的知识点。文中特别强调了数据结构和...

    java学习资料-免费-适合0基础&进阶学习

    2. **进阶Java技术**: - **集合框架**:深入学习ArrayList、LinkedList、HashSet、HashMap等数据结构的实现和应用场景。 - **多线程**:了解并发编程,包括线程的创建、同步机制(如synchronized关键字、Lock接口...

    1 Java 程序员进阶之路(暗黑版)1

    5. Java虚拟机(JVM):解析内存模型、垃圾回收、性能优化,帮助开发者更好地理解和调优Java应用程序。 6. Java企业级开发:涵盖Maven项目管理、Git版本控制、SSM(Spring+SpringMVC+MyBatis)框架、Spring Boot快速...

    java进阶提高学习教程-13JVM与多线程.pptx

    Java进阶学习教程中的第13章主要涵盖了JVM(Java虚拟机)和多线程两个核心概念。JVM是Java程序运行的基础,它负责解释执行字节码文件,并提供了Java语言的跨平台特性。Java程序通过JVM与操作系统交互,使得程序可以...

    Java语言程序设计-进阶篇(原书第8版)

    《Java语言程序设计-进阶篇》是Java编程学习的重要参考资料,尤其对于已经掌握Java基础知识的开发者来说,这本书是进一步提升技能的关键。该书的第八版涵盖了Java编程的诸多高级主题,旨在帮助读者深入理解Java的...

    Java语言程序设计-进阶篇(原书第10版 中英文)

    一、Java进阶核心概念 1. 面向对象编程:Java是一种纯面向对象的语言,进阶篇会深入讲解类、对象、封装、继承、多态等面向对象的基本概念和应用。通过理解和掌握这些概念,读者可以更好地设计和实现复杂的软件系统...

    2021 Java架构进阶 Nginx企业级教程.txt打包整理.zip

    标题"2021 Java架构进阶 Nginx企业级教程.txt打包整理.zip"表明这是一个关于Java架构进阶和Nginx企业级应用的教程集合,内容可能涵盖Java技术栈的高级应用、系统架构设计以及Nginx服务器的配置和优化。.txt格式的...

    Java语言程序设计-进阶篇(原书第10版).pdf

    《Java语言程序设计-进阶篇》是针对已经掌握Java编程基础的学习者提供的一本深入学习书籍,尤其适合想要提升编程技巧和理解高级特性的读者。这本书基于原书的第10版,意味着它涵盖了最新的Java版本特性,比如Java 8...

    java程序设计进阶版

    《Java程序设计进阶版》原书第10版是一本深入探讨Java编程技术的权威著作,适合已经掌握基础Java知识的学习者进一步提升技能。这本书以其高清晰度和完整的章节结构,为读者提供了丰富的学习资源,是Java程序员进阶...

    Java进阶.zip

    "Java进阶"这个主题涵盖了Java开发中的高级概念和技术,旨在帮助程序员深入理解Java的精髓,提升开发技能。SunJava.pdf可能包含的是由Sun Microsystems(Java的原始开发者)发布的官方文档或教程。 1. **内存管理与...

    java2进阶教程

    JVM(Java虚拟机)是Java程序的运行环境,理解它的内存模型、类加载机制、垃圾回收原理以及性能优化技巧,如堆内存配置、栈内存优化、方法区调整等,对提升程序性能至关重要。 最后,数据库交互通常使用JDBC(Java ...

    Java语言程序设计-基础篇-进阶篇源码

    本资源包含了“Java语言程序设计-基础篇”和“Java语言程序设计-进阶篇”的全部源码,是学习和深入理解Java编程的理想资料。 在基础篇中,主要涵盖了以下知识点: 1. **Java简介**:Java的历史、特性,以及为什么...

Global site tag (gtag.js) - Google Analytics