WEB开发网
开发学院软件开发Java 从虚拟机视角谈 Java 应用性能优化 阅读

从虚拟机视角谈 Java 应用性能优化

 2010-07-15 00:00:00 来源:WEB开发网   
核心提示: 示例代码是一个栈结构,栈中存储对象引用,从虚拟机视角谈 Java 应用性能优化(9),容量为 10,stkp 是栈顶指针,剖析了与 Java 应用程序性能相关的因素,通过总结的一些程序员容易忽视的设计、编程原则和习惯,push 方法将对象压入栈中,pop1 和 pop2 弹出栈顶对象

示例代码是一个栈结构,栈中存储对象引用,容量为 10,stkp 是栈顶指针,push 方法将对象压入栈中,pop1 和 pop2 弹出栈顶对象。pop1 直接将对象弹出,该对象可能被其它对象使用之后立刻释放,而栈中仍有指向该对象的引用,由于栈可能在程序中长久存在,所以导致弹出的对象不能被回收。 pop2 方法在弹出对象前,将栈原来持有的对象引用置空释放,从而使弹出的对象彻底与栈脱离关系而不影响 GC。对于在程序运行中要大量创建和释放的对象,加强管理是很好的习惯,使用对象池机制是很好的解决方案,根据需要在对象池中创建一批对象,将不用的对象放回池中,待下次取出使用,这也大大节省了对象的反复创建和销毁时间。


清单 4. Java 对象池代码

 import java.util.HashMap; 
 import java.util.LinkedHashSet; 
 
 public class ObjectFactory { 
 
  /** A counter for counting the number of objects in use. */ 
  private static int objInUse = 0; 
 
  /** A counter for counting the number of objects in pool. */ 
  private static int objInPool = 0; 
 
  /** The object pool. */ 
  private static HashMap objectPool = new HashMap(); 
 
  /** The corresponding object pool for a specific class. */ 
  private static LinkedHashSet subObjPool; 
 
  /** Generate object for use */ 
  public synchronized static Object generate(String className) { 
 
    Object retObj = null; 
 
    subObjPool = (LinkedHashSet) objectPool.get(className); 
 
    if (subObjPool != null && subObjPool.size() < 0) { 
 
      retObj = subObjPool.iterator().next(); 
      subObjPool.remove(retObj); 
      objInPool--; 
 
    } else { 
 
      try { 
 
        retObj = newObj(className); 
 
      } catch (InstantiationException ie) { 
        return null; 
      } catch (IllegalAccessException iae) { 
        return null; 
      } catch (ClassNotFoundException cnfe) { 
        return null; 
      } 
    } 
 
    objInUse++; 
 
    return retObj; 
 } 
 
  public synchronized static void drop(Object freeObject) { 
 
    if (freeObject != null) { 
 
      subObjPool = (LinkedHashSet) objectPool.get(className); 
 
      if (subObjPool == null) { 
        subObjPool = new LinkedHashSet(); 
        objectPool.put(className, subObjPool); 
      } 
 
      if (!subObjPool.contains(freeObject)) { 
        subObjPool.add(freeObject); 
        objInPool++; 
        objInUse--; 
      } 
 
    } 
  } 
 
  /** Counts the number of objects which are in use now. */ 
  public static int countObjectInUse() { 
    return objInUse; 
  } 
 
  /** Checks the current size of the object pool. */ 
  public static int checkPoolSize() { 
    return objInPool; 
  } 
 
  /** New object for class name. */ 
  private static Object newObj(String className) 
   throws InstantiationException, IllegalAccessException, 
      ClassNotFoundException { 
 
    Object obj = Class.forName(className).newInstance(); 
    return obj; 
  } 
 } 

Java Profiler 工具

Java Profiler 是采用 JMX(Java Management Extensions,Java 资源管理框架)或 JVMPI(Java Virtual Machine Profiler Interface,Java 虚拟机监视程序接口)实现的对 Java 虚拟机中的资源、应用程序对象等进行监试的一类工具。Profiler 工具主要可以监视对象分配和回收、堆空间、线程运行、线程死锁、网络状态等。这为 Java 程序员进行性能分析提供了入手点,通过对程序运行时的状态分析,可以快速的定位问题,从而着手优化。Java Profiler 工具是分析 Java 程序性能的好帮手,但归根结底,性能的提高还依赖于程序员对 Java 虚拟机有一定了解,在此基础上遵循良好的设计和开发原则。这也是 Java 程序员成为真正高手的必由之路。

关于如何使用 profiler 工具,读者可参考相关资源进行深入研究,常用的 Java Profiler 工具有:

JConsole,虚拟机 SDK 自带工具,安装好 Java SDK 后,在 /bin 目录下启动;

Eclipse TPTP(Test and Performance Tools Platform)是由 Eclipse.org 顶级项目提供的一个测试与性能监测方面的工具插件;

Netbeans Profiler,Sun 内置于 Netbeans 中 profiler,方便用 Netbeans 开发时使用;

Visual VM,最初,Sun 随 JDK 6 Update 7 发布的 profiler,Visual Vm 包含 JConsole,同时界面更加美观且易于使用。

结束语

本文从 Java 虚拟机的视角出发,剖析了与 Java 应用程序性能相关的因素,通过总结的一些程序员容易忽视的设计、编程原则和习惯,希望对帮助广大 Java 程序员提高性能优化意识和水平有所帮助。

上一页  4 5 6 7 8 9 

Tags:虚拟 视角 Java

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接