存档

作者存档

抵抗诱惑——系统管理员的时间管理

2009年5月26日 hashei 没有评论

       I Can Resist Everything Except Temptation

                                                                —— Oscar Wilde

       最近工作比较清闲,就免不得胡思乱想,想个人今后的职业发展,想如何更好的利用现在这段还算年轻自由的时光。“年轻人是不是应该为梦想殊死搏斗?”这是某位老大的疑问。如果说梦想是隐隐绰绰,看的见却抓不着,或者只是留下“别和我谈理想,已经戒了”的无奈,那么一个切实可行的目标总该有的吧。谁不想在公司里成为举足轻重的骨干,谁不愿兜里的钱能多一些,谁不希望有个幸福美满的家庭?

       我是都想的,看看离而立之年只有5年的时光,总感到一阵阵紧迫感。但是自己这种天塌下来都悠哉游哉的性格,做啥事一会会后就想着“不要着急不要着急,休息休息一下”的半吊子态度,让我自己都觉得实在是可恶至极。

其实我们都知道自己的弱点,但是知道是一回事,克服又是另一回事了——至少在没有旁人督促的情况下。而当我看到这本《时间管理-给系统管理员》的时候,我知道了督促的关键不是是否有个人一直在背后催着,而是是否有一个完善的计划。

  1. 切实可行的长期计划(个人和职业)
  2. 如何在8小时内安排好100小时任务量的计划——优先级管理
  3. 如何专心工作,避免打扰的计划
  4. 如何不会被会议、邮件占用整个一天的计划
  5. 如何避免把时间都浪费在“开心网”上的计划
  6. 如何把自己的大脑从繁杂的记忆中解放出来的计划

……

时间管理的关键就是GTD(Get things Done),现在已不新鲜,但从此书中点出则让我倍感亲切,因为它是一本针对我的书——Time Managerment for System Administrators。但是要谨记的一点是:养成一个习惯需要21天。所以如何避免一暴十寒是我接下去能否成功的重点。

现在我面临的诱惑很多:每天“开心网”的偷菜种菜、转帖的八卦新闻,订阅的大量博客,MSN上闪闪发亮的头像。所以执行力(又见执行力)是关键。可以说,我现在开的这个博“聚沙成塔—小哈的记事簿”,也是贯彻执行力的一个手段。唯有要把自己的知识写出来而又不贻笑大方,才能逼着自己查阅原始资料,务必找到官方明确描述的语句,逼着自己为了理解一些繁琐的英语长句请教英语系的高材生。书写是为了更好的思考为什么你应该(从现在开始就)写博客是我坚持下去的动力,而“刘未鹏 | Mind Hacks 思维改变生活”也必将不会被清理出我的google reader(大家可以看看,他的每一篇文章都可以说是精工细作的结果)。

这篇文章虽说夹杂着人生计划,可到底还是一篇读后感,所以也不得不吐槽一下“糟糕”的翻译。文中时时夹杂着生硬的如机器翻译的语句,如“我是一个新鲜人”,那些每章开头都有的漫画我也没看出什么笑点来。不过万幸的是,这不是一部文学作品,而且有意思的是,如果你读到无法理解的句子,试着将它译回英文(一个词一个词翻译就好了)你会豁然开朗。

WebSphere遗忘管理控制台密码怎么办?外一篇其它各种密码的补救措施

2009年5月25日 hashei 没有评论

常在河边走,哪有不湿鞋,WebSphere管理中最让人无语的是把密码忘记了。管理控制台也好,数据源的密码也好,配置的时候为了满足安全管理的要求设置了8位以上、大小写皆有、毫无意义的密码,现在两眼一抹黑,怎么都试不出来。怎么办?重装?生产环境好不好。其实不用着急,IBM还是给我们留了一条后路的。

管理控制台密码遗忘有两种补救措施:

方法一:命令行——从$WAS_HOME/profiles/xxx 概要文件名/bin目录下,运行 wsadmin -conntype NONE 。当wsadmin的命令行窗口出现之后,运行 securityoff 。上述操作在应用服务器启动或停止的状态都能发出。再次启用WAS时,就是停用管理安全性的状态了。

方法二:修改配置文件——修改$WAS_HOME\config\cells\xxx 下的security.xml,把第一个enable改成false就取消安全性了。

详细说明 http://www-01.ibm.com/support/docview.wss?uid=swg21105430

以上两种方法是禁用了全局安全性(global security),最后别忘了设置新的密码然后再次启用。

下文是讲述如何“破解”出WebSphere中其它密码的方法:

转自Sunny’s 部落格

http://www.sunnyblog.info/blog/archives/3149

WebSphere会在配置文件(一堆的XML)当中存放各种密码(包括数据源、认证别名等等),例如在$WAS_Profile_HOME\config\cells\security.xml文件里面有类似”<authDataEntries xmi:id=”JAASAuthData_1238489272531″ alias=”myNode01/oracleDBA” userId=”oraadmin” password=”{xor}bm1sa2pp”/>”,就是存放认证别名为oracleDBA的用户名和密码。

可以看到在这里密码被重新编码(encode)了,编码的方式是XOR(eXclusive OR异或),很明显这种并不是一种强加密的算法,仅仅是一种编码而已,所以准确来说WebSphere为了避免密码被明文记录,只是很简单地“编码”(encode)而不是“加密”(encrypt)。

万一阁下一个不小心忘记了存放在WebSphere里面的密码,但是又想恢复过来的话,WebSphere这种只是编码而不是加密的存放密码形式,就帮助了你了。当然如果你想干坏事的话,WebSphere也算是给自己留下了一个“后门”了 -_-b。嘿嘿嘿,不要以为IBM那帮老爷子就是这么懒,如果阁下真的是要对存放在WebSphere配置文件里面的密码要加密的话(对于广大客户肯定是有这个诉求的),其实IBM也提供了一种自定义加密算法的插件形式去解决这个问题的,详情可以参考这个链接,在这里就不对这个问题进行展开讨论了。

好了,现在就对各个版本的WAS的密码编码和反编码进行讨论:

WAS 5.X的编码:

> cd $WAS_INSTALL_DIR/lib
> ../java/bin/java -cp securityimpl.jar:iwsorb.jar com.ibm.ws.security.util.PasswordEncoder 123456

WAS 5.X的反编码:

> cd $WAS_INSTALL_DIR/lib
> ../java/bin/java -cp securityimpl.jar:iwsorb.jar com.ibm.ws.security.util.PasswordDecoder {xor}bm1sa2pp

WAS 6.0的编码:

> cd $WAS_INSTALL_DIR/lib
> ../java/bin/java -cp securityimpl.jar:iwsorb.jar::ras.jar:wsexception.jar:bootstrap.jar:emf.jar:ffdc.jar com.ibm.ws.security.util.PasswordEncoder 123456

WAS 6.0的反编码:

> cd $WAS_INSTALL_DIR/lib
> ../java/bin/java -cp securityimpl.jar:iwsorb.jar::ras.jar:wsexception.jar:bootstrap.jar:emf.jar:ffdc.jar com.ibm.ws.security.util.PasswordDecoder {xor}bm1sa2pp

WAS 6.1的编码:

> cd $WAS_INSTALL_DIR/bin\ProfileManagement\plugins\com.ibm.websphere.v61_6.1.200
> java -cp ws_runtime.jar com.ibm.ws.security.util.PasswordEncoder 123456

WAS 6.1的反编码:

> cd $WAS_INSTALL_DIR/bin\ProfileManagement\plugins\com.ibm.websphere.v61_6.1.200
> java -cp ws_runtime.jar com.ibm.ws.security.util.PasswordDecoder  {xor}bm1sa2pp

以上内容参考转载自robertmaldon

当然,如果你觉得很麻烦的话,其实也有一个网站直接帮你解码:WebSphere Password Decoder

JAVA性能优化—IBM JDK JVM参数设置

2009年5月23日 hashei 4 条评论

前一篇JVM的恩恩怨怨中,说了对WebSphere优化的关键点——因不同JDK而异。本文将描述IBM JDK下常用参数的设置。

-Xms:最小堆大小

-Xmx:最大堆大小

-Xminf and -Xmaxf:GC(垃圾回收)之后可用空间的最小值最大值

-Xmine and -Xmaxe:堆增长的最小最大值

-Xmint and -Xmaxt:垃圾回收占时间整个运行时间的比例,默认是5%。如果回收时间小于5%,那么它就缩减堆,反之增大。

一般来说只要对Xms和Xmx设置合理,后面的三对不用特别设置。可以看看http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp上heap expasion和heap shrinkage两章的说明,除非有下文的情况:

如果使用大小可变的堆(比如,-Xms 和 -Xmx 不同),应用程序可能遇到这样的情况,不断出现分配失败而堆没有扩展。这就是堆失效,是由于堆的大小刚刚能够避免扩展但又不足以解决以后的分配失败而造成的。通常,垃圾收集周期释放的空间不仅可以满足当前的分配失败,而且还有很多可供以后的分配请求使用的空间。但是,如果堆处于失效状态,那么每个垃圾收集周期释放的空间刚刚能够满足当前的分配失败。结果,下一次分配请求时,又会进入垃圾收集周期,依此类推。大量生存时间很短的对象也可能造成这种现象。避免这种循环的一种办法是增加 -Xminf 和 -Xmaxf 的值。比方说,如果使用 -Xminf.5,堆将增长到至少有 50% 的自由空间。同样,增加 -Xmaxf 也是很合理。如果 -Xminf等于0.5,-Xmaxf 为默认值 0.6,因为 JVM 要把自由空间比例保持在 50% 和 60% 之间,所以就会出现太多的扩展和收缩。两者相差 0.3 是一个不错的选择,这样 -Xmaxf.8 可以很好地匹配 -Xminf.5。如果记录表明,需要多次扩展才能达到稳定的堆大小,但可以更改 -Xmine,根据应用程序的行为来设置扩展大小的最小值。目标是获得足够的可用空间,不仅能满足当前的请求,而且能满足以后的很多请求,从而避免过多的垃圾收集周期。-Xmine、-Xmaxf 和 -Xminf 为控制应用程序的内存使用特性提供了很大的灵活性。

摘自Java性能优化的策略和常见方法

所以在应用正式上线的头一段时间,最好把GC日志打开,观察一下堆(heap)的增长(expasion)和收缩(shrinkage)。最佳的情况就是,每次回收后可用的堆大小占整个堆的50%左右。如果回收后才腾出30%不到的可用空间,那就该再调整一下上述的参数了。下图看起来直观一点,使用-verbose:size参数可以查看当前的默认值。

IBM WAS Heap Sizes

那为何不把Xms和Xmx设置成一样大,就像SUN的JDK所推荐的那样?

Using the same values is not usually a good idea, because it delays the start of garbage collection until the heap is full. The first time that the Garbage Collector runs, therefore, becomes a very expensive operation. Also, the heap is more likely to be fragmented and require a heap compaction. Again this is a very expensive operation.……

If the Garbage Collector cannot find enough garbage, it runs compaction. If the Garbage Collector finds enough garbage, or any of the other conditions for heap expansion are met , the Garbage Collector expands the heap.

因为IBM JDK采用的是标记(mark)-扫描(sweep)-标记-……-扫描-紧凑排列(compact),如果还不能提供足够的空间,扩展堆(expasion)。依次循环,直到达到最大堆大小。每次扩展前,那些长存的对象就被调整到堆的底部,每次扩展后需要再动的量就很少。所以如果把Xms设置成和Xmx一样,那么扫描和紧凑排列这么一个充满内存碎片的大堆的开销将大大高于从小扩展堆的开销。

The overheads of expanding the heap are almost trivial compared to the cost of collecting and compacting a very large fragmented heap.

这是由于IBM的GC特点造成的,而SUN的JDK采用的是分代回收的策略,所以就没有这种情况,反而会受益于堆大小一致。不过这么说起来,用了-Xgcpolicy:gencon,就应该把最小堆最大堆设置成一样咯。

在Gencon回收策略下,可以通过-Xmn来设置婴儿区域(Nursery或者叫young)的大小,通过-Xmo来设置长存区(tenured或者old)的大小。注意-Xmn不能和-Xmns/-Xmnx参数一起使用,-Xmo不能和-Xmos/-Xmox一起使用,否则会报错。前者就是把年轻代和长存代的大小固定了,而后两者就是设定两个部分最大最小的范围,默认情况下:

-Xmns是-Xms的25%或者64M(在JDK 5.0中默认是25%)

-Xmnx是-Xmx的25%或者64M(同上)

-Xmos是-Xmx减去-Xmns的大小

-Xmox是和-Xmx一样大

可见默认的年轻代太小了,生产环境中有必要改大一点。因为年轻代使用的是复制策略,所以回收速度相当快(minor gc),而长存代使用的是和optavgpause 策略相似的方式进行并发标志、扫描策略,回收速度比较慢(major gc)。理想情况是minor gc和major gc的比值在1:1010:1左右。(可以通过GC日志查看回收的区域)

gencon中年老期限(Tenure age)和倾斜比率(Tilt ratio)这两个参数是JVM自己动态调整的。

针对固定对象问题(Pinned Objects),使用-Xk -Xp参数设定kCluster和pCluster,Avoiding Java heap fragmentation with Java SDK V1.4.2. 或者我这篇IBM JDK的Java堆空间的碎片问题

一些不常用的参数:

-Xloainitial<percentage> -Xloamaximum<percentage> :调整大对象区域(Large Object Area)的大小。分配总是先在SOA(Small Object Area)中分配,如果没有空间并且需要分配的大小大于64K,那么分配到LOA。默认情况下为-Xloainitial0.05 (5%),-Xloamaximum0.5 (50%),如果你的程序确实需要分配许多大对象的话(大于64K),那么可以调整LOA的初始百分比。

以上两点可以参考我这篇IBM JDK的Java堆空间的碎片问题,获得更详细的解释。

总结一下来说,对于optthruput和optavgpause,设置恰当的最大堆和最小堆,设置-Xk和-Xp避免碎片问题,如果程序需要分配大对象较多,那么调整一下LOA的大小;对于gencon,可以调大最小堆和最大堆接近,调整young区域的大小,LOA也可以视情况调整。subpool一般用不到,就不去研究了。

一些另外的信息

Default settings for the JVM

http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/defaults.html

JVM environment settings

http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/appendixes/env_var/env_jvm.html

默认的Heapdumps是关闭的,调试的时候记得打开;默认的Javadumps on out of memory和Heapdumps on out of memory都是开启的,但是默认的dump位置是profile的所在目录,最好在管理控制台java进程中把IBM_HEAPDUMPDIR和IBM_JAVACOREDIR设置到别的目录,防止dump内容把WAS的文件系统撑爆,影响正常业务使用。

在Windows机器上,如果内存大于4G,记得开启/3GB参数,这样可以使JVM Heap可以设置的更大一些,接近2G-1,(其它的三部分可以扩展到另外的1G上去),但一般最大不超过1.7G。

Memory layout of a vm in the os

更详细内容,可见http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp

或者下载dig60 http://www.ibm.com/developerworks/java/jdk/diagnosis/查看JVM这一块

Sun的JDK配置,可以参考JAVA性能优化—Sun Hotspot JDK JVM参数设置

Business Objects Enterprise3.1、Metedate安装指南

2009年5月19日 hashei 5 条评论

安装主机

192.16.29.234

Weblogic domain目录

D:\bea\user_projects\domain\BO

Oracle 9.2.0.7,本地建立客户端并配置好

ip:1521 sid:

安装过程

clip_image001

1 运行安装程序,选择安装程序语言为中文。下一步同意安装信息,输入安装序列号。

clip_image002

2 选择语言包

clip_image003

3 选择新建安装BOE,数据库为使用现有Oracle数据库,修改安装目标文件夹为D:\Business Objects\

clip_image004

4 输入管理员账号密码,此处密码为以后登录BOE的administrator密码,因为要符合密码安全性,所以设置为Test1234(注意大小写)

clip_image005

5 按照默认信息,下一步

clip_image006

6 输入数据库信息,CMS数据库为保存BOE运行信息的数据库,输入已经在ORACLE建立好的用户名/密码 ——cms/******;audit为审计数据库,用户名/密码为audit/******。

7 接下来BOE会连接到oracle创建数据库

clip_image007

8 这一步是选择BOE安装的中间件环境,这里选择WEBLOGIC9。(借用一下DI的图)

clip_image008

9 Weblogic的配置信息,用户名密码为weblogic,Server Instance是登录weblogic后点击服务器看到的服务器名称,默认单机安装后的都是AdminServer。同时注意weblogic要选择listening在本地所有端口上(all local port),否则按下一步可能会报错。

10 接下来就是安装程序自己安装了,时间估计1个小时。

安装过程

Metadata安装需要BOE的支持,所以和BOE安装在同一台机器上,双击安装程序后会自动找到BOE的安装目录,同时连接相同的数据库,把安装信息添加进去。安装比较简单,这里就不再累述。

Start:

1. Weblogic BO Server

2. Server Intelligence Agent

3. WinHttp Web Proxy Auto-Discovery Service

登录入口

InfoView:

http://ip:7001/InfoViewApp/

CMS (Control Manegemet System):

http://ip:7001/CmcApp/

Matadata Menegement:

http://ip:7001/bomm/

登录系统用户名 Administrator 密码Test1234,注意大小写

Sql2005数据库复制操作方法

2009年5月19日 hashei 没有评论

本文根据微软的MSDN上教材进行整理

一、 准备阶段

此阶段是为了以最小的特权运行SQL Server2005的复制工作

A. clip_image001 在发布服务器上为复制代理创建本地 Windows 帐户

1. 在发布服务器上,从“控制面板”的管理工具中打开计算机管理

2. 在系统工具中,展开本地用户和组

3. 右键单击用户,再单击新建用户

4. 在用户名框中,输入 username,提供密码和其他相关信息,然后单击创建来创建 “username” 帐户。

5. 单击关闭

B. clip_image001[1] 在订阅服务器上为复制代理创建本地 Windows 帐户

1. 在订阅服务器上,从“控制面板”的管理工具中打开计算机管理

2. 在系统工具中,展开本地用户和组

3. 右键单击用户,再单击新建用户

4. 在用户名框中,输入 username,提供密码和其他相关信息,然后单击创建来创建”username” 帐户。

5. 单击关闭

C. 为快照文件夹创建共享并分配权限

1. 在 Windows 资源管理器中,导航到 SQL Server 2005 数据文件夹。默认位置为 C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.X\Data,可以根据自己需要创建目录所在地

2. 创建名为 sqlshare的新文件夹。

3. 右键单击该文件夹,然后单击共享和安全

4. 在“sqlshare 属性对话框的共享选项卡上,单击共享此文件夹。确保共享名的值为 sqlshare

5. 单击权限

6. 单击添加。在输入要选择的对象名称文本框中,键入第 1 课中创建的快照代理帐户的名称,格式为 <Machine_Name>\username,其中 <Machine_Name> 是发布服务器的名称。单击检查名称,然后单击确定

7. 验证是否允许以下权限:

· username – 完全控制

8. 单击确定关闭“username 的权限对话框。

D. 在发布服务器中设置数据库权限

1. 在 SQL Server Management Studio 中,展开安全性,右键单击登录名,然后选择新建登录名

2. 在常规页中单击搜索,在输入要选择的对象名称框中输入 <Machine_Name>\username (其中,<Machine_Name> 是本地发布服务器的名称),再单击检查名称,然后单击确定

3. 在用户映射页中,启用到 所要分发 数据库的用户映射,确保有数据库的db_owner 数据库角色和public角色

单击确定创建登录名。

二、 配置分发订阅

A. clip_image001[2] 在发布服务器中配置分发

1. 在 SQL Server Management Studio 中连接到发布服务器,然后展开服务器节点。

2. 右键单击复制文件夹,然后单击配置分发。此时分发配置向导启动。

3. 在分发服务器页中,选择“‘<服务器名称>将充当自己的分发服务器;SQL Server 将创建分发数据库和日志,然后单击下一步

4. 在快照文件夹文本框中,输入 之前建立的共享目录,然后单击下一步

5. 根据情况决定执行发布的间隔时间,时时执行还是确定某一时间运行。一般“事务性发布”选择“立即创建快照并保持可用状态”,而“快照发布”选择间隔某一段时间创建快照,比如4个小时

6. 快照代理安全性,在以下Windows账户下运行中输入运行的进程账户名<Machine_Name>\username (其中,<Machine_Name> 是本地发布服务器的名称)和密码,

7. 接受向导剩余页上的默认值。

8. 单击完成启用分发。

在发布服务器上配置订阅

1. 选择复制节点

2. 右键本地订阅

3. 选择发布服务器

4. 选择订阅方式(选择推送订阅))填加订阅服务器

5. 安全性——运行的进程选择<Machine_Name>\username,连接的订阅服务器选择数据库上的新建的username

6. 选择代理计划(一般选择连续运行)

7. 其余选择默认项。

注:http://msdn.microsoft.com/zh-cn/library/ms152531.aspx 上有关于使用复制分发后的备份建议。

JVM的恩恩怨怨-WebSphere性能优化(二)

2009年5月18日 hashei 没有评论

WebSphere优化中不得不提的是对JVM的优化,OutOfMemory、GC时间太长太频繁、内存碎片、大对象问题……虽说JVM运行效率如何很大程度是和代码有关,但是恰当的参数设置还是可以避免很多问题。因为在JAVA程序中,垃圾回收(Garbage Collection——GC)是内存发生瓶颈的主要因素(在程序没有问题的情况下)。

但是JVM的优化(也就是优化GC)是一个很令人头疼的活。调整JVM需要根据不同的平台分别对待,如果不了解直接Google一个参数加上无法生效事小,适得其反就不好了。在 Sun ™Solaris™ 和 HP-UX 平台上,WebSphere使用的是Sun和HP提供的JDK,而所有其他平台,WebSphere提供的是IBM JDK。所以优化参数主要区别在IBM JDK和非IBM JDK上,Sun和Hp环境下的优化方案基本能共享。

通用配置

          GC优化的关键是降低频率(frequency)和减少持续时间(duration)。但是两者此消彼长,所以平衡一个恰当的值十分关键。频率和堆的大小和分配增长速度有关,而持续时间则和堆大小和堆中对象的多少有关。由此可以看出最先要考虑的就是堆的大小。

          最大堆、最小堆设置:现在32位的堆,一般设置为256~512M或者512~1024M,但是

       对于不同的应用程序,最优化堆大小的设置都有可能不同。如果堆设置较大,可能导致 GC 的次数变少,但每次 GC 所花的时间很长,从而导致系统的处理能力抖动很大。此外如果堆设置过大,会占用过多的内存,使内存资源耗尽,从而会频繁的进行 IO 操作来使用虚拟内存。 如果堆设置较小,可能导致 GC 变的频繁,但每次 GC 所花的时间不会太长,每次 GC 对系统的性能影响相对也会小些。但是如果堆设置过小, 会使得对象可分配空间变小,从而会频繁的 GC 来释放内存空间,而每次 GC,都会耗用一定的系统资源。因此,要通过试验和监控数据,设法使的我们所设置的堆大小能够使得系统运行最优化。

          具体合适的值,可以启用-verbose:gc来观察。一般良好的堆大小,要让回收频率保持在10秒左右,而一次的full gc回收时间在1到2秒之内(一般的回收时间更短才好)。要注意的是,对于32位的JDK,在Windows环境下单个堆不要超过1.7G,AIX平台不要超过3.2G。下面摘自 出色的“清洁工具” ― 理解 IBM Java 垃圾收集器,第一部分:: 对象分配

 

问题 建议措施
在堆达到稳定状态以前,GC 的频率太高。 使用 verbosegc 确定处于稳定状态的堆大小并将 -Xms 设置成这个值。
堆被完全扩展并且占用率大于 70%。 增加 -Xmx 值使堆占用率不超过 70%。为了获取最佳性能,尝试确保堆从不换页。物理内存应该能容纳最大的堆大小(如果可能)。
占用率为 70% 时,GC 的频率过大。 更改 -Xminf 的设置。缺省值是 0.3,它将通过扩充堆来尝试维持 30% 可用空间。设置为 0.4 将可用空间目标增加到 40%,从而降低 GC 的频率。
暂停时间过长。 尝试使用 -Xgcpolicy:optavgpause (在 1.3.1 中引入),它在堆占用增加时减少暂停时间并且使它们更一致。在吞吐量方面要付出代价。代价是变化的,大约在 5% 左右。

确定了堆大小,接下来要考虑的是

GC的策略

IBM JDK(1.5)下WebSphere首先要了解的是4个Policy

IBM SDK 5.0 中的 GC 策略

针对吞吐量进行优化
-Xgcpolicy:optthruput(可选)
默认策略。对于吞吐量比短暂的 GC 停顿更重要的应用程序,通常使用这种策略。每当进行垃圾收集时,应用程序都会停顿。

针对停顿时间进行优化
-Xgcpolicy:optavgpause
通过并发地执行一部分垃圾收集,在高吞吐量和短 GC 停顿之间进行折中。应用程序停顿的时间更短。

分代并发
-Xgcpolicy:gencon
以不同方式处理短期存活的对象和长期存活的对象。采用这种策略时,具有许多短期存活对象的应用程序会表现出更短的停顿时间,同时仍然产生很好的吞吐量。

子池 (一般平台用不到)
-Xgcpolicy:subpool
采用与默认策略相似的算法,但是采用一种比较适合多处理器计算机的分配策略。建议对于有 16 个或更多处理器的 SMP 计算机使用这种策略。这种策略只能在 IBM pSeries® 和 zSeries® 平台上使用。需要扩展到大型计算机上的应用程序可以从这种策略中受益。

其中optthruput是默认的IBM JDK GC策略,我觉得不是很适合一般电子商务的情况。因为它的GC停顿时间是三种策略里最长的,而且对于频繁分配短生命周期、小对象的应用来说,很容易就产生了内存碎片,虽然标志-扫描-紧凑排列(mark-sweep-compact)的第三个阶段“紧凑排列”可以消除碎片,但是这种动作开销很大。一般需要设置P cluster、K cluster参数来减少碎片Avoiding Java heap fragmentation with Java SDK V1.4.2. (这个参数在1.5中也适用)

optavgpause是以一点吞吐量的牺牲(官方说是5%)换来响应时间的提高,用并发标记(JDK1.4)外加并发扫描(JDK1.5引入)的方式来减少GC “Stop the world”的时间。

但一般而言,我都是设置成-Xgcpolicy:gencon ,gencon就是我们常说的“分代回收”策略,在HP和SUN的JDK实现中是默认的回收策略。这篇文章Java 理论与实践: JVM 1.4.1 中的垃圾收集,介绍的就是分代回收策略,而且肯定是针对SUN的JDK,当然HP的也适用。可以关注下面这张图:

形象直观,文章里的文字总忘掉七零八落,但那些原理可以日后巩固,这幅图保存好了设置参数就没啥大问题。

注意下图显示的IBM JDK的分代回收参数设置和SUN/HP的不同

jvm

IBM没有设置MaxPermSize的地方,这点要注意了。

HP和SUN的JDK也有两种主要的回收策略,分别是对应高吞吐率的-XX:+UseParallelGC和快速响应时间的-XX:+UseConcMarkSweepGC。

本文主要是描述GC优化的纲领,指出不同的JDK优化对策的不同。详细的参数测试有待以后慢慢写。

相关阅读:

Java 技术,IBM 风格: IBM Developer Kit 简介

Java 理论与实践: 垃圾收集简史  可以了解为什么不同的回收策略,表现出的gc时间会如此迥异。虽然Java 技术,IBM 风格: 垃圾收集策略,第 1 部分一文也叙述的很详细,但是个人觉得《垃圾回收简史》一文写的更明了,毕竟这是最原始的设计,省略了实现过程中添加的许多特性。