当前位置:  编程技术>移动开发
本页文章导读:
    ▪MINA2 线程小结        MINA2 线程总结 本文转自:http://blog.csdn.net/mrliu20082009/article/details/69908121主要流程  read  in  data: IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler) write.........
    ▪ JDK NEW TOOLS鈥斺€攋ps銆乯info銆乯stat銆乯地图銆乯console        JDK NEW TOOLS鈥斺€攋ps銆乯info銆乯stat銆乯map銆乯console 瀹樻柟鏂囨。http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html鏈€杩戝帇鍔涙祴璇曞拰璋冧紭Liferay portal锛屾墍浠ラ渶瑕佹壘鍒颁竴绉.........
    ▪ 点旋钮连接到新界面       点按钮连接到新界面 <input type="button" value="编辑" onclick="javascript:location.href='/blog_article/info_load.do'"/> ......

[1]MINA2 线程小结
    来源: 互联网  发布时间: 2014-02-18
MINA2 线程总结
本文转自:http://blog.csdn.net/mrliu20082009/article/details/6990812

1主要流程 

read  in  data:
IO读入(IoProcessor)---日志记录、解码、threadPool(IoFilter)---业务逻辑处理(IoHandler)
write  out  data:
业务逻辑处理(IoHandler)---日志记录、编码、threadPool(IoFilter)---IO写出(IoProcessor)
由以上可以看出,IO读入和IO写出的过程是相反的。
2线程
这里主要讨论一下Mina中的线程,使用线程,线程池可以提高性能,Mina中就使用了几种线程:
IoAcceptor/IoConnector线程
IoProcessor线程
IoHandler线程


2.1IoAcceptor/IoConnector线程
IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:

public NioSocketAcceptor(Executor executor, IoProcessor<NioSession> processor) {}    
public NioSocketConnector(Executor executor, IoProcessor<NioSession> processor) {}   

此类线程池的构造在源代码中为(AbstractIoService第168行):

protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {    
//省略部分代码    
        if (executor == null) {    
            this.executor = Executors.newCachedThreadPool();    
            createdExecutor = true;    
        } else {    
            this.executor = executor;    
            createdExecutor = false;    
        }           
}   


由此可见默认的线程池类型为newCachedThreadPool,这是一个可根据需要创建新线程的线程池,在以前构造的线程可用时可以重用它们。

2.2IoProcessor线程
对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小:

IoConnector connector = new NioSocketConnector(9);    
IoAcceptor acceptor = new NioSocketAcceptor(9); 
 

如上就把IoProcessor线程池的大小改为9个。
IoProcessor线程池的默认大小在源代码中的定义(SimpleIoProcessorPool第82行):

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1; 


IoProcessor线程池的构造在源代码中为(SimpleIoProcessorPool第144行):
  

public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType,  
            Executor executor, int size) {  
        //省略部分代码  
        if (createdExecutor) {  
            this.executor = Executors.newCachedThreadPool();  
        } else {  
            this.executor = executor;  
        }  
}  



2.3IoHandler线程
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:

acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); 


如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。

2.4各种线程的产生
当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。


3线程查看
举个例子通过jdk自带工具jvisualvm来查看线程:

public class MinaTest {  
    protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);  
    private static int PORT = 9999;  
  
    public static void main(String[] args) {  
        try {  
            // 创建一个非阻塞的server端的Socket  
            IoAcceptor acceptor = new NioSocketAcceptor();  
            // 设置过滤器  
            acceptor.getFilterChain().addLast("logger", new LoggingFilter());  
            acceptor.getFilterChain().addLast("codec",  
                    new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));  
            acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));  
            // 设置读取数据的缓冲区大小  
            acceptor.getSessionConfig().setReadBufferSize(2048);  
            // 读写通道10秒内无操作进入空闲状态  
            acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  
            // 绑定逻辑处理器  
            acceptor.setHandler(new MinaServerHandler());  
            // 绑定端口  
            acceptor.bind(new InetSocketAddress(PORT));  
            logger.info("服务端启动成功... 端口号为:" + PORT);  
        } catch (Exception e) {  
            logger.error("服务端启动异常....", e);  
            e.printStackTrace();  
        }  
    }  
}  




public class MinaServerHandler extends IoHandlerAdapter {  
    protected static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);  
  
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {  
        logger.error("服务端发送异常...", cause);  
    }  
  
    public void messageReceived(IoSession session, Object message) throws Exception {  
        String msg = message.toString();  
        //如果是quit就关闭session退出    
        if ("quit".equals(msg)) {  
            session.close();  
        }  
        Date date = new Date();  
        session.write(date.toString());  
    }  
  
    public void sessionCreated(IoSession session) throws Exception {  
        logger.info("服务端与客户端创建连接...");  
    }  
}  


运行MinaTest类,启动服务器端。
开始->运行->cmd进入控制台 窗口。
输入:telnet 127.0.0.1 9999
再重复2、3步骤2次。
对jvisualvm的线程视图截图如下:

通过以上步骤我们可以看出我们打开了一个服务器端口,并用3个客户端进行连接,下面我们通过以上总结的知识来分析一下服务端产生的线程:
NioSccketAcceptor为服务器端监听端口9999通过线程池创建的一个线程。
NioProcessor-1、NioProcessor-2、NioProcessor-3为IoProcessor线程池创建的线程,用来IO处理。
pool-3-thread-1、pool-3-thread-2、pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理


    
[2] JDK NEW TOOLS鈥斺€攋ps銆乯info銆乯stat銆乯地图銆乯console
    来源: 互联网  发布时间: 2014-02-18
JDK NEW TOOLS鈥斺€攋ps銆乯info銆乯stat銆乯map銆乯console
瀹樻柟鏂囨。

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

鏈€杩戝帇鍔涙祴璇曞拰璋冧紭Liferay portal锛屾墍浠ラ渶瑕佹壘鍒颁竴绉嶅伐鍏凤紝鍙互姣旇緝濂界殑鐩戞祴VM宸ュ叿銆傛湰鏉ユ兂浣跨敤鍟嗙敤宸ュ叿锛屼絾鍋剁劧闂村彂鐜癝UN 鐨凧DK涓柊娣讳簡鍑犱釜宸ュ叿锛屽苟涓旈潪甯稿ソ鐢ㄣ€傜鎵跨潃鏈夊厤璐癸紝涓嶇敤鍟嗙敤鐨勫師鍒欍€傚紑濮嬩娇鐢ㄦ柊鐨凧DK宸ュ叿锛屼互涓嬬畝鍗曚粙缁嶄竴涓嬭繖鍑犵宸ュ叿銆?娉細鏈枃绔犱笅鐨勬墍鏈夊伐鍏烽兘瀛樺湪JDK5.0浠ヤ笂鐗堟湰鐨勫伐鍏烽泦閲岋紝鍚宩avac涓€鏍凤紝涓嶉』鐗规剰瀹夎)

鎴戜竴鍏辨壘鍒颁互涓嬩簲涓伐鍏凤細
jinfo:鍙互杈撳嚭骞朵慨鏀硅繍琛屾椂鐨刯ava 杩涚▼鐨刼pts銆?
jps:涓巙nix涓婄殑ps绫讳技锛岀敤鏉ユ樉绀烘湰鍦扮殑java杩涚▼锛屽彲浠ユ煡鐪嬫湰鍦拌繍琛岀潃鍑犱釜java绋嬪簭锛屽苟鏄剧ず浠栦滑鐨勮繘绋嬪彿銆?
jstat:涓€涓瀬寮虹殑鐩戣VM鍐呭瓨宸ュ叿銆傚彲浠ョ敤鏉ョ洃瑙哣M鍐呭瓨鍐呯殑鍚勭鍫嗗拰闈炲爢鐨勫ぇ灏忓強鍏跺唴瀛樹娇鐢ㄩ噺銆?
jmap:鎵撳嵃鍑烘煇涓猨ava杩涚▼锛堜娇鐢╬id锛夊唴瀛樺唴鐨勶紝鎵€鏈夆€樺璞♀€欑殑鎯呭喌锛堝锛氫骇鐢熼偅浜涘璞★紝鍙婂叾鏁伴噺锛夈€?
jconsole:涓€涓猨ava GUI鐩戣宸ュ叿锛屽彲浠ヤ互鍥捐〃鍖栫殑褰㈠紡鏄剧ず鍚勭鏁版嵁銆傚苟鍙€氳繃杩滅▼杩炴帴鐩戣杩滅▼鐨勬湇鍔″櫒VM銆?

鎺ヤ笅鏉ユ槸瀵硅繖浜涘伐鍏风殑璇︾粏浠嬬粛锛?

浠庢渶绠€鍗曠殑jstat宸ュ叿寮€濮嬶細鎴戞兂寰堝浜洪兘鏄敤杩噓nix绯荤粺閲岀殑ps鍛戒护锛岃繖涓懡浠や富瑕佹槸鐢ㄦ潵鏄剧ず褰撳墠绯荤粺鐨勮繘绋嬫儏鍐碉紝鏈夊摢浜涜繘绋嬶紝鍙婂叾id銆俲ps 涔熸槸涓€鏍凤紝瀹冪殑浣滅敤鏄樉绀哄綋鍓嶇郴缁熺殑java杩涚▼鎯呭喌锛屽強鍏秈d鍙枫€傛垜浠彲浠ラ€氳繃瀹冩潵鏌ョ湅鎴戜滑鍒板簳鍚姩浜嗗嚑涓猨ava杩涚▼锛堝洜涓烘瘡涓€涓猨ava绋嬪簭閮戒細鐙崰涓€涓猨ava铏氭嫙鏈哄疄渚嬶級锛屽拰浠栦滑鐨勮繘绋嬪彿锛堜负涓嬮潰鍑犱釜绋嬪簭鍋氬噯澶囷級锛屽苟鍙€氳繃opt鏉ユ煡鐪嬭繖浜涜繘绋嬬殑璇︾粏鍚姩鍙傛暟銆?
浣跨敤鏂规硶锛氬湪褰撳墠鍛戒护琛屼笅鎵?jps(闇€瑕丣AVA_HOME锛屾病鏈夌殑璇濓紝鍒版敼绋嬪簭鐨勭洰褰曚笅鎵?

鎺ヤ笅鏉ユ槸jstat锛屾垜涔嬫墍浠ヨ繖娆¤皟浼楲iferay portal鏄洜涓猴紝liferay鍦ㄩ粯璁ょ殑鎯呭喌涓嬶紝骞跺彂鐢ㄦ埛涓€澶氬氨浼氫骇鐢焢erm out of momery寮傚父銆傝櫧鐒跺緢寮€灏辫В鍐充簡锛屼絾鍙戠幇瀵筕M鍐呭瓨浣跨敤閲忕洃鎺х殑閲嶈鎬с€傞€氳繃google锛屽緢蹇殑鍙戠幇浜唈stat杩欎釜宸ュ叿銆?
jstat宸ュ叿鐗瑰埆寮哄ぇ锛屾湁浼楀鐨勫彲閫夐」锛岃缁嗘煡鐪嬪爢鍐呭悇涓儴鍒嗙殑浣跨敤閲忥紝浠ュ強鍔犺浇绫荤殑鏁伴噺銆備娇鐢ㄦ椂锛岄渶鍔犱笂鏌ョ湅杩涚▼鐨勮繘绋媔d锛屽拰鎵€閫夊弬鏁般€備互涓嬭缁嗕粙缁嶅悇涓弬鏁扮殑鎰忎箟銆?
jstat -class pid:鏄剧ず鍔犺浇class鐨勬暟閲忥紝鍙婃墍鍗犵┖闂寸瓑淇℃伅銆?
jstat -compiler pid:鏄剧ずVM瀹炴椂缂栬瘧鐨勬暟閲忕瓑淇℃伅銆?
jstat -gc pid:鍙互鏄剧ずgc鐨勪俊鎭紝鏌ョ湅gc鐨勬鏁帮紝鍙婃椂闂淬€傚叾涓渶鍚庝簲椤癸紝鍒嗗埆鏄痽oung gc鐨勬鏁帮紝young gc鐨勬椂闂达紝full gc鐨勬鏁帮紝full gc鐨勬椂闂达紝gc鐨勬€绘椂闂淬€?
jstat -gccapacity:鍙互鏄剧ず锛孷M鍐呭瓨涓笁浠o紙young,old,perm锛夊璞$殑浣跨敤鍜屽崰鐢ㄥぇ灏忥紝濡傦細PGCMN鏄剧ず鐨勬槸鏈€灏弍erm鐨勫唴瀛樹娇鐢ㄩ噺锛孭GCMX鏄剧ず鐨勬槸perm鐨勫唴瀛樻渶澶т娇鐢ㄩ噺锛孭GC鏄綋鍓嶆柊鐢熸垚鐨刾erm鍐呭瓨鍗犵敤閲忥紝PC鏄絾鍓峱erm鍐呭瓨鍗犵敤閲忋€傚叾浠栫殑鍙互鏍规嵁杩欎釜绫绘帹锛?OC鏄痮ld鍐呯函鐨勫崰鐢ㄩ噺銆?
jstat -gcnew pid:new瀵硅薄鐨勪俊鎭€?
jstat -gcnewcapacity pid:new瀵硅薄鐨勪俊鎭強鍏跺崰鐢ㄩ噺銆?
jstat -gcold pid:old瀵硅薄鐨勪俊鎭€?
jstat -gcoldcapacity pid:old瀵硅薄鐨勪俊鎭強鍏跺崰鐢ㄩ噺銆?
jstat -gcpermcapacity pid: perm瀵硅薄鐨勪俊鎭強鍏跺崰鐢ㄩ噺銆?
jstat -util pid:缁熻gc淇℃伅缁熻銆?
jstat -printcompilation pid:褰撳墠VM鎵ц鐨勪俊鎭€?
闄や簡浠ヤ笂涓€涓弬鏁板锛岃繕鍙互鍚屾椂鍔犱笂 涓や釜鏁板瓧锛屽锛歫stat -printcompilation 3024 250 6鏄瘡250姣鎵撳嵃涓€娆★紝涓€鍏辨墦鍗?娆★紝杩樺彲浠ュ姞涓?h3姣忎笁琛屾樉绀轰竴涓嬫爣棰樸€?

jmap鏄竴涓彲浠ヨ緭鍑烘墍鏈夊唴瀛樹腑瀵硅薄鐨勫伐鍏凤紝鐢氳嚦鍙互灏哣M 涓殑heap锛屼互浜岃繘鍒惰緭鍑烘垚鏂囨湰銆備娇鐢ㄦ柟娉?jmap -histo pid銆傚鏋滆繛鐢⊿HELL jmap -histo pid>a.log鍙互灏嗗叾淇濆瓨鍒版枃鏈腑鍘伙紝鍦ㄤ竴娈垫椂闂村悗锛屼娇鐢ㄦ枃鏈姣斿伐鍏凤紝鍙互瀵规瘮鍑篏C鍥炴敹浜嗗摢浜涘璞°€俲map -dump:format=b,file=String 3024鍙互灏?024杩涚▼鐨勫唴瀛榟eap杈撳嚭鍑烘潵鍒癝tring鏂囦欢閲屻€?

jinfo:鐨勭敤澶勬瘮杈冪畝鍗曪紝灏辨槸鑳借緭鍑哄苟淇敼杩愯鏃剁殑java杩涚▼鐨勮繍琛屽弬鏁般€傜敤娉曟槸jinfo -opt  pid 濡傦細鏌ョ湅2788鐨凪axPerm澶у皬鍙互鐢?nbsp; jinfo -flag MaxPermSize 2788銆?

jconsole鏄竴涓敤java鍐欑殑GUI绋嬪簭锛岀敤鏉ョ洃鎺M锛屽苟鍙洃鎺ц繙绋嬬殑VM锛岄潪甯告槗鐢紝鑰屼笖鍔熻兘闈炲父寮恒€傜敱浜庢槸GUI绋嬪簭锛岃繖閲屽氨涓嶈缁嗕粙缁嶄簡锛屼笉浼氱殑鍦版柟鍙互鍙傝€冿汲锛碉籍鐨勫畼鏂规枃妗c€?
浣跨敤鏂规硶锛氬懡浠よ閲屾墦 jconsole锛岄€夊垯杩涚▼灏卞彲浠ヤ簡銆?

浠ヤ笅鏄繖浜涘伐鍏风殑SUN瀹樻柟璇存槑锛?
jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html
jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html
jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

闄勫姞锛歸indows鏌ョ湅杩涚▼鍙凤紝鐢变簬浠诲姟绠$悊鍣ㄩ粯璁ょ殑鎯呭喌涓嬫槸涓嶆樉绀鸿繘绋媔d鍙风殑锛屾墍浠ュ彲浠ラ€氳繃濡備笅鏂规硶鍔犱笂銆俢trl+alt+del鎵撳紑浠诲姟绠$悊鍣紝閫夋嫨鈥樿繘绋嬧€欓€夐」鍗★紝鐐光€樻煡鐪嬧€?>'閫夋嫨鍒?->鍔犱笂'PID'锛屽氨鍙互浜嗐€?

    
[3] 点旋钮连接到新界面
    来源: 互联网  发布时间: 2014-02-18
点按钮连接到新界面
<input type="button" value="编辑"  onclick="javascript:location.href='/blog_article/info_load.do'"/>

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
软件工程/软件设计 iis7站长之家
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3