当前位置: 编程技术>移动开发
本页文章导读:
▪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用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:
此类线程池的构造在源代码中为(AbstractIoService第168行):
由此可见默认的线程池类型为newCachedThreadPool,这是一个可根据需要创建新线程的线程池,在以前构造的线程可用时可以重用它们。
2.2IoProcessor线程
对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小:
如上就把IoProcessor线程池的大小改为9个。
IoProcessor线程池的默认大小在源代码中的定义(SimpleIoProcessorPool第82行):
IoProcessor线程池的构造在源代码中为(SimpleIoProcessorPool第144行):
2.3IoHandler线程
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:
如上配置之后,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来查看线程:
运行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为过滤器配置的线程池创建的线程,用来业务逻辑处理
本文转自: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'锛屽氨鍙互浜嗐€?
瀹樻柟鏂囨。
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'"/>
最新技术文章: