高性能java
1.开发高性能java程序的原则与方法
优化程序代码的注意事项:
1。除非必须优化,否则不要轻易改动
2。改动之后要进行仔细的测试
3。在各个JVM产品中是不存在一劳永逸的成本模型
(在某个虚拟机上做的优化效果非常好,但是到了别的虚拟机上就不一定重现了)
2。先把焦点放在设计,数据结构和算法上
每一个方法不应该长,可以方法里面引入方法,这样jit所做的工作就会少
1。使用StringBuffer来做拼接
因为如果用String,那么很多对象将在Eden区域产生,很可能在此时造成垃圾全收集的产生
StringBuffer b = new StringBuffer("a"); //这里只产生一个对象,因为他会把a这个二进
制的东西(注意这时还不是一个对象),加到b这个对象里面,所以只有一个对象。
注意:"a"有两种身份,第一种身份是对象,第二种身份是和int这中东西一样的基础类型
所以使用StringBuffer来操作字符串拼接,那么从始至终都只有一个对象哈,虽然在传值给
append的时候传递了"a"这种东西,但是这个时候他不是一个对象
2。javap -c Test 可以生成字节码文件
通过字节码我们知道加入同步控制会导致字节码指令体积会增加
同步方法获取的是对象锁
Class Test{
public synchronized void m1(){
}
public synchronized void m2(){
}
public synchronized void m3(){
}
public synchronized void m4(){
}
}
//注意啦,这四个方法居然用了同一把锁,就是这个对象锁(this),
那么第一:四个方法只能由一个方法在一个时间内使用
第二:如果方法里面有全局变量,对象所还没有用,因为别的线程很可能
new一个自己的对象,还是可以进入这个方法来
所以千万不要使用方法同步
我们一般用字节数组作为锁变量
class Test{
private byte[] lock1 = new byte[0]; //技巧哈
private byte[] lock2 = new byte[0];
public void m1(){
synchronized(lock1){
//======================
}
}
}
尽量使用stack变量和基本类型完成必要的任务
一个方法的局部变量会存放在这个方法的运行时栈当中
stackAccess方法性能要高于staticAccess以及instacevarAccess
staticAccess和instacevarAccess方法的性能大体一致,因为他们都是从常量池中去得到实例变量
所以尽可能的使用局部变量
class StackVar{
private int instvar;
private static int staticvar;
void stackAccess(int val){
int j=0;
for(int i=0;i<val;i++){
j +=1; //这是对局部变量++
}
}
void instacevarAccess(int val){
//每次都要访问常量池,性能有问题,第二并发有问题
for(int i=0;i<val;i++){
instvar += 1; //这是对实例变量++
}
}
void instacevarAccessPer(int val){
int j= instvar;
for(int i=0;i<val;i++){
j+=1;
}
instvar = j;
}
void staticAccess(int val){
for(int i=0;i<val;i++){
staticvar += 1; //对静态变量++
}
}
void staticAccessPer(int val){
//性能不错,只需要访问两次常量池,
//其他操作都是在本地栈中完成的
int j=staticvar;
for(int i=0;i<val;i++){
j+=1; //对局部变量++然后赋值给静态变量
}
staticvar = j;
}
}
使用static final private 函数以促成inlining
内联函数会使用函数的代码来替换函数的调用,将函数的代码原封不动的
拷贝到调用处,省去了函数调用的消耗,以促使性能的提升,但是如果你将一个
函数声明为static final private那么java编译器就会把这种函数作为inlining
的候选者,为什么是候选者呢?因为如果你的函数写的非常大的话,那么他会使得你函数的体积
发生激增,所以Java编译器会先看下代码的长度,代码太长他也不会把他变为内陆函数的
实例变量初始化一次就好
如果你new一个类,那么java虚拟机如何对他初始化
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。执行构造方法的赋值动作
但是如果我们private int count=1;这么搞则有四步
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。覆盖缺省值
4。执行构造方法的赋值动作
或者有初始化区段,比如static{}
那么
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。初始化区段---这个虽然是static的,但确是在实例变量缺省值初始化之后
4。执行构造方法的赋值动作
class Foo{
private int count; //private int count=1;这样也会被执行两次,先执行缺省值赋值,
private boolean done;
private Point pt;
private Vector ver;
public Foo(){
count = 0; //这个东西被初始化了两次哈
done = false; //他的缺省值本来就是false,他又初始化一次
pt = new Point(0,0);
vec = new Vector(10);
}
}
class Foo{
private int count;
private boolean done;
private Point pt;
private Vector ver;
public Foo(){
pt = new Point(0,0);
vec = new Vector(10);
}
}
集群类对象的处理
1.数组,HashTable,Vector,Stack等数据结构类用于容纳和处理对象
注意:Collection类里面放的都是对象哈。。简单类型也会自动转型才被放入
1。权衡使用迭代器:Iterator,ListIterator,Enumeration
class AccessCollection{
public int enumCec(Vector vec){ //比较快,比后面的快10%
Enumeration enum = ver.elements();
int toral = 0;
while(enum.hasMoreElements()){ //在这里访问了一次容器,就比forVec慢了
total = ((Integer))(enum.nextElement()).iniValue();
}
return total;
}
public int iterVec(Vector vec){
Iterator it = vec.iterator();
int total = 0;
while(it.hasNext()){
total +=((Integer))(it.next()).iniValue();
}
return total;
}
public int listiterVec(Vector vec){
ListIterator it = vec.listIterator();
int total = 0;
while(it.hasNext()){
total +=((Integer))(it.next()).iniValue();
}
return total;
}
public int forVec(Vector vec){//最快,比前三个方法快35%
int size = vec.size();
int total = 0;
for(int i=0;i<size;i++){
total +=((Integer)vec.get()).intValue();
}
}
}
如何复制数组元素:
使用循环复制;---不好
使用System.arraycopy()方法---好,比循环复制快两倍,
因为他采用操作系统底层的复制,而不是采用循环的方式
System.arraycopy(src,0,des,0,src.length);
从原数组第0个元素开始拷贝,拷贝的长度为src.length;
把他拷贝到des时,以第0个位置作为起始元素
优先数组,然后考虑群积类,尤其是在性能优先的需求中;
如果需要群集类功能,但又不考虑同步,可以先选择非同步的集群类如ArrayList;
如果需要集群类功能,又要顾及到数据同步保护时,可以选择同步集群类,如Vector;
如果选择集群类,要分清集群类使用的目的
注意:不要因为有个个数无法确定的数据需要存储,就毫无选择的使用集群类,出现这种情况可以考虑创建一个足以
容纳大量数据的array,这可能造成内存浪费,但是在性能上往往会获得更大的收益
分享到:
相关推荐
以上只是《Effective Java》一书的部分主题,全书涵盖了大量Java编程的最佳实践和深度解析,是每个Java开发者案头必备的参考书。通过理解和应用这些知识点,开发者能够提升代码质量,降低维护成本,同时也能更好地...
《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...
“推荐书籍”可能涵盖计算机科学和软件工程的经典著作,例如《 Effective Java》、《Clean Code》等,这些书籍对于提升编程技能和理解最佳实践至关重要。 “热修复”是一种在不重启应用的情况下修复程序错误的技术...
《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威教材。这本书旨在帮助开发者提升在企业级Java应用开发中的效率和代码质量,通过一系列经过验证的编程实践和设计原则,提供了一套实用的指导...
1. **《Effective Java》(第三版)** - Joshua Bloch著。这本书是Java领域的经典之作,深入讲解了Java编程的最佳实践,包括设计模式、代码优化、性能调优等,是每个Java开发者书架上的必备之选。 2. **《Java并发...
- 《Effective Java 中文版》:优化编码风格,提高代码质量。 - 《Java解惑》:解答Java中的疑难问题,增进对语言特性的理解。 - 《分布式Java应用:基础与实践》:淘宝架构师的经验分享,对分布式系统有深入阐述...
该书由《Effective Java》的作者所著,因此我们可以推断出这本书将包含许多实用的Java编程技巧、最佳实践以及对Java语言特性的深度解析。接下来我们将从几个方面对这本书可能涵盖的关键知识点进行概述。 ### 1. ...
6. **《Thinking in Java》**(Bruce Eckel):这是一本深度讲解Java的经典之作,不仅讲解语言本身,还涵盖了数据结构、算法和设计模式等多个方面。 7. **《Effective Java》**(Joshua Bloch):本书提供了许多...
这个问题旨在了解求职者对于Java学习的态度和深度。常见的Java学习书籍包括但不限于: - 《Java核心技术》 - 《Effective Java》 - 《Thinking in Java》 - 《Java编程思想》 - 《Java并发编程实战》 2. **...
市场上的Java书籍众多,但能够聚焦于特定主题,以独立条款形式进行深度探讨的书籍却相对较少。《Practical Java》和《Effective Java》正是这样两部著作,它们对Java的重要而基础的技术细节进行了详尽、深刻的介绍和...
《Effective Enterprise Java》是一本备受推崇的编程指南,专注于提高Java在企业级应用中的效率和质量。这本书由著名软件工程师撰写,旨在帮助开发者理解和掌握Java平台的核心特性,并提供了一套实用的编程准则和...
《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威书籍,中文版名为《Effective.Enterprise.Java.Chinese.eBook.CN》。这本书由多位经验丰富的Java开发者共同编写,旨在帮助程序员提高Java在...
《Effective Java》是Java开发领域的一本经典著作,...这些仅是《Effective Java》中众多知识点的冰山一角,书中还涵盖了更多关于设计模式、多线程、集合框架、序列化等方面的深度讨论,对提升Java编程技能非常有帮助。
- **书籍选择**:选择一本或多本经典且更新及时的Java教材,如《Effective Java》、《Java Concurrency in Practice》等,它们能提供深度的专业知识。 - **在线资源**:利用互联网上的免费资源,如官方文档、Stack ...
对于进阶者,《Effective Java》由Joshua Bloch编写,是提升编程技巧的必备读物,书中涵盖了许多最佳实践和陷阱。《Java Concurrency in Practice》则深入解析了多线程和并发编程,是理解Java并发机制的权威指南。...
EPI,全称《Effective Programming: Considerations for Modern Software》,是一本关于软件开发实践的书籍,其中涵盖了大量用于提升编程技能的实例。将EPI的解决方案转化为Java语言,对于Java程序员来说,是提高...