??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产精品亚洲下载,亚洲AV乱码一区二区三区林ゆな,精品国产亚洲一区二区在线观看http://m.tkk7.com/chhbjh/category/3253.html阛_即ؓSUN,JAVA便ؓ咖啡。我们沐着阛_Q在郁的咖啡香中,品味~程的乐?zh-cnSun, 29 Jan 2012 14:06:27 GMTSun, 29 Jan 2012 14:06:27 GMT60探秘Java虚拟?amp;mdash;&mdash;内存理与垃圑֛?/title><link>http://m.tkk7.com/chhbjh/archive/2012/01/28/368936.html</link><dc:creator>阛_咖啡</dc:creator><author>阛_咖啡</author><pubDate>Sat, 28 Jan 2012 13:41:00 GMT</pubDate><guid>http://m.tkk7.com/chhbjh/archive/2012/01/28/368936.html</guid><wfw:comment>http://m.tkk7.com/chhbjh/comments/368936.html</wfw:comment><comments>http://m.tkk7.com/chhbjh/archive/2012/01/28/368936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/chhbjh/comments/commentRss/368936.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/chhbjh/services/trackbacks/368936.html</trackback:ping><description><![CDATA[<p>本文主要是基于Sun JDK 1.6 Garbage CollectorQ作者:毕玄Q的整理与ȝQ原文请读者在|上搜烦?/p> <p><strong>1、Java虚拟行时的数据区</strong></p> <p><a href="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_thumb_1.png" width="475" height="398"></a></p> <p><strong>2、常用的内存区域调节参数</strong></p> <p><strong>-Xms</strong>Q初始堆大小Q默认ؓ物理内存?/64(<1GB)Q默?MinHeapFreeRatio参数可以调整)IZ堆内存小?0%ӞJVM׃增大堆直?Xmx的最大限?/p> <p><strong>-Xmx</strong>Q最大堆大小Q默?MaxHeapFreeRatio参数可以调整)IZ堆内存大?0%ӞJVM会减堆直到 -Xms的最限?/p> <p><strong>-Xmn</strong>Q新生代的内存空间大,<strong>注意</strong>Q此处的大小是(eden+ 2 survivor space)。与jmap -heap中显C的New gen是不同的。整个堆大小=新生代大?+ 老生代大?+ 怹代大?<br>在保证堆大小不变的情况下Q增大新生代?会减小老生代大。此值对pȝ性能影响较大,Sun官方推荐配置为整个堆?/8?/p> <p><strong>-XX:SurvivorRatio</strong>Q新生代中Eden区域与Survivor区域的容量比|默认gؓ8。两个SurvivorZ一个Eden区的比gؓ2:8,一个Survivor区占整个q轻代的1/10?/p> <p><strong>-Xss</strong>Q每个线E的堆栈大小。JDK5.0以后每个U程堆栈大小?M,以前每个U程堆栈大小?56K。应Ҏ应用的线E所需内存大小q行适当调整。在相同物理内存?减小q个D生成更多的线E。但是操作系l对一个进E内的线E数q是有限制的Q不能无限生成,l验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该?28k够用的,大的应用使用256k。这个选项Ҏ能影响比较大,需要严格的试。和threadstacksize选项解释很类?官方文档g没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设|这个值就可以了?/p> <p><strong>-XX:PermSize</strong>Q设|永久代(perm gen)初始倹{默认gؓ物理内存?/64?/p> <p><strong>-XX:MaxPermSize</strong>Q设|持久代最大倹{物理内存的1/4?/p> <p><strong>3、内存分配方?/strong></p> <p>1Q堆上分?nbsp;  2Q栈上分?nbsp; 3Q堆外分配(DirectByteBuffer或直接用Unsafe.allocateMemory,但不推荐q种方式Q?/p> <p><strong>4、监控方?/strong></p> <p>1Q系l程序运行时可通过jstat –gcutil来查看堆中各个内存区域的变化以及GC的工作状态; <br>2Q启动时可添?XX:+PrintGCDetails  –Xloggc:<file>输出到日志文件来查看GC的状况; <br>3Qjmap –heap可用于查看各个内存空间的大小Q?/p> <p><strong>5Q断代法可用GC汇?/strong></p> <p><a href="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_thumb.png" width="581" height="460"></a></p> <p>一、新生代可用GC</p> <p>1Q串行GC(Serial Copying)Qclient模式下默认GC方式Q也可通过-XX:+UseSerialGC来强制指定;默认情况?eden、s0、s1的大通过-XX:SurvivorRatio来控Ӟ默认?Q含?<br>为eden:s0的比例,启动后可通过jmap –heap [pid]来查看?/p> <p>      默认情况下,仅在TLAB或eden上分配,只有两种情况下会在老生代分配: <br>      1、需要分配的内存大小过eden space大小Q?<br>      2、在配置了PretenureSizeThreshold的情况下Q对象大大于此倹{?/p> <p>      默认情况下,触发Minor GCӞ<br>      之前Minor GC晋到old的^均大?< 老生代的剩余I间 < eden+from Survivor的用空间。当HandlePromotionFailure为trueQ则仅触发minor gcQ如为falseQ则触发full GC?/p> <p>      默认情况下,新生代对象晋升到老生代的规则Q?/p> <p>     1、经历多ơminor gc仍存zȝ对象Q可通过以下参数来控Ӟ以MaxTenuringThresholdgؓ准,默认?5?br>     2、to space放不下的Q直接放入老生代;</p> <p>2Qƈ行GCQParNewQ:CMS GC旉认采用,也可采用-XX:+UseParNewGC强制指定Q垃圑֛收的时候采用多U程的方式?/p> <p>3Qƈ行回收GC(Parallel Scavenge)Qserver模式下默认的GC方式Q也可采?XX:+UseParallelGC强制指定Qeden、s0、s1的大可通过-XX:SurvivorRatio来控Ӟ但默认情况下<br>?XX:InitialSurivivorRatio为准Q此值默认ؓ8Q?strong>代表的ؓ新生代大?: s0</strong>Q这点要特别注意?/p> <p>      默认情况下,当TLAB、eden上分配都p|Ӟ判断需要分配的内存大小是否 >= eden space的一半大,如是q接在老生代上分配Q?/p> <p>      默认情况下的垃圾回收规则Q?/p> <p>      1、在回收前PS GC会先之前每ơPS GCӞ晋升到老生代的q_大小是否大于老生代的剩余I间Q如大于则直接触发full GCQ?br>      2、在回收后,也会按照上面的规则进行检?/p> <p>      默认情况下的新生代对象晋升到老生代的规则Q?br>     1、经历多ơminor gc仍存zȝ对象Q可通过以下参数来控ӞAlwaysTenureQ默认falseQ表C只要minor GC时存z,晋升到老生代;NeverTenureQ默认falseQ表C永不晋升到老生代;上面两个都没讄的情冴下Q如UseAdaptiveSizePolicyQ启动时以InitialTenuringThresholdg为存zL数的阈|在每ơps gc后会动态调_如不使用UseAdaptiveSizePolicyQ则以MaxTenuringThreshold为准?br>     2、to space放不下的Q直接放入老生代?/p> <p>     在回收后Q如UseAdaptiveSizePolicyQPS GC会根据运行状态动态调整eden、to以及TenuringThreshold的大。如果不希望动态调整可讄-XX:-UseAdaptiveSizePolicy。如希望跟踪每次的变化情况,可在启劢参数上增加: PrintAdaptiveSizePolicy?/p> <p>二、老生代可用GC</p> <p>1、串行GC(Serial Copying)Qclient方式下默认GC方式Q可通过-XX:+UseSerialGC强制指定?/p> <p>    触发机制汇总:<br>   1Qold genI间不Q?br>   2Qperm genI间不Q?br>   3Qminor gc时的悲观{略Q?br>   4Qminor GC后在eden上分配内存仍然失败;<br>   5Q执行heap dumpӞ<br>   6Q外部调用System.gcQ可通过-XX:+DisableExplicitGC来禁止?/p> <p>2、ƈ行回收GC(Parallel Scavenge)Q?server模式下默认GC方式Q可通过-XX:+UseParallelGC强制指定Q?q行的线E数为当cpu core<=8 ? cpu core : 3+(cpu core*5)/8或通过-XX:ParallelGCThreads=x来强制指定。如ScavengeBeforeFullGC为trueQ默认|Q则先执行minor GC?/p> <p>3、ƈ行CompactingQ可通过-XX:+UseParallelOldGC强制指定?/p> <p>4、ƈ发CMSQ可通过-XX:+UseConcMarkSweepGC来强制指定。ƈ发的U程数默认ؓ:( q行GCU程?3)/4Q也可通过ParallelCMSThreads指定?/p> <p>    触发机制Q?br>    1、当老生代空间的使用到达一定比率时触发Q?/p> <p>     Hotspot V 1.6中默认ؓ65%Q可通过PrintCMSInitiationStatisticsQ此参数在V 1.5中不能用Q来查看q个值到底是多少Q可通过CMSInitiatingOccupancyFraction来强制指定,默认值ƈ不是赋值在了这个gQ是Ҏ如下公式计算出来的: ((100 - MinHeapFreeRatio) +(double)(CMSTriggerRatio * MinHeapFreeRatio) / 100.0)/ 100.0; 其中,MinHeapFreeRatio默认| 40   CMSTriggerRatio默认| 80?/p> <p>     2、当perm gen采用CMS攉且空间用到一定比率时触发Q?/p> <p>     perm gen采用CMS攉需讄Q?XX:+CMSClassUnloadingEnabled   Hotspot V 1.6中默认ؓ65%Q可通过CMSInitiatingPermOccupancyFraction来强制指定,同样Q它是根据如下公式计出来的Q?(100 - MinHeapFreeRatio) +(double)(CMSTriggerPermRatio* MinHeapFreeRatio) / 100.0)/ 100.0; 其中QMinHeapFreeRatio默认| 40    CMSTriggerPermRatio默认| 80?/p> <p>      3、HotspotҎ成本计算军_是否需要执行CMS GCQ可通过-XX:+UseCMSInitiatingOccupancyOnly来去掉这个动态执行的{略?br>      4、外部调用了System.gcQ且讄了ExplicitGCInvokesConcurrentQ需要注意,在hotspot 6中,在这U情况下如应用同时用了NIOQ可能会出现bug?/p> <p><strong>6、GCl合</strong></p> <p>1Q默认GCl合</p> <p><a href="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_9.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_thumb_3.png" width="638" height="125"></a></p> <p>2Q可选的GCl合</p> <p><a href="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_11.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://m.tkk7.com/images/blogjava_net/chhbjh/Windows-Live-Writer/2d08114b62d1_AA6A/image_thumb_4.png" width="638" height="441"></a></p> <p><strong>7、GC监测</strong></p> <p>1Qjstat –gcutil [pid] [intervel] [count]<br>2Q?verbose:gc // 可以辅助输出一些详l的GC信息Q?XX:+PrintGCDetails // 输出GC详细信息Q?XX:+PrintGCApplicationStoppedTime // 输出GC造成应用暂停的时?br>-XX:+PrintGCDateStamps // GC发生的时间信息;-XX:+PrintHeapAtGC // 在GC前后输出堆中各个区域的大;-Xloggc:[file] // GC信息输出到单独的文g中,都加上,q个消耗不大,而且Ҏ问题和调优有很大的帮助。gc的日志拿下来后可使用GCLogViewer或gchistoq行分析?br>3Q图形化的情况下可直接用jvisualvmq行分析?/p> <p>4Q查看内存的消耗状?/p> <p>      Q?Q长期消耗,可以直接dumpQ然后MAT(内存分析工具)查看卛_</p> <p>      Q?Q短期消耗,囑Ş界面情况下,可用jvisualvm的memory profiler或jprofiler?/p> <p><strong>8、系l调优方?/strong></p> <p><strong>步骤Q?、评估现?2、设定目?3、尝试调?4、衡量调?5、细微调?/strong></p> <p><strong>讑֮目标Q?/strong></p> <p>1Q降低Full GC的执行频率?<br>2Q降低Full GC的消耗时_<br>3Q降低Full GC所造成的应用停时_<br>4Q降低Minor GC执行频率Q?br>5Q降低Minor GC消耗时_<br>例如某系l的GC调优目标Q降低Full GC执行频率的同Ӟ可能降低minor GC的执行频率、消耗时间以及GC对应用造成的停时间?/p> <p><strong>衡量调优Q?/strong></p> <p>1、衡量工?br>1Q打印GC日志信息Q?XX:+PrintGCDetails –XX:+PrintGCApplicationStoppedTime -Xloggc: {文g名}  -XX:+PrintGCTimeStamps<br>2QjmapQ(׃每个版本jvm的默认值可能会有改变,q是用jmap首先观察下目前每个代的内存大、GC方式Q??br>3Q运行状늛工Pjstat、jvisualvm、sar 、gclogviewer</p> <p>2、应攉的信?br>1Qminor gc的执行频率;full gc的执行频率,每次GC耗时多少Q?br>2Q高峰期什么状况?<br>3Qminor gc回收的效果如何?survivor的消耗状况如何,每次有多对象会q入老生代?<br>4Qfull gc回收的效果如何?Q简单的<strong>memory leak</strong>判断ҎQ?br>5Q系l的load、cpu消耗、qps or tps、响应时?/p> <p>QPS每秒查询率:是对一个特定的查询服务器在规定旉内所处理量多少的衡量标准。在因特|上Q作为域名服务器的机器性能l常用每U查询率来衡量。对应fetches/secQ即每秒的响应请求数Q也x最大吞吐能力?br>TPS(Transaction Per Second)Q每U钟pȝ能够处理的交易或事务的数量?/p> <p><strong>试调优Q?/strong></p> <p>注意Java RMI的定时GC触发机制Q可通过Q?XX:+DisableExplicitGC来禁止或通过 -Dsun.rmi.dgc.server.gcInterval=3600000来控制触发的旉?/p> <p>1Q降低Full GC执行频率 ?通常瓉<br>老生代本w占用的内存I间׃直偏高,所以只要稍微放点对象到老生代,full GC了;<br>通常原因Q系l缓存的东西太多Q?br>例如Q用oracle 10g驱动时preparedstatement cache太大Q?br>查找办法Q现执行Dump然后再进行MAT分析Q?/p> <p>Q?QMinor GC后L有对象不断的q入老生代,D老生代不断的?br>通常原因QSurvivor太小?br>pȝ表现Q系l响应太慢、请求量太大、每ơ请求分配的内存太多、分配的对象太大...<br>查找办法Q分析两ơminor GC之间到底哪些地方分配了内存;<br>利用jstat观察Survivor的消耗状况,-XX:PrintHeapAtGCQ输出GC前后的详l信息;<br>对于pȝ响应慢可以采用系l优化,不是GC优化的内容;</p> <p>Q?Q老生代的内存占用一直偏?br>调优ҎQ① 扩大老生代的大小Q减新生代的大或调大heap?大小Q;<br>减少new注意对minor gc的媄响ƈ且同时有可能造成full gcq是严重Q?br>调大heap注意full gc的时间的廉Qcpu够强悍嘛Qos?2 bit的吗Q?br>?E序优化Q去掉一些不必要的缓存)</p> <p>Q?QMinor GC后L有对象不断的q入老生?br>前提Q这些进入老生代的对象在full GC时大部分都会被回?br>调优ҎQ?br>?降低Minor GC的执行频率;<br>?让对象尽量在Minor GC中就被回收掉Q增大Eden区、增大survivor、增大TenuringThresholdQ注意这些可能会造成minor gc执行频繁Q?br>?切换成CMS GCQ老生代还没有满就回收掉,从而降低Full GC触发的可能性;<br>?E序优化Q提升响应速度、降低每ơ请求分配的内存?/p> <p>Q?Q降低单ơFull GC的执行时?br>通常原因Q老生代太大了...<br>调优ҎQ?Q是q行GC吗?   2Q升UCPU  3Q减Heap或老生?/p> <p>Q?Q降低Minor GC执行频率<br>通常原因Q每ơ请求分配的内存多、请求量?br>通常办法Q?Q扩大heap、扩大新生代、扩大eden。注意点Q降低每ơ请求分配的内存Q横向增加机器的数量分担h的数量?/p> <p>Q?Q降低Minor GC执行旉<br>通常原因Q新生代太大了,响应速度太慢了,D每次Minor GC时存zȝ对象?br>通常办法Q?Q减点新生代吧Q?Q增加CPU的数量、升UCPU的配|;加快pȝ的响应速度</p> <p><strong>l微调整Q?/strong></p> <p>首先需要了解以下情况:</p> <p>?当响应速度下降到多或h量上涨到多少Ӟpȝ会宕掉?</p> <p>?参数调整后系l多久会执行一ơMinor GCQ多久会执行一ơFull GCQ高峰期会如何?</p> <p>需要计的量:</p> <p>①每ơ请求^均需要分配多内存?pȝ的^均响应时间是多少呢?h量是多少、多常时间执行一ơMinor GC、Full GCQ?/p> <p>②现有参CQ应该是多久一ơMinor GC、Full GCQ对比真实状况,做一定的调整Q?/p> <p>必杀技Q提升响应速度、降低每ơ请求分配的内存Q?/p> <p><strong>9、系l调优D?/strong></p> <p>     现象Q?、系l响应速度大概?00msQ?、当pȝQPS增长?0Ӟ机器每隔5U就执行一ơminor gcQ每?分钟执行一ơfull gcQƈ且很快就一直full GC了;4、每ơFull gc后旧生代大概会消?00MQ有点多了?/p> <p>     解决ҎQ解决Full GCơ数q多的问?/p> <p>    Q?Q降低响应时间或hơ数Q这个需要重构,比较ȝQ——这个是l极ҎQ往往能够利的解决问题,因ؓ大部分的问题均是q序自w造成的?/p> <p>    Q?Q减老生代内存的消耗,比较靠谱Q——可以通过分析Dump文gQjmap dumpQ,q利用MAT查找内存消耗的原因Q从而发现程序中造成老生代内存消耗的原因?/p> <p>    Q?Q减每ơ请求的内存的消耗,貌似比较靠谱Q——这个是市蜃楼Q没有太好的办法?/p> <p>    Q?Q降低GC造成的应用暂停的旉——可以采用CMS GS垃圾回收器。参数设|如下:</p> <p>     -Xms1536m -Xmx1536m -Xmn700m -XX:SurvivorRatio=7 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection </p> <p>     -XX:CMSMaxAbortablePrecleanTime=1000 -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC</p> <p>    Q?Q减每ơminor gc晋升到old的对象。可选方法:1Q?调大新生代?Q调大Survivor?Q调大TenuringThreshold?/p> <p>      调大SurvivorQ当前采用PS GCQSurvivor space会被动态调整。由于调整幅度很,D了经常有对象直接转移C老生代;于是止Survivor区的动态调整了Q?XX:-UseAdaptiveSizePolicyQƈ计算Survivor Space需要的大小Q于是l观察,q做微调…。最l将Full GC推迟?时1ơ?/p> <p><strong>10、垃圑֛收的实现原理</strong></p> <p>      内存回收的实现方法:1Q引用计敎ͼ不适合复杂对象的引用关p,其是@环依赖的场景?Q有向图TracingQ适合于复杂对象的引用关系场景QHotspot采用q种。常用算法:Copying、Mark-Sweep、Mark-Compact?/p> <p>      Hotspot从root set开始扫描有引用的对象ƈ对Referencecd的对象进行特D处理?br>      以下是Root Set的列表:1Q当前正在执行的U程Q?Q全局/静态变量;3QJVM HandlesQ?QJNI ?Java Native Interface 】HandlesQ?/p> <p>      另外Qminor GC只扫描新生代Q当老生代的对象引用了新生代的对象时Q会采用如下的处理方式:在给对象赋引用时Q会l过一个write barrier的过E,以便查是否有老生代引用新生代对象的情况,如有则记录到remember set中。ƈ在minor gcӞremember set指向的新生代对象也作为root set?/p> <p>     <strong>新生代串行GC(Serial Copying)Q?/strong> </p> <p>     新生代串行GC(Serial Copying)完整内存的分配策略:</p> <p>     1Q首先在TLABQ本地线E分配缓冲区Q上试分配Q?br>     2Q检查是否需要在新生代上分配Q如需要分配的大小于PretenureSizeThresholdQ则在edenZq行分配Q分配成功则q回Q分配失败则l箋Q?br>     3Q检查是否需要尝试在老生代上分配Q如需要,则遍历所有代q检查是否可在该代上分配Q如可以则进行分配;如不需要在老生代上试分配Q则l箋Q?br>     4Q根据策略决定执行新生代GC或Full GCQ执行full gc时不清除soft RefQ?br>     5Q如需要分配的大小大于PretenureSizeThresholdQ尝试在老生代上分配Q否则尝试在新生代上分配Q?br>     6Q尝试扩大堆q分配;<br>     7Q执行full gcQƈ清除所有soft RefQ按步骤5l箋试分配?nbsp;  </p> <p>     新生代串行GC(Serial Copying)完整内存回收{略<br>     1Q检查to是否为空Q不为空q回falseQ?br>     2Q检查老生代剩余空间是否大于当前eden+from已用的大,如大于则q回trueQ如于且HandlePromotionFailure为trueQ则查剩余空间是否大于之前每ơminor gc晋到老生代的q_大小Q如大于q回trueQ如于q回false?br>     3Q如上面的结果ؓfalseQ则执行full gcQ如上面的结果ؓtrueQ执行下面的步骤Q?br>     4Q扫描引用关p,活的对象copy到to spaceQ如对象在minor gc中的存活ơ数过tenuring_threshold或分配失败,则往老生代复Ӟ如仍然复制失败,则取决于HandlePromotionFailureQ如不需要处理,直接抛出OOMQƈ退出vmQ如需处理Q则保持q些新生代对象不动;</p> <p>    <strong>新生代可用GC-PS</strong></p> <p>    完整内存分配{略<br>    1Q先在TLAB上分配,分配p|则直接在eden上分配;<br>    2Q当eden上分配失败时Q检查需要分配的大小是否 >= eden space的一半,如是Q则直接在老生代分配;<br>    3Q如分配仍然p|Q且gc已超q频率,则抛出OOMQ?br>    4Q进入基本分配策略失败的模式Q?br>    5Q执行PS GCQ在eden上分配;<br>    6Q执行非最大压~的full gcQ在eden上分配;<br>    7Q在旧生代上分配Q?br>    8Q执行最大压~full gcQ在eden上分配;<br>    9Q在旧生代上分配Q?br>    10Q如q失败,回到2?/p> <p>   最悲惨的情况,分配触发多次PS GC和多ơFull GCQ直到OOM?/p> <p>   完整内存回收{略<br>   1Q如gc所执行的时间超q,直接l束Q?br>   2Q先调用invoke_nopolicy<br>       2.1 先检查是不是要尝试scavengeQ?br>       2.1.1 to space必须为空Q如不ؓI,则返回falseQ?br>       2.1.2 获取之前所有minor gc晋到old的^均大,q对比目前eden+from已用的大小Q取更小的一个|如老生代剩余空间小于此|则返回falseQ如大于则返回trueQ?br>       2.2 如不需要尝试scavengeQ则q回falseQ否则l;<br>       2.3 多线E扫描活的对象,q基亍copying法回收Q回收时相应的晋升对象到旧生代;<br>       2.4 如UseAdaptiveSizePolicyQ那么重新计to space和tenuringThreshold的|q调整?br>   3Q如invoke_nopolicyq回的是falseQ或之前所有minor gc晋到老生代的q_大小 > 旧生代的剩余I间Q那么l下面的步骤Q否则结束;<br>   4Q如UseParallelOldGCQ则执行PSParallelCompactQ如不是UseParallelOldGCQ则执行PSMarkSweep?/p> <p>    <strong>老生代ƈ行CMS GCQ?/strong></p> <p><strong>    优缺点:</strong></p> <p><strong>    </strong>1Q?大部分时候和应用q发q行Q因此只会造成很短的暂停时_<br>    2QQ动垃圾,没办法,所以内存空间要E微大一点;<br>    3Q内存碎片,-XX:+UseCMSCompactAtFullCollection 来解冻I<br>    4Q?争抢CPUQ这GC方式pP<br>    5Q多ơremarkQ所以ȝgc旉会比q行的长Q?br>    6Q内存分配,free list方式Qso性能E差Q对minor GC会有一点媄响;<br>    7Q和应用q发Q有可能分配和回收同Ӟ产生竞争Q引入了锁,JVM分配优先?/p> <p><strong>11、TLAB的解?/strong></p> <p>     堆内的对象数据是各个U程所׃n的,所以当在堆内创建新的对象时Q就需要进行锁操作。锁操作是比较耗时Q因此JVM为每个线在堆上分配了一块“自留地”——TLAB(全称是Thread Local Allocation Buffer)Q位于堆内存的新生代Q也是Eden区。每个线E在创徏新的对象Ӟ会首先尝试在自己的TLAB里进行分配,如果成功p回,p|了再到共享的Eden区里ȝL间。在U程自己的TLAB区域创徏对象p|一般有两个原因Q一是对象太大,二是自己的TLAB区剩余空间不够。通常默认的TLAB区域大小是Eden区域?%Q当然也可以手工q行调整Q对应的JVM参数?XX:TLABWasteTargetPercent? <p>参考文献: <p>1、Sun JDK 1.6 GCQGarbage CollectorQ?nbsp; 作者:毕玄</p><img src ="http://m.tkk7.com/chhbjh/aggbug/368936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/chhbjh/" target="_blank">阛_咖啡</a> 2012-01-28 21:41 <a href="http://m.tkk7.com/chhbjh/archive/2012/01/28/368936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型电子政务目问题ȝhttp://m.tkk7.com/chhbjh/archive/2011/12/09/360282.html阛_咖啡阛_咖啡Fri, 09 Dec 2011 05:02:00 GMThttp://m.tkk7.com/chhbjh/archive/2011/12/09/360282.htmlhttp://m.tkk7.com/chhbjh/comments/360282.htmlhttp://m.tkk7.com/chhbjh/archive/2011/12/09/360282.html#Feedback4http://m.tkk7.com/chhbjh/comments/commentRss/360282.htmlhttp://m.tkk7.com/chhbjh/services/trackbacks/360282.html一、项目管理方?/strong>

1、业丅R总集成商、监理单位、承建单位、品供货单位的沟通协调问题。首先,在与业主的沟通方面,最初较为؜乱,主要原因是没有Ş成统一的沟通结构与机制Q在最初的q三个月的时间里D目推进速度非常~慢。经与业d位沟通,制定了工E的沟通方案,建立了沟通组l结构。主要内Ҏ在业d位方面徏立了目实施办,目实施办对部领导组成的目办负责,明确了项目办与实施办的责任,由实施办协调信息中心各处室共同推q项目工作;q且在信息中心内部推?#8220;承诺?#8221;也就是各处室均对工程的徏讑ֆ容进行承诺ƈ与W效挂钩。其ơ,总集成商、ȝ理商与实施办沟通,实施办与相关处室沟通,承徏商与产品供货单位在技术上接受总集成商的指gU束Q在程的规范性上接受ȝ理商的指gU束Q在业务上接受信息中心负责处室的U束。由此,通过沟通方案徏立与推行Q项目的沟通协调方面才q入了正轨,目的推q速度明显加快?

2、用户单位对目的支持度{方面的问题。某些用户单位对所的项目ƈ没有强烈的需求,持可有可无或最好没有的态度Q但在工E的初设中这些项目又是必d讄内容。因此,在项目的实施的过E中Q这写用户单位对目的各工作均持消极态度Q得项目无法正常推q。例如,有些用户单位不组l本单位人员配合需求调研,不组l下属各省单位q行pȝ试运行,不组l本单位人员q行用户试{。对于这些问题往往pȝ承徏商方面已无法推动Q需要通过实施办与目办层面与用户单位沟通协商一致后才能l箋开展工作?

3、部本目与省U项目的协调推进问题。由于在工程的可研中包含各省的项目徏设,各省的进度对整体目的最l验收具有制U作用。目前,各省的徏设情况各不一_有的已经完成Q有的正在徏设过E中Q有的资金尚未批复。。?

二、技术架构方?/strong>

1、应用系l部|架构问题。在09q底的时候,在应用系l部|架构出C一?#8220;互联|区应用pȝ讉KOracle RAC数据库时断时l问?#8221;Q此问题先后持箋??个月Q制U了目的徏设进度(期间采用了其他方式,量减少了损失)。原?Q在q行整体应用pȝ部v架构设计Ӟ未q行相应产品的招标,因此无法明确具体的品(各品在具体的实现层面有差别Q这些差别可能媄响部|架构的实现Q。原?Q各厂商均具有专业领域的知识背景Q但对各知识领域之间的把握较,因此很可能在边缘领域出现问题。原?Q由于本目为大型的电子政务目Q涉及的专业知识领域和技术手D非常繁杂,在设计与试q程中非常困难。在实施办与总集的M协调下,l过多次的评审与大量的测试,对应用系l部|架构进行了调整Q问题成功解决。此c问题的解决Ҏ是由总集成商牵头Q召集相关的承徏单位Q如|络集成商、安全集成商、数据库提供商。。。共同讨论分析,制定问题的排查方案,q按照方案查N题的原因。待问题的原因查找清楚后Q再由总集成商召集相关承徏商共同讨论提x法,l实施办审核通过Q如重大技术问题可由实施办召集专家q行评审定Q?

2、部分系l试q行阶段性能低下与生产环境问题排查困隄。一斚wQ工E所用到的技术非常复杂,采用了大量的讑֤Q如 Oralce RAC集群Q存储,IBM型机、负载均衡集等Q此U环境很难有一个企业(如承建单位或W三Ҏ试单位)复制。因此,无论是承建单位还是第三方试单位所q行的测试均无法完全反映生环境下的性能指标。另一斚wQ此U生产环境也是初ơ搭建,其技术可行性只停留在理论层面,期间的技术细节无法完全在设计阶段考虑刎ͼ只能通过一D|间的pȝ试运行才能够暴露与完善。当Ӟ如果能够在系l进行初步设计时Q能够考虑搭徏一套与生环境完全或基本一致的试环境Q此问题能够很方便的进行解冻I也就是可以在试环境中进行应用系l的压力试与问题排查,待系l稳定后q满用戯求时Q再系l迁U至正式的生产环境中Q这U方式可以最大程度的保持生环境的稳定性?/p>

阛_咖啡 2011-12-09 13:02 发表评论
]]>
关于q发用户数、系l用h和同时在U用h{概늚辨析http://m.tkk7.com/chhbjh/archive/2011/12/09/365952.html阛_咖啡阛_咖啡Fri, 09 Dec 2011 04:46:00 GMThttp://m.tkk7.com/chhbjh/archive/2011/12/09/365952.htmlhttp://m.tkk7.com/chhbjh/comments/365952.htmlhttp://m.tkk7.com/chhbjh/archive/2011/12/09/365952.html#Feedback0http://m.tkk7.com/chhbjh/comments/commentRss/365952.htmlhttp://m.tkk7.com/chhbjh/services/trackbacks/365952.html

        以下内容l合了其他网友发表的内容Q首先再ơ表C感谢?/p>

        假设一个系l有2000个用者(对于一般的企业pȝQ这个概忉|较简单,是指数据库中的用户LQ但对于|站型的pȝ而言Q相对较为复杂,一般ؓ注册用户和游客的dQ,也就是说Q该pȝ的用hL?000名,q个概念表示的是“pȝ用户?#8221;。如果该pȝh“ 在线l计”功能Q该功能一般用于记录系l中所有已l登录的用户Q当然如果有一些系l功能同时也提供l未d的用户用,那么未登录的当前使用者也应记录进来)Q如果根据此l计l果得到最高峰时有500人在U,那么q个500是所说的“同时在线用户?#8221;?
    Ҏ对业务ƈ发用h的定义,q?00是整个pȝ使用时最大的业务q发用户数。当Ӟ500q个数值只是表明在最高峰时刻?00个用L录了pȝQƈ不表C实际服务器承受的压力。因为服务器承受的压力还与具体的用户讉K模式相关。例如,考察具体的某一个时间点Q在q?00?#8220;同时在线用户?#8221;中,其中40%的用户在较有兴致地看pȝ公告Q注意:“?#8221;q个动作是不会对服务端生Q何负担的Q,20%的用户在填写复杂的表|对用户填写的表格来说Q只有在“提交”的时L会向服务端发送请求,填写q程是不Ҏ务端构成压力的)Q?0%部分用户在发呆(也就是什么也没有做)Q剩下的 20%用户在不停地从一个页面蟩转到另一个页?#8212;—在这U场景下Q可以说Q只?0%的用L正对服务器构成了压力。因此,从上面的例子中可以看出,服务器实际承受的压力不只取决于业务ƈ发用hQ还取决于用L业务场景?
在实际的性能试工作中,试人员一般比较关心的是业务ƈ发用hQ也是从业务角度关注究竟应该设|多个q发数比较合理,因此Q在后面的讨ZQ也是主要针对业务ƈ发用hq行讨论Q?font color="#ff0000">而且Z方便Q直接将业务q发用户数称为ƈ发用h?/font>
Q?Q?计算q_的ƈ发用hQ?C = nL/T
Q?Q?q发用户数峰| C’ ≈ C+3根号C
公式Q?Q中C是^均的q发用户敎ͼn是login session的数量;L是login session的^均长度;T指考察的时间段长度?
公式Q?Q给Zq发用户数峰值的计算方式Q其中C’指ƈ发用h的峰|C是公式Q?Q中得到的^均的q发用户数。该公式的得出是假设用户的login session产生W合泊松分布而估得到的?
实例Q?
假设有一个OApȝQ该pȝ?000个用Pq_每天大约?00个用戯讉K该系l,对一个典型用h_一天之内用户从d到退pȝ的^均时间ؓ4时Q在一天的旉内,用户只在8时内用该pȝ?
则根据公式(1Q和公式Q?Q,可以得到Q?
C = 400*4/8 = 200
C’≈200+3*根号200 = 242

       以下是测试所需的一些常用公式,仅供参?/p>

        F=VU * R / T   R = T / TS

       其中F为吞吐量QVU表示虚拟用户个数QR表示每个虚拟用户发出的请求数QT表示性能试所用的旉QTS为用h考时??/p>

阛_咖啡 2011-12-09 12:46 发表评论
]]>
Uml2随笔http://m.tkk7.com/chhbjh/archive/2006/03/31/38510.html阛_咖啡阛_咖啡Fri, 31 Mar 2006 09:09:00 GMThttp://m.tkk7.com/chhbjh/archive/2006/03/31/38510.htmlhttp://m.tkk7.com/chhbjh/comments/38510.htmlhttp://m.tkk7.com/chhbjh/archive/2006/03/31/38510.html#Feedback0http://m.tkk7.com/chhbjh/comments/commentRss/38510.htmlhttp://m.tkk7.com/chhbjh/services/trackbacks/38510.html
   UML随想及UML2.0的图分类Q?br />   使用
UML 上的差异共有以下三种Q?/span> 1 、分别将 UML 视ؓ草稿、蓝图与E序语言三种不同用法?/span> 2 、以软g观点和概忉|观Ҏ看待 UML ?/span> 3 ?/span> UML 的本质在于图或超模型?/span>

1 、搭配草Eѝ蓝图两U用法的步骤?/span>

1Q?span style="FONT: 7pt 'Times New Roman'">  先画?/span> UML 草稿

2Q?span style="FONT: 7pt 'Times New Roman'">  ?/span> CASE 工具用正向工E{出程序码大纲

3Q?span style="FONT: 7pt 'Times New Roman'">  修改E序?/span>

4Q?span style="FONT: 7pt 'Times New Roman'">  定期从程序码?/span> CASE 工具用反向工E{?/span> UML 设计模型

?/span> UML 视ؓ草稿是在?/span> [ 选择?/span> ] 。选择主要的模块进行讨论?/span>

?/span> UML 视ؓ蓝图是在?/span> [ 完整?/span> ] 。这U做法可以用在所?/span> [ l节 ] 的工作上Q也可以针对特定的部分化图?/span>

模型驱动开发架构( Model Driven Architecture Q?/span> MDA Q: MDA ?/span> UML 视ؓE序语言的标准用法?/span> MDA 开发分Z个主要部分,模型建立者会负责产生于^台无关的模型 Q?/span> Platform Independent Model Q?/span> PIM Q, PIM 代表与Q何与特定格式无关?/span> UML 模型。然后工具可以把 PIM 转换为^台特有模型( PSM Q, PSM 是在某个特定执行环境之上的模型,其他工具可以?/span> PSM 转换为某个^C上的E序码?/span>

UML 的创造者认?/span> UML 的本质在于超模型Q图仅仅是超模型的展现而已?/span>

个h推荐?span lang="EN-US">UML作ؓ草稿的用法,

UML2.0 中的囑օ有如?span lang="EN-US">11U:

1?span style="FONT: 7pt 'Times New Roman'">  zd图(activity diagramQ?span lang="EN-US">

2?span style="FONT: 7pt 'Times New Roman'">  cdQ?span lang="EN-US">Class diagramQ?/span>

3?span style="FONT: 7pt 'Times New Roman'">  合作图( communicationdiagram diagram Q:对象件的互动情ŞQ焦点在q接关系?/span>

4?span style="FONT: 7pt 'Times New Roman'">  元g图(component diagramQ元件结构与q接关系

5?span style="FONT: 7pt 'Times New Roman'">  合成l构Q?span lang="EN-US">composite structureQ类别在执行期的合成情ŞQ?span lang="EN-US">UML2 新增 Q?/span>

6?span style="FONT: 7pt 'Times New Roman'">  配置图(deployment diagramQ将工作成果配置到节点上

7?span style="FONT: 7pt 'Times New Roman'">  互动概图Q?span lang="EN-US">interaction overview diagramQ؜合时序图与活动图两者(UML2新增Q?/span>

8?span style="FONT: 7pt 'Times New Roman'">  对象图(object diagramQ?/span>

9?span style="FONT: 7pt 'Times New Roman'">  套g图(package diagramQ编译器的阶层结?/span>

10?span style="FONT: 7pt 'Times New Roman'">  时序图(sequence diagramQ对象间的互动情形,焦点在信息的先后序?span lang="EN-US">

11?span style="FONT: 7pt 'Times New Roman'">              状态机图(state machine diagramQ说明事件在对象中的生命力,如何改变状?span lang="EN-US">

12?span style="FONT: 7pt 'Times New Roman'">              时序图(timing diagrameQ对象间的互动情形(UML2新增Q?span lang="EN-US">

13?span style="FONT: 7pt 'Times New Roman'">              用例图(use case diagrameQ说明用者如何与pȝq行交互

 



阛_咖啡 2006-03-31 17:09 发表评论
]]>
Apache Jakarta Log4J(学习W记)http://m.tkk7.com/chhbjh/archive/2005/09/07/12309.html阛_咖啡阛_咖啡Wed, 07 Sep 2005 04:22:00 GMThttp://m.tkk7.com/chhbjh/archive/2005/09/07/12309.htmlhttp://m.tkk7.com/chhbjh/comments/12309.htmlhttp://m.tkk7.com/chhbjh/archive/2005/09/07/12309.html#Feedback0http://m.tkk7.com/chhbjh/comments/commentRss/12309.htmlhttp://m.tkk7.com/chhbjh/services/trackbacks/12309.html阅读全文

阛_咖啡 2005-09-07 12:22 发表评论
]]>
Log学习W记http://m.tkk7.com/chhbjh/archive/2005/09/07/12305.html阛_咖啡阛_咖啡Wed, 07 Sep 2005 03:33:00 GMThttp://m.tkk7.com/chhbjh/archive/2005/09/07/12305.htmlhttp://m.tkk7.com/chhbjh/comments/12305.htmlhttp://m.tkk7.com/chhbjh/archive/2005/09/07/12305.html#Feedback0http://m.tkk7.com/chhbjh/comments/commentRss/12305.htmlhttp://m.tkk7.com/chhbjh/services/trackbacks/12305.htmlJakarta Commons Logging(JCL)学习W记

?/SPAN>Q?/SPAN>JCL提供一个日志接口,同时兼顾轻量U和不依赖于具体的日志实现工兗?/SPAN>

入门Q?/SPAN>JCL有两个基本的抽象c:Log(基本U录?/SPAN>)?/SPAN>LogFactory(负责创徏Log实例)?/SPAN>JCLL日志工具的过E如下:

一?SPAN style="FONT: 7pt 'Times New Roman'">              L当前?/SPAN>factory中名?/SPAN>org.apache. commons.logging.Log配置属性的倹{?/SPAN>

二?SPAN style="FONT: 7pt 'Times New Roman'">              Lpȝ属性中名叫org.apache.commons.logging.Log的倹{?/SPAN>

三?SPAN style="FONT: 7pt 'Times New Roman'">              如果应用E序?/SPAN>CLASSPATH中有Log4j,q是用相关的包装c(wrapperQ类Q?/SPAN>Log4JloggerQ?/SPAN>.

四?SPAN style="FONT: 7pt 'Times New Roman'">              如果应用E序q行?/SPAN>jdk1.4的系l中Q用相关的包装c?/SPAN>(JDK1.4logger).

五?SPAN style="FONT: 7pt 'Times New Roman'">              使用易日志包装类Q?/SPAN>SimpleLogQ?/SPAN>.

使用logging:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class MyClass{

private static Log log=LogFactory.getLog(this.CLASS);

………………………?o:p>

}

q些日志信息被送往日志器,如上例中?/SPAN>log?/SPAN>

Log接口中的ҎQ?/SPAN>

定义日志信息的别,按严重性有Q?/SPAN>

log.fatal(Object message);

log.fatal(Object message,Throwable t);

log.error(Object message);

log.error(Object message,Throwable t);

log.warn(Object message);

log.warn(Object message,Throwable t);

log.info(Object message);

log.info(Object message,Throwable t);

log.debug(Object message);

log.debug(Object message,Throwable t);

log.trace(Object message);

log.trace(Object message,Throwable t);

fatal:非常严重的错误,Dpȝl止。期望这cM息被立即昄到状态控制台上?/SPAN>

Error:其他q行期错误或不是预期的条件。期望这cM息被立即昄到状态控制台上?/SPAN>

Warn:使用了不赞成使用?/SPAN>API、非常拙劣的使用?/SPAN>API、‘几乎就是错误’其他运行期不合需要和不合预期的状态(但没必要其UCؓ错误Q。期望这cM息被立即昄到状态控制台上?/SPAN>

Info:q行期生的有意义的事g。期望这cM息被立即昄到状态控制台上?/SPAN>

Debug:pȝ程中的l节信息。期望这cM息仅被写入日志文件中?/SPAN>

Trace:更加l节的信息。期望这cM息仅被写入日志文件中?/SPAN>

用于代码保护(表示如果启用了某U日志信息?/SPAN>)Q?/SPAN>

log.isFatalEnabled();

log.isErrorEnabled();

log.isWarnEnabled();

log.isInfoEnabled();

log.isDebugEnabled();

log.isTraceEnabled();

通常情况下,记录器的U别不低?/SPAN>info,通常情况?/SPAN>debug信息不应被写?/SPAN>log文g中?/SPAN>

工作机理Q?/SPAN>

一?SPAN style="FONT: 7pt 'Times New Roman'">             生命周期Q?/SPAN>JCL LogFactory必须实现建立/断开到日志工Lq接Q实例化/初始?/SPAN>/解构一个日志工兗?/SPAN>

二?SPAN style="FONT: 7pt 'Times New Roman'">             异常处理Q?/SPAN>JCL Log接口没有实现M异常处理Q对接口的实现必L获ƈ处理异常?/SPAN>

记录器的讄Q?/SPAN>log4j?/SPAN>JCL的首选记录器Q?/SPAN>

参数

值域

默认?/SPAN>

说明

Log4j.configuration

 

Log4j.properties

指定配置文g的名?/SPAN>

Log4j.rootCategory

Priority[,appender].*

 

讑֮根记录器U别

Log4j.logger.

Debug,info,trace,error,fatal

讑֮q个记录器的U别

 

Log4j.appender..Threshold

priority

指定U录讑֤的最低别(console,files,sockets,othersQ?/SPAN>

 



阛_咖啡 2005-09-07 11:33 发表评论
]]>
վ֩ģ壺 91ƷѾþþþþ| AVƬ| ˾Ʒձר6| պƵѿ| 51ҹƷƵ| ޳a߹ۿ| ѹaƬվ| ˿Ƶ| ëƬѹۿ| һػɫƬ| þaaëƬѲŰ| ɫWWW߹ۿ| þӰԺһ| ƵѴȫϼ| δʮ˽˸ӰԺ| ˳ɵӰվ| ޾Ʒ޿һ | ҳվ߹ۿѸ| ˾ҹƵ| ޾Ʒһ | һëƬaѲɫ| רһ·߶| ޹Ʒ۲ӰԺ߹ۿ | ӰԺ޹һҳ| Ƶ߹ۿ| һɫվ| ޳˼С˵| ޵Ӱһ| avרavý | һɪ| ƷƬ߹ۿ| պѸƵ| ˾Ʒ| վ߿| ѵĻվ˵| vva| ŷ޾þþƷ| AVĻɫ| ž޹Ʒ| ȫԼƵ| պѸƵ|