为什么你写的程序运行效率不高;为什么你的程序会OutOfMemory;为什么你的程序会经常OutOfMemory;看看你的编程习惯是否符合36计
1.JVM 管理两种类型的内存:堆内存(heap),栈内存(stack),堆内在主要用来存储程序在运行时
创建或实例化的对象与变量.而栈内存则是用来存储程序代码中声明为静态(static)(或非静态)
的方法.
2.JVM 中对象的生命周期,创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶
段,释放阶段
3.避免在循环体中创建对象,即使该对象点用内存空间不大.
for(int i=0;i<10000;++i){
Object obj = new Object();
System.out.println("obj="+obj);
}
应改成
Object obj = null;
for(int i=0;i<10000;++i){
obj = new Object();
System.out.println("obj="+obj);
}
4.软引用的主要特点是具有较强的引用功能.只有当内存不够的时候,才回收这类内存,因此在
内存足够的时候,它们通常不被回收.它可以用于实现一些常用资源的缓存,实现Cache 的功能
A a = new A();
SoftReference sr = new SoftReference(a);
a = null;
if(sr !=null){
a = sr.get();
}else{
a = new A();
sr = new SoftReference(a);
}
5.弱引用对象与Soft 引用对象最大不同就在于:GC 在进行回收时,需要通过算法检查是否回
收Soft 引用对象,而对于Weak 引用对象,GC 总是进行回收.
A a = new A();
WeakReference wr = new WeakReference(a);
a = null;
if(sr !=null){
a = wr.get();
}else{
a = new A();
wr = new WeakReference(a);
}
6.共享静态变量存储空间
7.有时候我们为了提高系统性能,避免重复耗时的操作,希望能够重用一些创建完成的对象,利
用对象池实现.类似JDBC 连接池.
8.瞬间值,序列化对象大变量时,如果此大变量又没有用途,则使用transient 声明,不序列化此变
量.同时网络传输中也不传输.
9.不要提前创建对象
void f(){
int i;
A a = new A();
if(....){
a.showMessage();
}
}
改成
void f(){
int i;
A a = null;
if(....){
//用到时才实例化
a = new A();
a.showMessage();
}
}
10 .(1)最基本的建议就是尽早释放无用对象的引用
A a = new A();
a = null; //当使用对象a 之后主动将其设置为空
(2)尽量少用finalize 函数.
(3) 如果需要使用经常用到的图片展,可以使用软引用.
(4) 注意集合数据类型,包括数组,树等数据,这些数据结构对GC 来说,回收更为复杂,
(5) 尽量避免在类的默认构造器中创建,初始化大量的对象,防止在调用其自类的构造器
时造成不必要的内存资源浪费.
(6) 尽量避免强制系统做垃圾内存回收.
(7) 尽量避免显式申请数组空间.
(8) 尽量在合适的场景下使用对象池技术以提高系统性能,缩减系统内存开销.
11.当做数组拷贝操作时,采用System.arraycopy()方法完成拷贝操作要比采用循环的办法完成
数组拷贝操作效率高
12. 尽量避免在循环体中调用方法,因为方法调用是比较昂贵的.
13. 尽量避免在循环体中使用try-catch 块,最好在循环体外使用try--catch 块以提高系统性
能.
14. 在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减
少循环层间的变换次数.
15. 在需要线程安全的情况下,使用List list = Collections.synchronizedList(new ArrayList());
16. 如果预知长度,就设置ArrayList 的长度.
17. ArrayList 与 LinkedList 选择,熟悉底层的实现原理,选择适当的容器.
18. 字符串累加采用StringBuffer.
19. 系统I/O 优化,采用缓冲和压缩技术.优化性能.
20. 避免在类在构造器的初始化其他类
21 尽量避免在构造中对静态变量做赋值操作
22. 不要在类的构造器中创建类的实例
23. 组合优化继承
24. 最好通过Class.forname() 动态的装载类
25. JSP 优化,采用out 对象中的print 方法代替println()方法
26 .采用ServletOutputStream 对象代替JSPWriter 对象
27. 采用适当的值初始化out 对象缓冲区的大小
28. 尽量采用forward()方法重定向新的JSP
29. 利用线程池技术处理客户请求
30.Servlet 优化
(1) 通过init()方法来缓存一些静态数据以提高应用性能.
(2) 用print() 方法取代println()方法.
(3) 用ServletOutputStream 取代 PrintWriter.
(4) 尽量缩小同步代码数量
31. 改善Servlet 应用性能的方法
(1)不要使用SingleThreadModel
(2)使用线程池ThreadPool
32. EJB 优化
实体EJB:
(1)实体EJB 中常用数据缓存与释放
(2)采用延迟加载的方式装载关联数据
(3)尽可能地应用CMP 类型实体EJB
(4)直接采用JDBC 技术处理大型数据
33. 优化JDBC 连接
(1)设置合适的预取行值
(2)采用连接池技术
(3)全合理应用事务
(4)选择合适的事务隔离层与及时关闭连接对象
34. PreparedStatemetn 只编译解析一次,而Statement 每次都编译解析.
35. 尽可能地做批处理更新
36. 通过采用合适的getXXX 方法提高系统性能

编写高性能java程序的更多相关文章

  1. 编写高性能.NET程序-《Concurrency in .NET》(1)- 为什么要读这本书?

    最近广州.NET微软技术俱乐部对如何编写高性能.NET程序发起了讨论.   首先是在ORM和SQL方面进行了讨论,主题当然是经久不衰的月经贴: EF性能很差. Edi.Wang专门写了一篇文章< ...

  2. JVM性能优化系列-(4) 编写高效Java程序

    4. 编写高效Java程序 4.1 面向对象 构造器参数太多怎么办? 正常情况下,如果构造器参数过多,可能会考虑重写多个不同参数的构造函数,如下面的例子所示: public class FoodNor ...

  3. 用Eclipse编写运行Java程序

    1.选择一个空的文件夹,作为workspace工作空间,用来存放你以后用eclipse写的Java程序.(一个workspace可以放很多很多project项目) 2.新建java项目:File-&g ...

  4. 编写跨平台Java程序注意事项

    使用Java语言编写应用程序最大的优点在于“一次编译,处处运行”,然而这并不是说所有的Java程序都具有跨平台的特性,事实上,相当一部分的Java程序是不能在别的操作系统上正确运行的,那么如何才能编写 ...

  5. 1.建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理。

    package d0923; public class TestException { public static void main(String[] args) { for(int i=0;i&l ...

  6. 1编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果。2编写一个Java项目,定义包,在包下定义包含main方法的类。

  7. 编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果。把圆周率π定义为常量,半径定义为变量,然后进行计算并输出结果。

  8. 建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理。

    package exception; public class TestException { public static void main(String[] args) { for(int i=0 ...

  9. 编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的、无重复数字的三位偶数。

    package a; public class SanWeiOuShu { public static void main(String[] args) { String str="1234 ...

  10. 11.编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果。把圆周率π定义为常量,半径定义为变量,然后进行计算并输出结果。

    package com.hanqi.yzljs; public class yzljs { public static void main(String[] args) {     final dou ...

随机推荐

  1. ABC 363

    ABC 363 D - Palindromic Number 复盘一下几个细节: 最后得到的 \(n\) 代表的是答案在长度为 \(i\) 的回文数中排第几,所以最终答案要加上长度更短的 \(1 \s ...

  2. 重温c语言之,7天开整,就是随便的写写,第二天

    一:操作符 除法: 如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3: 如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础 ...

  3. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现七

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  4. Golang的GMP调度模型与源码解析

    0.引言 我们知道,这当代操作系统中,多线程和多进程模型被广泛的使用以提高系统的并发效率.随着互联网不断的发展,面对如今的高并发场景,为每个任务都创建一个线程是不现实的,使用线程则需要系统不断的在用户 ...

  5. MySQL无开通SQL全审计下的故障分析方法

    几年前MySQL数据库出现突然的从库延迟故障和CPU爆高时,如何排查具体原因,可能说已在腾讯云的MySQL库里开启了SQL全审计,记录了全部执行的SQL,再通过下面的方法就可以很容易找到原因: 1,实 ...

  6. paramiko模块的使用

    简介: Paramiko是基于Python(2.7,3.4+)版本实现和封装了SSHv2协议,底层是用cryptography实现,我们如果希望远程登录主机或者远程下载或者上传文件到远程主机都可以使用 ...

  7. vim 编辑 运行 shell 文件

    Vi/Vim 是所有 Unix/Linux 操作系统默认配备的编辑器.因其强大的功能和高效的操作,Vi/Vim 也成为众多 Unix/Linux 用户.管理员必须掌握并熟练使用的编辑工具之一.尤其是在 ...

  8. 全球最大分类广告商的Karpenter实践:减负运维、减少中断、每月省21万(上)

    原文链接: https://medium.com/adevinta-tech-blog/the-karpenter-effect-redefining-our-kubernetes-operation ...

  9. .Net知识技能大全

    .Net知识技能大全 更多请见https://www.dotnetshare.com C#常见运算符 一元运算符(+.-.!.~.++.--) 算术运算符(*./.%.+. – ) 移位运算符(< ...

  10. Teable 团队 Sealos 最佳实践,创业公司的完美选择

    大家好,我是开源多维表格项目 Teable 的创始人陈加贝. 作为飞书多维表格的最早期负责人,我参与并见证了这个产品从 0 到 1 的全过程.这段经历也让我深入理解了企业在数据协作方面的真实需求. 以 ...