﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-nod0620-文章分类-小打小闹</title><link>http://www.blogjava.net/nod0620/category/48488.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 25 Aug 2011 22:38:41 GMT</lastBuildDate><pubDate>Thu, 25 Aug 2011 22:38:41 GMT</pubDate><ttl>60</ttl><item><title>消息中间件想法</title><link>http://www.blogjava.net/nod0620/articles/357115.html</link><dc:creator>nod0620</dc:creator><author>nod0620</author><pubDate>Tue, 23 Aug 2011 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/nod0620/articles/357115.html</guid><wfw:comment>http://www.blogjava.net/nod0620/comments/357115.html</wfw:comment><comments>http://www.blogjava.net/nod0620/articles/357115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nod0620/comments/commentRss/357115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nod0620/services/trackbacks/357115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 当两个系统需要进行交互的时候，一般都webservice，rmi，或者rpc的调用，这些都是常用的，但是两个系统之间耦合很大，之间多是同步的调用，一个系统的不健康可能会影响到另外一个系统，j2ee规范中还有jms可以使用，利用jms两个系统之间就可以进行异步通信了.<br />&nbsp;&nbsp;&nbsp;&nbsp; 我厂在jms的思想上自己研发了一个高可靠性的，高性能的消息中间件，实现了自己的分布式事务处理<br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/nod0620/message.jpg" height="227" width="712" /><br /><br />一般是消息发布者发送到消息服务器，消息服务器保存在队列或者文件或者DB中，之后转发给订阅者<br /><br /><h3>高可靠性</h3><div>  <p><span style="font-family: 宋体;">由于是分布式应用，可靠性就有如下方面的要求：</span></p>    <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">发布者发送消息到</span>message server<span style="font-family: 宋体;">，</span>message server<span style="font-family: 宋体;">能不能收到，收到后怎么做，</span>message sever<span style="font-family: 宋体;">明确收不到怎么办</span>.<span><span><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><div>2. message server<span style="font-family: 宋体;">投递消息给订阅者，消息投递成功，订阅者怎么做；消息投递失败，</span>message server <span style="font-family: 宋体;">怎么做.<br /><br /><br /><div>  <p>message server一般<span style="font-family: 宋体;">的处理方法：</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">发布者发送消息到message</span> server<span style="font-family: 宋体;">，当message</span> server<span style="font-family: 宋体;">收到消息，首先保存消息，然后发送成功响应给发布者，这样正常情况下发布者会收到message</span><span style="font-family: 宋体;">的回执</span></p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">当网络异常时</span>(<span style="font-family: 宋体;">网络中断，或者网络延迟</span>)<span style="font-family: 宋体;">，在发布者发送消息到</span>message server<span style="font-family: 宋体;">的过程中就有问题，此时message </span>server<span style="font-family: 宋体;">跟这条消息没有任何的关系，发布者会收到发送失败的回执</span>(message client<span style="font-family: 宋体;">发的，即发布者底层的message</span><span style="font-family: 宋体;">依赖的</span>jar<span style="font-family: 宋体;">包中的网络层，message </span>client<span style="font-family: 宋体;">和message </span>server<span style="font-family: 宋体;">建立</span>socket<span style="font-family: 宋体;">连接后才可能发送消息</span>)<span style="font-family: 宋体;">，这个时候发布者的业务处理代码可以根据这个发送失败的回执进行相应的处理：继续发送消息或者忽略.</span><span style="color: red;"></span><span style="font-family: 宋体; color: red;"></span></p>  <p style="margin-left: 18pt;">&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">当发布者发送消息给</span>message server<span style="font-family: 宋体;">，message </span>server<span style="font-family: 宋体;">保存消息时有问题的话，message </span>server<span style="font-family: 宋体;">会发送一个失败的回执给发布者，发布者接收到回执后，处理方法同</span>2)<span style="font-family: 宋体;">，其中又有问题，这个回执发送给发布者的时候，网络异常，这个时候在发布者这端的message </span>client<span style="font-family: 宋体;">是有超时设置的，当超时一段时间没有接收到回执消息的时候，message </span>client<span style="font-family: 宋体;">就认定此次发送是失败了，自己生产失败消息返回给业务代码，业务代码处理同</span>2)<span style="font-family: 宋体;">。</span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>4)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">当发布者发送消息给message </span>server<span style="font-family: 宋体;">，message </span>server<span style="font-family: 宋体;">保存消息成功，message </span>server<span style="font-family: 宋体;">发送成功回执给发布者，这个时候网络异常，没有发送成功，这个时候发布者这端的message </span>client<span style="font-family: 宋体;">有超时设置，产生失败消息给业务代码，业务代码处理同</span>2)<span style="font-family: 宋体;">。<span style="color: red;"></span></span><span style="font-family: 宋体; color: red;"></span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>5)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font: 12pt &quot;Times New Roman&quot;;">&nbsp; message &nbsp; </span></span></span><span style="color: black; font-size: 12pt;">server</span><span style="font-family: 宋体; color: black;">投递给订阅者时，发送成功的话，订阅者业务处理成功后，发送回执给message</span><span style="color: black;"> server</span><span style="font-family: 宋体; color: black;">，</span><span style="color: black;">message server</span><span style="font-family: 宋体; color: black;">收到成功回执会删除保存的消息的</span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>6)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black;">message server</span><span style="font-family: 宋体; color: black;">投递给订阅者时，发送不成功的话，</span><span style="color: black;">message server</span><span style="font-family: 宋体; color: black;">有超时处理的，超时后会重新发送，重试的策略是时间间隔越来越长的，所以先到达</span><span style="color: black;">message server</span><span style="font-family: 宋体; color: black;">的消息不一定在后到达的消息前面被投递成功。</span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt; text-indent: -18pt;"><span><span>7)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black;">message server</span><span style="font-family: 宋体; color: black;">投递给订阅者时，发送成功了，但是订阅者业务处理失败发送失败回执或者订阅者发送成功回执时网络异常</span><span style="color: black;">(</span><span style="font-family: 宋体; color: black;">比如超时</span><span style="color: black;">)</span><span style="font-family: 宋体; color: black;">了，message </span><span style="color: black;">server</span><span style="font-family: 宋体; color: black;">会认为发送失败，这样就会重新发送，策略同</span><span style="color: black;">6)</span><span style="font-family: 宋体; color: black;">，</span><span style="font-family: 宋体; color: red;"></span></p>  <p>&nbsp;</p>  <p style="margin-left: 18pt;"><span style="font-family: 宋体; color: black;">从上面的分析可知，message server</span><span style="font-family: 宋体; color: black;">的可靠性是要发布者和订阅者一同保证的。当出现上面的</span><span style="color: black;">2) 3)</span></p>  <p style="margin-left: 18pt;"><span style="font-family: 宋体; color: black;">的情况时，发布者的业务代码要检查消息回执，然后在出错的情况下继续发送消息。在出现</span><span style="color: black;">6) 7)</span><span style="font-family: 宋体; color: black;">的情况时，订阅者不能吃掉异常，不能提前返回。</span></p>  <p style="margin-left: 18pt;">&nbsp;</p>  <p style="margin-left: 18pt;"><span style="font-family: 宋体; color: black;">因为要保证出现上面的几点问题时的可靠性，那么重复消息和发送的顺序就不能得到保证了。</span></p><br /><h3>分布式事务</h3>&nbsp;&nbsp; 一般可以使用两阶段提交，达到最终一致性<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/nod0620/server.JPG" height="344" width="497" /><br /><br /><div>  <p><span style="font-family: 宋体; color: black;">在发布端是有个</span><span style="color: black;">callback</span><span style="font-family: 宋体; color: black;">接口，在下图第&#9314;步中决定是提交事务还是回滚事务</span><span style="color: black;">.</span></p>  <p><span style="font-family: 宋体; color: black;">当第&#9312;，&#9313;步处理完后，这个时候网络出现异常或者其他情况，第&#9314;步操作没</span></p>  <p><span style="font-family: 宋体; color: black;">有成功，</span><span style="color: black;">notify server</span><span style="font-family: 宋体; color: black;">轮询事务消息，如果发现事务了超过时间阀值，就发起第&#9315;步</span></p>  <span style="font-size: 10.5pt; font-family: 宋体; color: black;">操作，主动询问发布者是否需要提交还是回滚事务。发布者发起第&#9316;步操作作为响应</span></div><br /><h3>高性能</h3>  </div></span><span style="font-family: 宋体;">底层网络交互使用nio socket.<br /><div><span style="font-size: 10.5pt; font-family: 宋体; color: black;">使用</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">NIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，而不是</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">BIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，这个可以认为是为了节省服务器资源，避免了一个请求一个线程的开销，单线程处理了多任务</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">(IO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">多路复用</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">)</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，<br />是非阻塞的</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">IO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，并不是说</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">NIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">比</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">BIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">快，只是</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">NIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">的连接数上限大于</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">BIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，对于连接数大，并发大的情况下，因为占用资源少，线程上下文切换少，所以服务器更加的稳定.</span></div><div>  <p><span style="color: black;">NIO socket</span><span style="font-family: 宋体; color: black;">配合的是</span><span style="color: black;">java.nio.buffer,byteBuffer</span><span style="font-family: 宋体; color: black;">分</span><span style="color: black;">DirectByteBuffer</span><span style="font-family: 宋体; color: black;">和</span><span style="color: black;">NO_DirectByteBuffer,</span></p>  <p><span style="color: black;">DirectByteBuffer</span><span style="font-family: 宋体; color: black;">就是操作系统的内存直接分配，而</span><span style="color: black;">NO_DirectByteBuffer</span><span style="font-family: 宋体; color: black;">是</span><span style="color: black;">jvm</span><span style="font-family: 宋体; color: black;">里面堆里面分配的，</span></p><p><span style="font-family: 宋体; color: black;">所以</span><span style="color: black;">DirectByteBuffer</span><span style="font-family: 宋体; color: black;">会比</span><span style="color: black;">NO_DirectByteBuffer</span><span style="font-family: 宋体; color: black;">稍快，因为</span><span style="color: black;">NO_DirectByteBuffer</span><span style="font-family: 宋体; color: black;">多了一次从</span><span style="color: black;">os</span><span style="font-family: 宋体; color: black;">到</span><span style="color: black;">jvm heap</span><span style="font-family: 宋体; color: black;">的拷贝。</span></p><p><span style="font-family: 宋体; color: black;"><div><p><span style="font-size: 10pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">其它的还有tcp几个影响性能的选项已经操作系统参数的调整</span></p><p><strong><span style="font-size: 12pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;"></span></strong></p><strong><span style="font-size: 12pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;"><br />nio</span><span style="font-size: 12pt; font-family: 宋体; color: black;">框架</span></strong></div><div><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">NIO</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">框架大多是典型的</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">Reactor</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">模式的，核心是</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">Event loop+</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">事件分发</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">+</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">事件处理的业务代码，</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">Mina</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">，</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; color: black;">Netty</span><span style="font-size: 10.5pt; font-family: 宋体; color: black;">也是这样做的.</span></div><div><img src="file:///F:/temp/moz-screenshot-3.png" alt="" /></div><img alt="" src="http://www.blogjava.net/images/blogjava_net/nod0620/reactor.JPG" height="324" width="631" /><br /></span></p>  </div><br /><div>  <p><span style="font-family: 宋体; color: black;">上图中</span><span style="color: black;">Acceptor</span><span style="font-family: 宋体; color: black;">是接受</span><span style="color: black;">NIO socket</span><span style="font-family: 宋体; color: black;">中的连接事件，</span><span style="color: black;">Reactor</span><span style="font-family: 宋体; color: black;">是</span><span style="color: black;">NIO socket</span><span style="font-family: 宋体; color: black;">读写事件的</span><span style="color: black;">loop</span><span style="font-family: 宋体; color: black;">，然后</span><span style="color: black;">loop</span><span style="font-family: 宋体; color: black;">中根据各种事件分发到事件处理的业务代码，具体的可以看</span><span style="color: black;">:</span></p>  <p><a href="http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf"><span>http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf</span></a></p>  </div><br /><div>    <p><span style="color: black;">NIO socket</span><span style="font-family: 宋体; color: black;">本质上面是多路复用非阻塞</span><span style="color: black;">IO</span><span style="font-family: 宋体; color: black;">，</span><span style="color: black;">java</span><span style="font-family: 宋体; color: black;">里使用</span><span style="color: black;">Selector</span><span style="font-family: 宋体; color: black;">类表示多路复用器，在此上面注册的</span><span style="color: black;">SocketChannel</span><span style="font-family: 宋体; color: black;">都对应有一个</span>SelectionKey<span style="font-family: 宋体;">，所以如果有多个连接的话</span><span style="color: black;">Selector</span><span style="font-family: 宋体; color: black;">内部就有多个</span>SelectionKey<span style="font-family: 宋体;">组成一个集合，程序需要遍历这个集合，检查有没有需要处理的</span>key<span style="font-family: 宋体;">，这里需要处理的意思是至少一个连接注册了且其对应的连接通道已为</span> I/O <span style="font-family: 宋体;">操作准备就绪。</span></p>  <p><span style="font-family: 宋体;">所以这个遍历还是被阻塞的。</span></p><p><span style="font-family: 宋体;"><div>  <p><span style="font-family: 宋体;">随着并发数量的提高，</span>nio<span style="font-family: 宋体;">框架采用一个</span>Selector<span style="font-family: 宋体;">来支撑大量连接事件的管理和触发可能就会遇到瓶颈问题</span>(<span style="font-family: 宋体;">毕竟是单线程在遍历一个大的集合</span>)<span style="font-family: 宋体;">，所以可以</span><span style="font-family: 宋体;">使用多个</span>Selector<span style="font-family: 宋体;">并存的结构，一般</span><span style="font-family: 宋体;"></span>Selector<span style="font-family: 宋体;">数量是</span>cpu*2<span style="font-family: 宋体;">个，在一个连接需要建立的时候，他通过计数器加</span>1<span style="font-family: 宋体;">之后取</span>Selector<span style="font-family: 宋体;">数量的模作为</span>Selector<span style="font-family: 宋体;">数组的索引取得</span>Selector<span style="font-family: 宋体;">。这样多个</span>selector<span style="font-family: 宋体;">可以在多个线程里面遍历自己的集合，效率会好很多。</span></p>  <p><span style="font-family: 宋体;"></span>mina<span style="font-family: 宋体;">里面有一个专门的</span>Selector<span style="font-family: 宋体;">来处理</span>OP_ACCEPT<span style="font-family: 宋体;">事件，</span>cpu*2+1<span style="font-family: 宋体;">个</span>Selector<span style="font-family: 宋体;">来处理</span>OP_READ<span style="font-family: 宋体;">，</span>OP_WRITE<span style="font-family: 宋体;">，这样连接事件和读写事件就相互不影响了</span>(<span style="font-family: 宋体;">个人理解读写事件往往有后端的业务代码，所以处理的时间会久一点，对于有好多连接事件要处理的代码来说，这种时间的影响还是比较严重的</span>)<span style="font-family: 宋体;">。</span></p>  <p>&nbsp;</p>  <p>可以<span style="font-family: 宋体;">把每个连接抽象成每个</span>session<span style="font-family: 宋体;">，在</span>session<span style="font-family: 宋体;">上面还做了心跳检测，心跳检测主要是为了保持长连接，这样的话连接不会断掉重建，毕竟</span>tcp<span style="font-family: 宋体;">的建立需要</span>3<span style="font-family: 宋体;">次握手，关闭要</span>4<span style="font-family: 宋体;">次握手，再加上</span>tcp<span style="font-family: 宋体;">建立后是慢启动的，不能很快的达到最高传输速率，所以长连接的优势比较明显，而且message server</span><span style="font-family: 宋体;">也是比较适合长连接的</span></p>  <p>&nbsp;</p>  <p><span style="font-family: 宋体;">因为有心跳检测和网络异常，所以断掉的连接必须能自动重新链接，可以</span><span style="font-family: 宋体;">收集了这些连接做成队列，然后放在一个线程池中进行重新链接</span>.</p><p>当然还需要做发布者和订阅者得订阅管理实现，流量控制等其它东西.<br /></p>  </div><br /></span></p>  </div><br /></span></div><p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/nod0620/aggbug/357115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nod0620/" target="_blank">nod0620</a> 2011-08-23 15:08 <a href="http://www.blogjava.net/nod0620/articles/357115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hotspot JVM简记</title><link>http://www.blogjava.net/nod0620/articles/351584.html</link><dc:creator>nod0620</dc:creator><author>nod0620</author><pubDate>Thu, 02 Jun 2011 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/nod0620/articles/351584.html</guid><wfw:comment>http://www.blogjava.net/nod0620/comments/351584.html</wfw:comment><comments>http://www.blogjava.net/nod0620/articles/351584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nod0620/comments/commentRss/351584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nod0620/services/trackbacks/351584.html</trackback:ping><description><![CDATA[<div><p>Hotspot JVM模型中主要分三个部分：Young，Tenured，Perm</p><p><img alt="" src="http://www.blogjava.net/images/blogjava_net/nod0620/Hotspot-memory-model-600x120.png" height="120" width="600" /></p><p><br /></p><p>Young分成Eden和两个Survior.在Eden区进行对象的分配，当Eden满了以后，进行Young的垃圾回收，</p><p>将Eden区存活的对象和一个Survior存活的对象复制拷贝到另外一个Survior，所以有一个Survior在一个</p><p>时间点上面肯定是空的，这里使用复制拷贝的算法非常的快，因为大多数的对象都死亡了，而且复制算法是</p><p>没有碎片产生的，当对象进行了两次的垃圾回收后还存活的话，就进入Tenured.</p><p><br /></p><p>进入Tenured代的都是存活比较久的对象，此时进行复制算法的代价是非常的高的，所以这里使用标记清除(</p><div><strong><strong><strong>mark-sweep</strong></strong></strong>)算法或者使用标记压缩(mark-sweep-compact)算法，标记清除算法首先进行活跃对象<br />的标记，这样做代价还是比较大的，而后内存碎片会比较的多，有可能由于碎片的原因，大对象不能被分配，<br />使得outofmemory，标记压缩算法是标记完进行压缩碎片.<br /><br />垃圾回收器分三种<br />串行(<strong><strong><strong>Serial</strong></strong></strong>)，并行(parallel),并发(conccurent)三种收集器，前面两种可以使用Tenured的两种算法，并发收集器<br />只能使用标记清除算法<br /><br />并行收集器只会压缩他认为需要压缩的区块而不会进行全区块的压缩，这个可能已经说明碎片已经过多了<br /><br />并行收集器适合吞吐量优先应用，并发的则适合交互式的应用.<br /><br />在young代的进行垃圾收集是会暂停其它线程的，在tenured的收集并行收集器是多线程并行进行收集，还是会暂停其它线程，<br />而并发收集器则是应用线程和回收线程是同时进行工作，但是需要进行两次短暂的暂停，一次是寻找标记的根对象，一次是标记完以后<br />再一次进行标记并发过程中漏掉的对象，暂停时间是大大的减少啊.<br /><br /><br /><br /><br /><br /> </div><p>&nbsp;</p></div><p><br /></p><img src ="http://www.blogjava.net/nod0620/aggbug/351584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nod0620/" target="_blank">nod0620</a> 2011-06-02 12:08 <a href="http://www.blogjava.net/nod0620/articles/351584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>剩余定理</title><link>http://www.blogjava.net/nod0620/articles/349763.html</link><dc:creator>nod0620</dc:creator><author>nod0620</author><pubDate>Sat, 07 May 2011 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/nod0620/articles/349763.html</guid><wfw:comment>http://www.blogjava.net/nod0620/comments/349763.html</wfw:comment><comments>http://www.blogjava.net/nod0620/articles/349763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nod0620/comments/commentRss/349763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nod0620/services/trackbacks/349763.html</trackback:ping><description><![CDATA[一个数除以3余2，除以5余3，除以7余2，求符合条件的最小数.<br />
<br />
解：　　当某数被3除余1对，即写上70（因为70是5和7的倍数，是
3的倍数多1），余2时即写70&#215;2＝140，这140仍是5和7的倍数，是3的倍数余2。某数被5除余1，即写上21（因为21是3和7的倍数、5的倍
数余1），余2时，则写上21&#215;2＝42，余3时，则写上21&#215;3＝63。某数被7除余1时，即写上15（因为15是3和5的倍数，是7的倍数余1），余
2时，则写上15&#215;2＝30。根据题意，把70&#215;2+21&#215;2＋15&#215;2计算出来结果。然后减去3、5、7的最小公倍数105，一直减到少于105为止，
就得符合题目的数：<br />
<br />
70&#215;2＋21&#215;3+15&#215;2-105&#215;2＝23<br />
<br />
即此数是23。<br />
<br />
<img src ="http://www.blogjava.net/nod0620/aggbug/349763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nod0620/" target="_blank">nod0620</a> 2011-05-08 00:38 <a href="http://www.blogjava.net/nod0620/articles/349763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>