“老虎”来了 J2SE1.5新功能一览
可扩缩性和性能
Sun承诺在1.5版中对可扩缩性和性能方面进行改善,新的重点在于启动时间和内存大小,使得高速部署应用程序变得更加容易。
最显著的更新是引入了在HotSpot JVM中共享数据的类。这种技术不仅在多个运行的JVM之间共享只读数据,而且改善了启动速度,因为核心的JVM类是预包装的。
性能人机工程学是J2SE 1.5的新特性。这意味着如果你在原先的版本中使用了特定的JVN运行期间选项,可能不必重新验证你的性能。
监控和可管理性
监控和可管理性是 Java 平台中的 RAS (Reliability, Availability, Serviceability,即可靠性、可用性、可服务性) 的一个关键组件。
JVM监控和管理API指定了一套广泛的JVM内部实现方法,允许监视一个运行中的JVM。信息可以通过JMX ( JSR - 003) MBeans访问,并且可以在Java地址空间内本地访问或者使用JMX远程接口(JSR -160)和行业标准的SNMP协议工具来访问。
最有用的一个特性就是低内存探测器。但超过阀值时,JMX MBeans可以通知注册的监听器什么时候达到临界值。
J2SE 1.5提供了一个简单的方法,可以启动JVM和应用程序的out - of - the - box远程管理。例如,为了启动一个可被相同的本地计算机中的jconsole监视的应用程序,可以使用下面的系统属性:
Java -Dcom.sun.management.jmxremote -jar Java2Demo.jar
并且,为了通过JMX监视它,而不需要验证,可以:
java -Dcom.sun.management.jmxremote.port=5001 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar Java2Demo.jar
想了解如何简单地使用新的应用编程接口,下面记录了在HotSpot JVM中的内存堆栈的使用方法。
import java.lang.management.*; import java.util.*; public class MemTest { public static void main(String args[]) { List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans(); for (MemoryPoolMXBean p: pools) { System.out.println("Memory type="+p.getType()+" Memory usage="+p.getUsage()); } } } |
新的JVM应用编程接口(JSR - 163)
这个版本中还包含了一个更加强大的本地应用编程接口,名为JVMTI。这个应用编程接口通过JSR - 163确定。然而,JVMTI是用来涵盖整套的本地访问的处理工具,除了简介以外还有监视、调试和潜在的各种其它代码分析工具。
这个实现包括用于字节码实现的机制,Java程序语言实现服务( JPLIS)。这可以使分析工具只在需要的地方添加补充的简介。这种方法的好处是它允许更具体的分析并且限制了运行的JVM上的简介工具的干扰。这个工具甚至可以可以在运行期间动态地生成,此外还可以在类装载期间,作为类文件进行预处理。
下面的示例创建了一个工具钩子,它可以从磁盘加载类文件的一个已修改的版本。要运行该测试,可利用 java -javaagent:myBCI BCITest 启动 JRE。
//File myBCI.java import java.lang.instrument.Instrumentation; public class myBCI { private static Instrumentation instCopy; public static void premain(String options, Instrumentation inst) { instCopy = inst; } public static Instrumentation getInstrumentation() { return instCopy; } } //File BCITest.java import java.nio.*; import java.io.*; import java.nio.channels.*; import java.lang.instrument.*; public class BCITest { public static void main (String[] args) { try { OriginalClass mc = new OriginalClass(); mc.message(); FileChannel fc=new FileInputStream( new File("modified"+File.separator+"OriginalClass.class")).getChannel(); ByteBuffer buf = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int)fc.size()); byte[] classBuffer = new byte[buf.capacity()]; buf.get(classBuffer, 0, classBuffer.length); myBCI.getInstrumentation().redefineClasses( new ClassDefinition[] { new ClassDefinition(mc.getClass(), classBuffer)}); mc.message(); } catch (Exception e){} } } //OriginalClass.java //Compile in current directory //Copy source to modified directory,change message and recompile public class OriginalClass { public void message() { System.out.println("OriginalClass"); } } |
如果没有可用的控制台窗口,那么生成的堆栈追踪就很困难。两个新的API——getStackTrace和Thread.getAllStackTraces——以程序的方式提供该信息。
StackTraceElement e[]=Thread.currentThread().getStackTrace(); for (int i=0; i <e.length; i++) { System.out.println(e[i]); } System.out.println(" "+Thread.getAllStackTraces()); |
HotSpot JVM包括一个致命错误处理程序,如果JVM出现故障,可以运行一个用户提供的脚本或者程序。调试工具还可以使用HotSpot JVM的可维护性代理连接器连接到一个挂起的JVM或者核心文件。
-XX:onError="command" -XX:onError="pmap %p" -XX:onError="gdb %p"optional %p used as process id
- 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
- 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。