存档

文章标签 ‘jvm’

Daniel-Journey Weekly Dose –2012/2/5

2012年2月5日 admin 没有评论

Windows

Windows 7中Telnet功能安装与测试

Programming

我们什么时候应该使用异常?

错误码

1. 错误信息不丰富
2. 加入错误状态码可能需要改变函数签名
3. 错误状态码可能会被忽略

 

Cloud

谁来拯救云计算

Scalability

Write Through Cache

Cache is a component that will magically store data so that future requests of that same data will not be to the Remote Server, and hence it will improve the performance of our application significantly faster.

Operations

Java应用运维

Architecture

关于排队系统

对事件驱动的消息订阅的再思考

浅谈架构

如果要更正式点定义,架构就是model和pattern,从而把code串成system。而其中最重要的就是design principles (设计原则),即为什么这个问题要用这个而非那个。更文艺点,再结合点美学,也可以叫作design philosophy (设计哲学或理念)。

然后我们来看什么是model和pattern,这两个具体的定义我还没想出来。先说一下比较,model偏宏观,而pattern偏微观;model重抽象描述,而pattern重具体实现。比如,你的系统有一个服务端和一个客户端,那么client/server就是model,而client与server之间的交互方式则是pattern,比如RPC/message、同步/异步,比如用滑动窗口来组织请求与应答等等。当然,这和系统的尺度有关。如果你zoom in到服务端,此时的model可能就是模块的组织关系,而pattern则是调用方式,比如用function call还是event等。

架构是什么:其实"架构", 就是一个人用于解决常见(注意常见)设计问题的特定方法…

经常有人把"架构"说的很玄乎,很虚. 其实"架构", 就是一个人用于解决常见(注意常见)设计问题的特定方法(注意特定的, 但不一定是一个). 遇到问题稍许有些变化, 他能适当的调整自己的常用(注意常用)设计而去适合这个变化的能力. 这就叫:"架构"设计… 也就是说, 架构是:方法论, 是经验, 更是变通能力.

Reactor模式和NIO

Reactor模式,或者叫反应器模式

Java

 

使用Jakarta Commons Pool处理对象池化

对于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。

Java克隆

Java Support for Large Memory Pages

Java HotSpot VM (Virtual Machine) Performance Tuning: Command-line options

Solving OutOfMemoryError (part 5) – JDK Tools

jps -lvm

-m Output the arguments passed to the main method. The output may be null for embedded JVMs.
-l Output the full package name for the application’s main class or the full path name to the application’s JAR file.
-v Output the arguments passed to the JVM.

Daniel-Journey Weekly Dose –2012/1/30

2012年1月30日 admin 没有评论

Scalability

耗内存应用优化实际案例

Local Cache的小TIP

但本地缓存最大的问题就是数据同步,如果让集中式存储(cache,queue)来通知只会增加复杂度,因此通常最简单的方式就是根据业务数据的敏感度设置不同长短的本地失效时间。但现在如果要设置一个较短的有效期(例如一秒),对于计算机来说已经大大的减轻了压力(1秒对程序来说太久了),但是整体本地缓存对后端保护的效果不佳(特别是后端如果是并发处理能力较弱的系统),如果遇到并发量大的系统,那么就更为突出了。

OOP

Exceptions versus Return Values

深入浅出享元模式

单例模式是邪恶的么?

有状态vs无状态

Stateless or Stateful?
Service objects will usually be stateless. Stateless service layers are highly scalable: They pose no replication issues and there is no need to allocate additional resources for every client. (Remember that one of the key motivations of a middle tier is to share resources between multiple clients.) It is also much easier for stateless service layers to support remote clients, if necessary. A stateless service layer is one concession of object orientation that I find not too painful.

……
If possible, design applications to use a stateless service layer. Hold state in the web tier, rather than in the business logic tier, if possible.

LINUX

简明Vim 练级攻略

free命令中的buffers和cached

Understand UNIX / Linux Inodes Basics with Examples

An Inode number points to an Inode. An Inode is a data structure that stores the following information about a file :

  • Size of file
  • Device ID
  • User ID of the file
  • Group ID of the file
  • The file mode information and access privileges for owner, group and others
  • File protection flags
  • The timestamps for file creation, modification etc
  • link counter to determine the number of hard links
  • Pointers to the blocks storing file’s contents

JAVA

jvm performance tuning (notes)

Thread state transitions diagram

Optimizing ArrayList.removeAll

Performance techniques used in the Hotspot JVM

JAVA线程dump的分析— jstack pid

怎样使用jstack诊断Java应用程序故障

The Commando Pattern

Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1

Deep dive into assembly code from Java

"java -XX:+PrintOptoAssembly -server -cp . Main". The -XX:+PrintOptoAssembly is the magic option, and with this option I get the following, which shows the code of the "foo" method:

Throwable的fillInStackTrace方法

fillInStackTrace每次执行的时候,会清空原来的栈内的trace信息。然后在当前的调用位置处重新建立trace信息, 所以在方法b()中printStackTrace的执行结果跟c()中的是不一样的。 b()方法被c()调用,c()被a()调用,a()被main()调用, 所以在b()中fillInStackTrace时,栈内会包含b(), a(), main()的信息;而在c()中调用fillInStackTrace时,栈内的信息会被刷新为c(), a(), main()。

java数据结构-HashMap

Oracle时间索引的使用

Rope:理论与实践

Java?言默认的 String和 StringBuilder类很难支撑起操纵大量字符串的系统。rope 数据结构可能是更好的替代品。这篇文章介绍 Ropes for Java,这是针对 Java 平台的 rope 实现;本文还将研究性能问题,并提供一些有效使用 rope 库的指导。

Java Memory  Tips & Tricks

JAVA 基本数据类型长度

java关键字Transient

Java对象的大小

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

Object ob = new Object();

    这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

   有了Object对象的大小,我们就可以计算其他对象的大小了。

Class NewObject {

    int count;

    boolean flag;

    Object ob;

}

    其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小 (4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

说说MaxTenuringThreshold这个参数

在计算存活周期这个阈值时,hotspot会遍历所有age的table,并对其所占用的大小进行累积,当累积的大小超过了survivor space的一半时,则以这个age作为新的存活周期阈值,最后取age和MaxTenuringThreshold中更小的一个值

如希望跟踪每次minor GC后新的存活周期的阈值,可在启动参数上增加:-XX:+PrintTenuringDistribution,输出的信息中的:
Desired survivor size 1048576 bytes, new threshold 7 (max 15)
new threshold 7即标识新的存活周期的阈值为7。

Understanding a Java thread dump

Java Memory Problems

The Top Java Memory Problems – Part 1

The Top Java Memortaiy Problems – Part 2

Hardware

Getting the hang of IOPS

Database

ORACLE数据库事务隔离级

当下列事件发生时,事务就开始了

1、连接到数据库,并执行第一条DML语句

2、前一个事务结束后,又输入了另一条DML语句

NETWOK

记一次TIME_WAIT网络故障

分类: 阅读 标签: , , , , , ,

Daniel-Journey Weekly Dose –2011/12/18

2011年12月19日 admin 没有评论

      JAVA

      JVM收集GC log
      69.713: [GC 11536K->11044K(12016K), 0.0032621 secs]

      从左到右分别是JVM 开始后的秒数和毫秒数的时间戳、执行的收集的类型、GC 之前的堆使用、GC之后堆的使用、总的堆能力和 GC 事件的持续时间

      -XX:+PrintGCDetails

      35.304: [GC 35.304: [DefNew: 28488K->864K(30592K), 0.0027815 secs] 74097K->46473K(98392K), 0.0028799 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]

      “[DefNew: 28488K->864K(30592K), 0.0027815 secs] ”解释一下,是指"新生代"的垃圾回收情况,这里的意思是从占用28488K内存空间变为864K内存空间,用时0.0027815 秒。

      [Times: user=0.02 sys=0.00, real=0.00 secs] 指的是CPU在User模式和系统模式的时间,real是全部消耗的时间

      这三个时间的解释可以参考 http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1

      -Xloggc:gc.log
        -XX:+PrintGCDetails
        -XX:+PrintGC
        -XX:+PrintGCTimeStamps(GC发生的时间,输出的相对JVM启动的时间)
        -XX:+PrintHeapAtGC
        -XX:+PrintGCDateStamps(PrintGCDateStamps 代替PrintGCTimeStamps,打印出来的是真实的日期)
        -XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间)
        -XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间)
        -XX:+PrintTenuringDistribution
              • UseSerialGC is "Serial" + "Serial Old"
              • UseParNewGC is "ParNew" + "Serial Old"
              • UseConcMarkSweepGC is "ParNew" + "CMS" + "Serial Old". "CMS" is used most of the time to collect the tenured generation. "Serial Old" is used when a concurrent mode failure occurs.
              • UseParallelGC is "Parallel Scavenge" + "Serial Old"
              • UseParallelOldGC is "Parallel Scavenge" + "Parallel Old"

              JAVA JVM GC LOG分析和调优【转】

              JDK5.0垃圾收集优化之–Don’t Pause

              编写对GC友好,又不泄漏的代码

              JVM GC日志时间问题

              分类: 阅读 标签: , ,

              jdk 命令之jmap

              2011年11月30日 admin 没有评论

              Jmap的参考文档可以参考http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

              jmap的常用命令入戏

              jmap –histo:[live] <pid>

              打印内存的直方图,记录java类的内存大小,数量…… live自选项表示只有live对象会被计算

              jmap -dump:[live,]format=b,file=<filename> pid

              将java heap中的信息导出到文件中。live自选项表示只有live对象会被计算。导出的文件可以用jhat或MAT来查看

              分类: JAVA 标签:

              玩转JVM 内存参数

              2009年12月26日 admin 没有评论

              -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你

              -Xmx 是最大堆的大小

              -Xmn设置新生代的大小

              整个JVM内存大小=新生代大小 + 老生代大小 + 永生代大小。老生代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

              样例配置

              JAVA_OPTS=”${JAVA_OPTS} -Xms512m -Xmx1536m -XX:MaxPermSize=256m”

              从程序中也可以获取部分的JVM 内存参数

              public class GetHeapSize {
              	public static void main(String[] args) {
              
              		// Get the jvm heap size.
              		Runtime runtime = Runtime.getRuntime();
              
              		long heapSize = runtime.totalMemory()/1024/1024;
              
              		// Print the jvm heap size.
              		long maxMemory = runtime.maxMemory()/1024/1024;
              		System.out.println("Heap Size = " + heapSize+", maxMemory="+maxMemory);
              	}
              }
               
              java -Xms64m -Xmx256m -Xmn16m com.danieljourney.GetHeapSize
              输出 Heap Size = 62, maxMemory=254
              java -Xms256m -Xmx256m -Xmn256m com.danieljourney.GetHeapSize
              输出 Heap Size = 254, maxMemory=254
               

              -Xss设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

              -XX:NewRatio=n设置新生代和老生代的比值。如:为3,表示新生代与老生代比值为1:3,新生代占整个老生代老生代和的1/4。

              -XX:SurvivorRatio=n:新生代中Eden区与两个Survivor区的比值,注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。

              -XX:MaxPermSize=n:设置永生代大小。

              JAVA_OPTS=”${JAVA_OPTS} -Xms512m -Xmx1536m -XX:MaxPermSize=256m”

              参考资料

              转载:Java 6 JVM参数选项大全(中文版)

              Java内存管理系列文章

              分类: JAVA 标签:

              转载:Java 6 JVM参数选项大全(中文版)

              2009年12月6日 admin 没有评论

               

              作者:Ken Wu

              Email: ken.wug@gmail.com

              原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm

              本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Options 编写的译文。主要介绍JVM中的非稳态选项及其使用说明。

              为了让读者明白每个选项的含义,作者在原文基础上补充了大量的资料。希望这份文档,对正在研究JVM参数的朋友有帮助!

              另外,考虑到本文档是初稿,如有描述错误,敬请指正。

              非稳态选项使用说明

              -XX:+<option> 启用选项

              -XX:-<option> 不启用选项

              -XX:<option>=<number> 给选项设置一个数字类型值,可跟单位,例如 32k, 1024m, 2g
              -XX:<option>=<string> 给选项设置一个字符串值,例如-XX:HeapDumpPath=./dump.core

              行为选项

              选项

              默认值与限制

              描述

              -XX:-AllowUserSignalHandlers

              限于Linux和Solaris,默认不启用

              允许为java进程安装信号处理器。

              Java信号处理相关知识,详见 http://kenwublog.com/java-asynchronous-notify-based-on-signal

              -XX:-DisableExplicitGC

              默认不启用

              禁止在运行期显式地调用 System.gc()。

              开启该选项后,GC的触发时机将由Garbage Collector全权掌控。
              注意:你熟悉的代码里没调用System.gc(),不代表你依赖的框架工具没在使用。

              例如RMI就在多数用户毫不知情的情况下,显示地调用GC来防止自身OOM。

              请仔细权衡禁用带来的影响。

              -XX:-RelaxAccessControlCheck

              默认不启用

              在Class校验器中,放松对访问控制的检查。

              作用与reflection里的setAccessible类似。

              -XX:-UseConcMarkSweepGC

              默认不启用

              启用CMS低停顿垃圾收集器。

              资料详见:http://kenwublog.com/docs/CMS_GC.pdf

              -XX:-UseParallelGC

              -server时启用

              其他情况下,默认不启用

              策略为新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact的垃圾收集器。

              -XX:-UseParallelOldGC

              默认不启用

              策略为老年代和新生代都使用并行清除的垃圾收集器。

              -XX:-UseSerialGC

              -client时启用

              其他情况下,默认不启用

              使用串行垃圾收集器。

              -XX:+UseSplitVerifier

              java5默认不启用

              java6默认启用

              使用新的Class类型校验器 。

              新Class类型校验器有什么特点?
              新Class类型校验器,将老的校验步骤拆分成了两步:
              1,类型推断。
              2,类型校验。
              新类型校验器通过在javac编译时嵌入类型信息到bytecode中,省略了类型推断这一步,从而提升了classloader的性能。

              Classload顺序(供参考)
              load -> verify -> prepare -> resove -> init

              关联选项:
              -XX:+FailOverToOldVerifier

              -XX:+FailOverToOldVerifier

              Java6新引入选项,默认启用

              如果新的Class校验器检查失败,则使用老的校验器。

              为什么会失败?

              因为JDK6最高向下兼容到JDK1.2,而JDK1.2的class info 与JDK6的info存在较大的差异,所以新校验器可能会出现校验失败的情况。


              关联选项:
              -XX:+UseSplitVerifier

              -XX:+HandlePromotionFailure

              java5以前是默认不启用,java6默认启用

              关闭新生代收集担保。

              什么是新生代收集担保?
              在一次理想化的minor gc中,Eden和First Survivor中的活跃对象会被复制到Second Survivor。
              然而,Second Survivor不一定能容纳下所有从E和F区copy过来的活跃对象。

              为了确保minor gc能够顺利完成,GC需要在年老代中额外保留一块足以容纳所有活跃对象的内存空间。
              这个预留操作,就被称之为新生代收集担保(New Generation Guarantee)。如果预留操作无法完成时,仍会触发major gc(full gc)。
              为什么要关闭新生代收集担保?
              因为在年老代中预留的空间大小,是无法精确计算的。

              为了确保极端情况的发生,GC参考了最坏情况下的新生代内存占用,即Eden+First Survivor。

              这种策略无疑是在浪费年老代内存,从时序角度看,还会提前触发Full GC。

              为了避免如上情况的发生,JVM允许开发者手动关闭新生代收集担保。

              在开启本选项后,minor gc将不再提供新生代收集担保,而是在出现survior或年老代不够用时,抛出promotion failed异常。

              -XX:+UseSpinning

              java1.4.2和1.5需要手动启用, java6默认已启用

              启用多线程自旋锁优化。

              自旋锁优化原理

              大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。
              原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
              互斥是一种会导致线程挂起,并在较短的时间内又必须重新调度回原线程的,较为消耗资源的操作。

              为了避免进入OS互斥,Java6的开发者们提出了自旋锁优化。

              自旋锁优化的原理是在线程进入OS互斥前,通过CAS自旋一定的次数来检测锁的释放。

              如果在自旋次数未达到预设值前锁已被释放,则当前线程会立即持有该锁。

              CAS检测锁的原理详见: http://kenwublog.com/theory-of-lightweight-locking-upon-cas

              关联选项:
              -XX:PreBlockSpin=10

              -XX:PreBlockSpin=10

              -XX:+UseSpinning 必须先启用,对于java6来说已经默认启用了,这里默认自旋10次

              控制多线程自旋锁优化的自旋次数。(什么是自旋锁优化?见 -XX:+UseSpinning 处的描述)

              关联选项:
              -XX:+UseSpinning

              -XX:+ScavengeBeforeFullGC

              默认启用

              在Full GC前触发一次Minor GC。

              -XX:+UseGCOverheadLimit

              默认启用

              限制GC的运行时间。如果GC耗时过长,就抛OOM。

              -XX:+UseTLAB

              1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用

              启用线程本地缓存区(Thread Local)。

              -XX:+UseThreadPriorities

              默认启用

              使用本地线程的优先级。

              -XX:+UseAltSigs

              限于Solaris,默认启用

              为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2。

              -XX:+UseBoundThreads

              限于Solaris, 默认启用

              绑定所有的用户线程到内核线程。
              减少线程进入饥饿状态(得不到任何cpu time)的次数。

              -XX:+UseLWPSynchronization

              限于solaris,默认启用

              使用轻量级进程(内核线程)替换线程同步。

              -XX:+MaxFDLimit

              限于Solaris,默认启用

              设置java进程可用文件描述符为操作系统允许的最大值。

              -XX:+UseVMInterruptibleIO

              限于solaris,默认启用

              在solaris中,允许运行时中断线程 。


              性能选项

              选项与默认值

              默认值与限制

              描述

              -XX:+AggressiveOpts

              JDK 5 update 6后引入,但需要手动启用。

              JDK6默认启用。

              启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等。

              -XX:CompileThreshold=10000

              1000

              通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码。

              -XX:LargePageSizeInBytes=4m

              默认4m

              amd64位:2m

              设置堆内存的内存页大小。

              调整内存页的方法和性能提升原理,详见 http://kenwublog.com/tune-large-page-for-jvm-optimization

              -XX:MaxHeapFreeRatio=70

              70

              GC后,如果发现空闲堆内存占到整个预估堆内存的70%,则收缩堆内存预估最大值。

              什么是预估堆内存?

              预估堆内存是堆大小动态调控的重要选项之一。

              堆内存预估最大值一定小于或等于固定最大值(-Xmx指定的数值)。

              前者会根据使用情况动态增大或缩小,以提高GC回收的效率。

              -XX:MaxNewSize=size

              1.3.1 Sparc: 32m

              1.3.1 x86: 2.5m

              新生代占整个堆内存的最大值。

              -XX:MaxPermSize=64m

              5.0以后: 64 bit VMs会增大预设值的30%

              1.4 amd64: 96m

              1.3.1 -client: 32m

              其他默认 64m

              Perm(俗称方法区)占整个堆内存的最大值。

              -XX:MinHeapFreeRatio=40

              40

              GC后,如果发现空闲堆内存占到整个预估堆内存的40%,则增大堆内存的预估最大值。此值不会超过固定最大值。

              (什么是预估堆内存?见 -XX:MaxHeapFreeRatio 处的描述)

              关联选项:

              -XX:MaxHeapFreeRatio=70

              -XX:NewRatio=2

              Sparc -client: 8

              x86 -server: 8

              x86 -client: 12

              -client: 4 (1.3)

              8 (1.3.1+)

              x86: 12

              其他默认 2

              新生代和年老代的堆内存占用比例。

              例如2表示新生代占最大堆内存的1/2。即年老代和新生代平分堆的占用。

              -XX:NewSize=2.125m

              5.0以后: 64 bit Vms 会增大预设值的30%

              x86: 1m

              x86, 5.0以后: 640k

              其他默认 2.125m

              新生代预估堆内存占用的默认值。(什么是预估堆内存?见 -XX:MaxHeapFreeRatio 处的描述)

              -XX:ReservedCodeCacheSize=32m

              Solaris 64-bit, amd64, -server x86: 48m

              1.5.0_06之前, Solaris 64-bit amd64: 1024m

              其他默认 32m

              设置代码缓存的最大值,编译时用。

              -XX:SurvivorRatio=8

              Solaris amd64: 6

              Sparc in 1.3.1: 25

              Solaris platforms 5.0以前: 32

              其他默认 8

              Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的新生代内存,另外因为有2个survivor,

              所以survivor总共是占用新生代内存的 2/8,Eden的占比则为 6/8。

              -XX:TargetSurvivorRatio=50

              50

              实际使用的survivor空间大小占比。默认是50%,最高90%。

              -XX:ThreadStackSize=512

              Sparc: 512

              Solaris x86: 320 (5.0以前 256)

              Sparc 64 bit: 1024

              Linux amd64: 1024 (5.0 以前 0)

              其他默认 512.

              线程堆栈大小

              -XX:+UseBiasedLocking

              JDK 5 update 6后引入,但需要手动启用。

              JDK6默认启用。

              启用偏向锁。

              偏向锁原理详见 http://kenwublog.com/theory-of-java-biased-locking

              -XX:+UseFastAccessorMethods

              默认启用

              优化原始类型的getter方法性能。

              -XX:-UseISM

              默认启用

              启用solaris的ISM。

              详见Intimate Shared Memory.

              -XX:+UseLargePages

              JDK 5 update 5后引入,但需要手动启用。

              JDK6默认启用。

              启用大内存分页。

              调整内存页的方法和性能提升原理,详见http://kenwublog.com/tune-large-page-for-jvm-optimization

              关联选项

              -XX:LargePageSizeInBytes=4m

              -XX:+UseMPSS

              1.4.1 之前: 不启用

              其余版本默认启用

              启用solaris的MPSS,不能与ISM同时使用。

              -XX:+StringCache

              默认启用

              启用字符串缓存。

              -XX:AllocatePrefetchLines=1

              1

              与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自行阅读官方doc。

              -XX:AllocatePrefetchStyle=1

              1

              与机器码指令预读相关的一个选项,资料比较少,本文档不做解释。有兴趣的朋友请自行阅读官方doc。


              调试选项

              选项与默认值

              默认值与限制

              描述

              -XX:-CITime

              1.4引入。

              默认启用

              打印JIT编译器编译耗时。

              -XX:ErrorFile=./hs_err_pid<pid>.log

              Java 6引入。

              如果JVM crashed,将错误日志输出到指定文件路径。

              -XX:-ExtendedDTraceProbes

              Java6引入,限于solaris

              默认不启用

              启用dtrace诊断。

              -XX:HeapDumpPath=./java_pid<pid>.hprof

              默认是java进程启动位置,即user.dir

              堆内存快照的存储文件路径。

              什么是堆内存快照?

              当java进程因OOM或crash被OS强制终止后,会生成一个hprof(Heap PROFling)格式的堆内存快照文件。该文件用于线下调试,诊断,查找问题。

              文件名一般为

              java_<pid>_<date>_<time>_heapDump.hprof

              解析快照文件,可以使用 jhat, eclipse MAT,gdb等工具。

              -XX:-HeapDumpOnOutOfMemoryError

              1.4.2 update12 和 5.0 update 7 引入。

              默认不启用

              在OOM时,输出一个dump.core文件,记录当时的堆内存快照(什么是堆内存快照? 见 -XX:HeapDumpPath 处的描述)。

              -XX:OnError="<cmd args>;<cmd args>"

              1.4.2 update 9引入

              当java每抛出一个ERROR时,运行指定命令行指令集。指令集是与OS环境相关的,在linux下多数是bash脚本,windows下是dos批处理。

              -XX:OnOutOfMemoryError="<cmd args>;
              <cmd args>"

              1.4.2 update 12和java6时引入

              当第一次发生OOM时,运行指定命令行指令集。指令集是与OS环境相关的,在linux下多数是bash脚本,windows下是dos批处理。

              -XX:-PrintClassHistogram

              默认不启用

              在Windows下, 按ctrl-break或Linux下是执行kill -3(发送SIGQUIT信号)时,打印class柱状图。

              Jmap –histo pid也实现了相同的功能。

              详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

              -XX:-PrintConcurrentLocks

              默认不启用

              在thread dump的同时,打印java.util.concurrent的锁状态。

              Jstack –l pid 也同样实现了同样的功能。

              详见 http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html

              -XX:-PrintCommandLineFlags

              5.0 引入,默认不启用

              Java启动时,往stdout打印当前启用的非稳态jvm options。

              例如:

              -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:+DoEscapeAnalysis

              -XX:-PrintCompilation

              默认不启用

              往stdout打印方法被JIT编译时的信息。

              例如:

              1 java.lang.String::charAt (33 bytes)

              -XX:-PrintGC

              默认不启用

              开启GC日志打印。

              打印格式例如:

              [Full GC 131115K->7482K(1015808K), 0.1633180 secs]

              该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 和 Jconsole 动态启用。

              详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump

              -XX:-PrintGCDetails

              1.4.0引入,默认不启用

              打印GC回收的细节。

              打印格式例如:

              [Full GC (System) [Tenured: 0K->2394K(466048K), 0.0624140 secs] 30822K->2394K(518464K), [Perm : 10443K->10443K(16384K)], 0.0625410 secs] [Times: user=0.05 sys=0.01, real=0.06 secs]

              该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 和 Jconsole 动态启用。

              详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump

              -XX:-PrintGCTimeStamps

              默认不启用

              打印GC停顿耗时。

              打印格式例如:

              2.744: [Full GC (System) 2.744: [Tenured: 0K->2441K(466048K), 0.0598400 secs] 31754K->2441K(518464K), [Perm : 10717K->10717K(16384K)], 0.0599570 secs] [Times: user=0.06 sys=0.00, real=0.06

              secs]

              该选项可通过 com.sun.management.HotSpotDiagnosticMXBean API 和 Jconsole 动态启用。

              详见 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump

              -XX:-PrintTenuringDistribution

              默认不启用

              打印对象的存活期限信息。

              打印格式例如:

              [GC
              Desired survivor size 4653056 bytes, new threshold 32 (max 32)
              - age 1: 2330640 bytes, 2330640 total
              - age 2: 9520 bytes, 2340160 total

              204009K->21850K(515200K), 0.1563482 secs]

              Age1 2表示在第1和2次GC后存活的对象大小。

              -XX:-TraceClassLoading

              默认不启用

              打印class装载信息到stdout。记Loaded状态。

              例如:

              [Loaded java.lang.Object from /opt/taobao/install/jdk1.6.0_07/jre/lib/rt.jar]

              -XX:-TraceClassLoadingPreorder

              1.4.2引入,默认不启用

              按class的引用/依赖顺序打印类装载信息到stdout。不同于 TraceClassLoading,本选项只记 Loading状态。

              例如:

              [Loading java.lang.Object from /home/confsrv/jdk1.6.0_14/jre/lib/rt.jar]

              -XX:-TraceClassResolution

              1.4.2引入,默认不启用

              打印所有静态类,常量的代码引用位置。用于debug。

              例如:

              RESOLVE java.util.HashMap java.util.HashMap$Entry HashMap.java:209

              说明HashMap类的209行引用了静态类 java.util.HashMap$Entry

              -XX:-TraceClassUnloading

              默认不启用

              打印class的卸载信息到stdout。记Unloaded状态。

              -XX:-TraceLoaderConstraints

              Java6 引入,默认不启用

              打印class的装载策略变化信息到stdout。

              例如:

              [Adding new constraint for name: java/lang/String, loader[0]: sun/misc/Launcher$ExtClassLoader, loader[1]: <bootloader> ]

              [Setting class object in existing constraint for name: [Ljava/lang/Object; and loader sun/misc/Launcher$ExtClassLoader ]

              [Updating constraint for name org/xml/sax/InputSource, loader <bootloader>, by setting class object ]

              [Extending constraint for name java/lang/Object by adding loader[15]: sun/reflect/DelegatingClassLoader ]

              装载策略变化是实现classloader隔离/名称空间一致性的关键技术。

              对此感兴趣的朋友,详见 http://kenwublog.com/docs/Dynamic+Class+Loading+in+the+Java+Virtual+Machine.pdf 中的 contraint rules一章。

              -XX:+PerfSaveDataToFile

              默认启用

              当java进程因OOM或crashed被强制终止后,生成一个堆快照文件(什么是堆内存快照? 见 -XX:HeapDumpPath 处的描述)。

              作者敬告

              完善的单元测试,功能回归测试,和性能基准测试可以减少因调整非稳态JVM选项带来的风险。

              参考资料

              Java6性能调优白皮书

              http://java.sun.com/performance/reference/whitepapers/6_performance.html

              Java6 GC调优指南

              http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

              更为全面的options列表

              http://blogs.sun.com/watt/resource/jvm-options-list.html

              分类: JAVA 标签:

              HotSpot Java常用工具介绍-jps(Java Virtual Machine Process Status Tool)

              2009年6月25日 admin 没有评论
               

              jps介绍

              jps简单理解就是一个java版的ps,用来提供一些简单的jvm信息(进程ID,进程启动的路径,命令行参数等等)。jps的语法格式如下

              jps [ options ] [ hostid ]
              options-- 命令行参数 ,可选
              -q 不输出classnameJARfilename
              -m 输出main 方法的参数
              -l  输出main class的类全名(包含package)或者jar的全路径
              -v(小写) JVM输入参数
              -V(大写)  输出通过标志文件传给JVM的参数
              hostId是符合[protocol:][[//]hostname][:port][/servername]语法的字符串。
                   protocol:协议,缺省时rmi
                   hostname:主机名或IP地址,如果主机名忽略,就是localhost
                   port: 端口
              如果hostId为空,jps会列出locahost上的Jvm进程信息。
              命令输出
              lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
              lvmId lvm进程ID
              classname JVM启动类名
              jarfilename  JVM启动的jar文件名
              arg* 命令行参数
              jvmarg jvm参数
               

              参考资料

              http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html

              分类: JAVA 标签: , ,