`

java程序写的更健壮

 
阅读更多
1 、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null ,暗示垃圾收集器来收集该对象,防止发生内存泄露。对于仍然有指针指向的实例,jvm 就不会回收该资源, 因为垃圾回收会将值为null 的对象作为垃圾,提高GC 回收机制效率;
    2 、定义字符串应该尽量使用 String str="hello"; 的形式,避免使用String str = new String("hello"); 的形式。因为要使用内容相同的字符串,不必每次都new 一个String 。例如我们要在构造器中对一个名叫s 的String 引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
public Demo() {
s = "Initial Value";
}
}
 
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
  而非
s = new String("Initial Value"); 
s = new String("Initial Value");
     后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String 对象不可改变,所以对于内容相同的字符串,只要一个String 对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String 类型属性s 都指向同一个对象。   

3 、我们的程序里不可避免大量使用字符串处理,避免使用String ,应大量使用StringBuffer ,因为String 被设计成不可变(immutable) 类,所以它的所有对象都是不可变对象,请看下列代码;
String s = "Hello";  
s = s + " world!"; 
String s = "Hello";
s = s + " world!";
       在这段代码中,s 原先指向一个String 对象,内容是 "Hello" ,然后我们对s 进行了+ 操作,那么s 所指向的那个对象是否发生了改变呢?答案是没有。这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为"Hello world!" ,原来那个对象还存在于内存之中,只是s 这个引用变量不再指向它了。         通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String 来代表字符串的话会引起很大的内存开销。因为 String 对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String 对象来表示。这时,应该考虑使用StringBuffer 类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
    4 、尽量少用静态变量,因为静态变量是全局的,GC 不会回收的;
    5 、尽量避免在类的构造函数里创建、初始化大量的对象,防止在调用其自身类的构造器时造成不必要的内存资源浪费,尤其是大对象,JVM 会突然需要大量内存,这时必然会触发GC 优化系统内存环境;显示的声明数组空间,而且申请数量还极大。         以下是初始化不同类型的对象需要消耗的时间:

运算操作  
  示例   
  标准化时间
 
本地赋值   
 i = n
 1.0
 
实例赋值   
 this.i = n
 1.2
 
方法调用   
 Funct()
 5.9
 
新建对象   
 New Object()
 980
 
新建数组   
 New int[10]
 3100
 

       
从表1 可以看出,新建一个对象需要980 个单位的时间,是本地赋值时间的980 倍,是方法调用时间的166 倍,而新建一个数组所花费的时间就更多了。
    6 、尽量在合适的场景下使用对象池技术以提高系统性能,缩减缩减开销,但是要注意对象池的尺寸不宜过大,及时清除无效对象释放内存资源,综合考虑应用运行环境的内存资源限制,避免过高估计运行环境所提供内存资源的数量。
    7 、大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
    8 、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable ,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new 之后又丢弃。
    9 、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
    10 、尽量少用finalize 函数 ,因为finalize() 会加大GC 的工作量,而GC 相当于耗费系统的计算能力。
   11 、不要过滥使用哈希表,有一定开发经验的开发人员经常会使用hash 表(hash 表在JDK 中的一个实现就是HashMap )来缓存一些数据,从而提高系统的运行速度。比如使用HashMap 缓 存一些物料信息、人员信息等基础资料,这在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓 存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高 了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcache、oscache等,这些项目都实现了FIFO、MRU等常见的缓存算法 

 

分享到:
评论

相关推荐

    java程序自动重新启动

    在给定的标题"java程序自动重新启动"中,我们可以理解这是一个实现了自动重启逻辑的Java程序。描述指出,这个程序由三个.java文件组成:Test.java、Watch.java和AbstractRun.java,它们构成了一个简单的自动重启系统...

    java程序设计课件

    Java程序设计是计算机科学中的一个重要领域,主要涉及使用Java编程语言进行软件开发。Java是一种广泛应用于服务器端、桌面应用、移动应用(尤其是Android平台)的高级编程语言。天津大学计算机系提供的这门java程序...

    Java程序设计基础

    Java程序设计基础是编程学习的重要领域,主要涵盖了Java语言的基础概念、语法结构和特性。Java是一种全面面向对象的编程语言,由Sun公司的James Gosling等人于1990年开发,最初命名为Oak,后来因互联网的兴起而更名...

    清华Java程序设计实例教程

    【Java程序设计基础】 在Java程序设计中,基础至关重要。Java是一种面向对象的编程语言,由Sun Microsystems(现为Oracle公司)的James Gosling于1995年发布。它的设计目标是“简单、面向对象、健壮、安全”,这...

    自己写个一个java小程序

    7. 构建和运行:了解如何使用IDE(如Eclipse、IntelliJ IDEA)进行开发,以及如何编译和运行Java程序。 由于文件名中提到了“TimeApplet在192.168.0.23上”,这可能意味着程序原本在该IP地址的机器上运行,可能涉及...

    JAVA程序设计说明书

    《JAVA程序设计说明书》 Java程序设计是一种广泛应用于软件开发领域的技术,其强大的跨平台能力和丰富的类库使得它成为企业级应用、移动应用以及互联网应用的首选编程语言。本说明书将深入探讨Java程序设计的基本...

    用java写的下载器程序

    这个"用java写的下载器程序"很可能是一个基于Java实现的简单或高级的文件下载工具,它能够从互联网上抓取文件并保存到用户的本地系统。 在Java中构建下载器程序,通常涉及到以下几个关键知识点: 1. **网络编程**...

    java程序设计教程课后答案

    在学习Java程序设计时,课后答案对于巩固理解、检查自我学习进度以及深化编程技能至关重要。本教程涵盖了Java语言的基础概念、语法特性以及高级编程技巧。 1. **基础概念** - **变量与数据类型**:Java支持基本...

    java程序设计教程第七版课后习题答案

    异常处理是Java程序健壮性的重要组成部分。通过try-catch-finally语句块,我们可以捕获并处理运行时可能出现的错误,确保程序的正常运行。理解不同类型的异常(检查异常和运行时异常)及其区别也是关键。 集合框架...

    JAVA写的端口扫描程序

    7. **异常处理**:在进行网络操作时,如连接失败、超时等问题很常见,因此程序应该有良好的异常处理机制,如`try-catch-finally`块,确保程序的健壮性。 8. **命令行参数**:一个成熟的端口扫描程序可能会接受...

    Java程序设计 蔡翠平 唐大仕.rar

    《Java程序设计》是蔡翠平与唐大仕合著的一本经典的Java技术开发入门书籍。这本书以清晰易懂的方式,全面介绍了Java编程语言的基础知识和核心概念,旨在帮助初学者快速掌握Java编程技能。 首先,书中详细讲解了Java...

    如何编出健壮的代码,java编程30条规则

    Java 编程 30 条规则 Java 编程 30 条规则旨在帮助开发者编写高...这 30 条规则对 Java 编程进行了详细的规定,帮助开发者写出高质量的 Java 代码。遵循这些规则,开发者可以写出更加简洁易读、易维护和可靠的代码。

    Java程序与设计

    通过分析和运行这些代码,学习者能够更好地理解和掌握Java程序与设计的知识点,提升编程技能。 总之,Java程序与设计的学习是一个全面的过程,涵盖了从基本语法到高级特性的各个方面,同时也强调了良好的编程习惯和...

    电子科技大学java程序设计知识点+编程源代码

    电子科技大学的Java程序设计课程涵盖了Java语言的基础和核心概念,是针对期末复习的重要参考资料。以下是根据提供的题目解析总结的一些关键知识点: 1. **Java语言特点**: - 面向对象:Java是一种面向对象的语言...

    Java 程序设计

    Java程序设计是软件开发领域中的一个核心主题,它是一种广泛使用的高级编程语言,以其平台无关性、面向对象的特性以及丰富的类库而受到全球程序员的青睐。本资料集旨在通过通俗易懂的方式深入浅出地讲解Java编程的...

    JAVA程序与PLC之间的通信

    Java程序应具备健壮的异常处理机制,以应对这些突发情况,保证系统的稳定性。 9. **集成与部署**:最后,将Java程序与PLC通信功能整合到更大的系统中,可能涉及容器化(如Docker)、持续集成/持续部署(CI/CD)流程,...

    JAVA程序设计(唐大仕)

    3. **异常处理**:Java提供了强大的异常处理机制,课件会解释如何使用try-catch-finally语句块以及不同的异常类型,帮助开发者写出健壮的代码。 4. **集合框架**:Java集合框架是处理对象集合的重要工具,包括List...

    Java语言程序设计第三版-习题答案.pdf

    * 动态(Dynamic):Java程序的基本组成单元是类,而Java的类又是运行时动态装载的。 Java语言的语法机制 Java语言的基本语法机制,例如:数据类型、表达式、程序流控制、结构化异常处理等,都与C++相同。但是Java...

    QQ版的JAVA程序

    QQ版的JAVA程序是使用Java语言开发的一个简易的模拟QQ界面的应用。这个程序旨在帮助学习者理解Java编程语言,特别是GUI(图形用户界面)设计和事件处理的基本概念。通过分析和研究这个程序,我们可以深入探讨Java ...

    Java程序设计PPT

    Java程序设计是软件开发领域中的基础且至关重要的部分,它是一种多用途、面向对象的编程语言,被广泛应用于构建各种应用程序,从简单的桌面程序到复杂的Web和移动应用。本PPT系列涵盖了Java程序设计的核心概念,是...

Global site tag (gtag.js) - Google Analytics