導航:首頁 > 編程語言 > java監控cpu內存

java監控cpu內存

發布時間:2023-03-15 15:47:46

Ⅰ 如何監視計算機的CPU,內存和磁碟使用情況在java

使用sigar來監控,簡單方便!
使用說明:以下代碼需要配合sigar的dll文件來用,需要將dll文件放到JDK下的bin文件夾下,供sigar程序調用,還需要sigarjar包。以下程序經過測試,完全可用!

有關jar包跟dll文件我上傳不了,私信我,我發你importjava.net.InetAddress;
importjava.net.UnknownHostException;
importjava.util.Map;
importjava.util.Properties;
importjava.util.Timer;
importjava.util.TimerTask;

importorg.hyperic.sigar.CpuInfo;
importorg.hyperic.sigar.CpuPerc;
importorg.hyperic.sigar.FileSystem;
importorg.hyperic.sigar.FileSystemUsage;
importorg.hyperic.sigar.Mem;
importorg.hyperic.sigar.NetFlags;
importorg.hyperic.sigar.NetInterfaceConfig;
importorg.hyperic.sigar.NetInterfaceStat;
importorg.hyperic.sigar.OperatingSystem;
importorg.hyperic.sigar.Sigar;
importorg.hyperic.sigar.SigarException;
importorg.hyperic.sigar.Swap;
importorg.hyperic.sigar.Who;

publicclassRuntimeTest{
publicstaticvoidmain(String[]args){
try{
Timertimer=newTimer();//定時器
TimerTasktask=newTimerTask(){
publicvoidrun(){
try{
memory();
}catch(SigarExceptione){
e.printStackTrace();
}
}
};
try{
timer.schele(task,0,3000);//每3秒取一次
}catch(Exceptionex){
ex.printStackTrace();
}
//System信息,從jvm獲取
//property();//根據自己的需求,都可以放到定時器中定時獲取
//cpu信息
//cpu();
//內存信息
//memory();
//操作系統信息
//os();
//用戶信息
//who();}catch(Exceptione1){
e1.printStackTrace();
}
}

privatestaticvoidproperty()throwsUnknownHostException{
Runtimer=Runtime.getRuntime();
Propertiesprops=System.getProperties();
InetAddressaddr;
addr=InetAddress.getLocalHost();
Stringip=addr.getHostAddress();
Map<String,String>map=System.getenv();
StringuserName=map.get("USERNAME");//獲取用戶名
StringcomputerName=map.get("COMPUTERNAME");//獲取計算機名
StringuserDomain=map.get("USERDOMAIN");//獲取計算機域名
System.out.println("用戶名:"+userName);
System.out.println("計算機名:"+computerName);
System.out.println("計算機域名:"+userDomain);
System.out.println("本地ip地址:"+ip);
System.out.println("本地主機名:"+addr.getHostName());
System.out.println("JVM可以使用的總內存:"+r.totalMemory());
System.out.println("JVM可以使用的剩餘內存:"+r.freeMemory());
System.out.println("JVM可以使用的處理器個數:"+r.availableProcessors());
System.out.println("Java的運行環境版本:"+props.getProperty("java.version"));
System.out.println("Java的運行環境供應商:"+props.getProperty("java.vendor"));
System.out.println("Java供應商的URL:"+props.getProperty("java.vendor.url"));
System.out.println("Java的安裝路徑:"+props.getProperty("java.home"));
System.out.println("Java的虛擬機規范版本:"+props.getProperty("java.vm.specification.version"));
System.out.println("Java的虛擬機規范供應商:"+props.getProperty("java.vm.specification.vendor"));
System.out.println("Java的虛擬機規范名稱:"+props.getProperty("java.vm.specification.name"));
System.out.println("Java的虛擬機實現版本:"+props.getProperty("java.vm.version"));
System.out.println("Java的虛擬機實現供應商:"+props.getProperty("java.vm.vendor"));
System.out.println("Java的虛擬機實現名稱:"+props.getProperty("java.vm.name"));
System.out.println("Java運行時環境規范版本:"+props.getProperty("java.specification.version"));
System.out.println("Java運行時環境規范供應商:"+props.getProperty("java.specification.vender"));
System.out.println("Java運行時環境規范名稱:"+props.getProperty("java.specification.name"));
System.out.println("Java的類格式版本號:"+props.getProperty("java.class.version"));
System.out.println("Java的類路徑:"+props.getProperty("java.class.path"));
System.out.println("載入庫時搜索的路徑列表:"+props.getProperty("java.library.path"));
System.out.println("默認的臨時文件路徑:"+props.getProperty("java.io.tmpdir"));
System.out.println("一個或多個擴展目錄的路徑:"+props.getProperty("java.ext.dirs"));
System.out.println("操作系統的名稱:"+props.getProperty("os.name"));
System.out.println("操作系統的構架:"+props.getProperty("os.arch"));
System.out.println("操作系統的版本:"+props.getProperty("os.version"));
System.out.println("文件分隔符:"+props.getProperty("file.separator"));
System.out.println("路徑分隔符:"+props.getProperty("path.separator"));
System.out.println("行分隔符:"+props.getProperty("line.separator"));
System.out.println("用戶的賬戶名稱:"+props.getProperty("user.name"));
System.out.println("用戶的主目錄:"+props.getProperty("user.home"));
System.out.println("用戶的當前工作目錄:"+props.getProperty("user.dir"));
}

privatestaticvoidmemory()throwsSigarException{
Sigarsigar=newSigar();
Memmem=sigar.getMem();
floattotal=mem.getTotal();
floatused=mem.getUsed();
//內存總量
System.out.println("內存總量:"+mem.getTotal()/1024L/1024L+"Mav");
//當前內存使用量
System.out.println("當前內存使用量:"+mem.getUsed()/1024L/1024L+"Mused");
//當前內存剩餘量
System.out.println("當前內存剩餘量:"+mem.getFree()/1024L/1024L+"Mfree");
//當前內存使用率
System.out.println("內存使用率:"+used/total*100+"%");
Swapswap=sigar.getSwap();
//交換區總量
System.out.println("交換區總量:"+swap.getTotal()/1024L/1024L+"Mav");
//當前交換區使用量
System.out.println("當前交換區使用量:"+swap.getUsed()/1024L/1024L+"Mused");
//當前交換區剩餘量
System.out.println("當前交換區剩餘量:"+swap.getFree()/1024L/1024L+"Mfree");
}

privatestaticvoidcpu()throwsSigarException{
Sigarsigar=newSigar();
CpuInfoinfos[]=sigar.getCpuInfoList();
CpuPerccpuList[]=null;
cpuList=sigar.getCpuPercList();
for(inti=0;i<infos.length;i++){//不管是單塊CPU還是多CPU都適用
CpuInfoinfo=infos[i];
System.out.println("第"+(i+1)+"塊CPU信息");
System.out.println("CPU的總量MHz:"+info.getMhz());//CPU的總量MHz
System.out.println("CPU生產商:"+info.getVendor());//獲得CPU的賣主,如:Intel
System.out.println("CPU類別:"+info.getModel());//獲得CPU的類別,如:Celeron
System.out.println("CPU緩存數量:"+info.getCacheSize());//緩沖存儲器數量
printCpuPerc(cpuList[i]);
}
}

privatestaticvoidprintCpuPerc(CpuPerccpu){
System.out.println("CPU用戶使用率:"+CpuPerc.format(cpu.getUser()));//用戶使用率
System.out.println("CPU系統使用率:"+CpuPerc.format(cpu.getSys()));//系統使用率
System.out.println("CPU當前等待率:"+CpuPerc.format(cpu.getWait()));//當前等待率
System.out.println("CPU當前錯誤率:"+CpuPerc.format(cpu.getNice()));//
System.out.println("CPU當前空閑率:"+CpuPerc.format(cpu.getIdle()));//當前空閑率
System.out.println("CPU總的使用率:"+CpuPerc.format(cpu.getCombined()));//總的使用率
}

privatestaticvoidos(){
OperatingSystemOS=OperatingSystem.getInstance();
//操作系統內核類型如:386、486、586等x86
System.out.println("操作系統:"+OS.getArch());
System.out.println("操作系統CpuEndian():"+OS.getCpuEndian());//
System.out.println("操作系統DataModel():"+OS.getDataModel());//
//系統描述
System.out.println("操作系統的描述:"+OS.getDescription());
//操作系統類型
//System.out.println("OS.getName():"+OS.getName());
//System.out.println("OS.getPatchLevel():"+OS.getPatchLevel());//
//操作系統的賣主
System.out.println("操作系統的賣主:"+OS.getVendor());
//賣主名稱
System.out.println("操作系統的賣主名:"+OS.getVendorCodeName());
//操作系統名稱
System.out.println("操作系統名稱:"+OS.getVendorName());
//操作系統賣主類型
System.out.println("操作系統賣主類型:"+OS.getVendorVersion());
//操作系統的版本號
System.out.println("操作系統的版本號:"+OS.getVersion());
}

privatestaticvoidwho()throwsSigarException{
Sigarsigar=newSigar();
Whowho[]=sigar.getWhoList();
if(who!=null&&who.length>0){
for(inti=0;i<who.length;i++){
//System.out.println("當前系統進程表中的用戶名"+String.valueOf(i));
Who_who=who[i];
System.out.println("用戶控制台:"+_who.getDevice());
System.out.println("用戶host:"+_who.getHost());
//System.out.println("getTime():"+_who.getTime());
//當前系統進程表中的用戶名
System.out.println("當前系統進程表中的用戶名:"+_who.getUser());
}
}
}


}

Ⅱ 如何在Java程序中獲取、監控伺服器負載值、CPU、內存、硬碟、網路情況

SUM伺服器監控軟體吧
可以監控所有品牌的伺服器的CPU\內存、磁碟、流量、網路、資料庫、中間件,還能監控網路設備
有啥情況可以簡訊和郵件通知,比較方便
你看看吧,我們用的就是這個,只是溫度不能監控,其他都可以

Ⅲ 用Java編程來實現CPU和Memory監控器並將數據持久化,保存在文件中。急用

眾所周知,java在處理數據量比較大的時候,載入到內存必然會導致內存溢出,而在一些數據處理中我們不得不去處理海量數據,在做數據處理中,我們常見的手段是分解,壓縮,並行,臨時文件等方法;例如,我們要將資料庫(不論是什麼資料庫)的數據導出到一個文件,一般是Excel或文本格式的CSV;對於Excel來講,對於POI和JXL的介面,你很多時候沒有法去控制內存什麼時候向磁碟寫入,很惡心,而且這些API在內存構造的對象大小將比數據原有的大小要大很多倍數,所以你不得不去拆分Excel,還好,POI開始意識到這個問題,在3.8.4的版本後,開始提供cache的行數,提供了SXSSFWorkbook的介面,可以設置在內存中的行數,不過可惜的是,他當你超過這個行數,每添加一行,它就將相對行數前面的一行寫入磁碟(如你設置2000行的話,當你寫第20001行的時候,他會將第一行寫入磁碟),其實這個時候他些的臨時文件,以至於不消耗內存,不過這樣你會發現,刷磁碟的頻率會非常高,我們的確不想這樣,因為我們想讓他達到一個范圍一次性將數據刷如磁碟,比如一次刷1M之類的做法,可惜現在還沒有這種API,很痛苦,我自己做過測試,通過寫小的Excel比使用目前提供刷磁碟的API來寫大文件,效率要高一些,而且這樣如果訪問的人稍微多一些磁碟IO可能會扛不住,因為IO資源是非常有限的,所以還是拆文件才是上策;而當我們寫CSV,也就是文本類型的文件,我們很多時候是可以自己控制的,不過你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式寫入即可被CSV識別出來;如何寫入呢?下面來說說。。。在處理數據層面,如從資料庫中讀取數據,生成本地文件,寫代碼為了方便,我們未必要1M怎麼來處理,這個交給底層的驅動程序去拆分,對於我們的程序來講我們認為它是連續寫即可;我們比如想將一個1000W數據的資料庫表,導出到文件;此時,你要麼進行分頁,oracle當然用三層包裝即可,mysql用limit,不過分頁每次都會新的查詢,而且隨著翻頁,會越來越慢,其實我們想拿到一個句柄,然後向下游動,編譯一部分數據(如10000行)將寫文件一次(寫文件細節不多說了,這個是最基本的),需要注意的時候每次buffer的數據,在用outputstream寫入的時候,最好flush一下,將緩沖區清空下;接下來,執行一個沒有where條件的SQL,會不會將內存撐爆?是的,這個問題我們值得去思考下,通過API發現可以對SQL進行一些操作,例如,通過:PreparedStatementstatement=connection.prepareStatement(sql),這是默認得到的預編譯,還可以通過設置:PreparedStatementstatement=connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);來設置游標的方式,以至於游標不是將數據直接cache到本地內存,然後通過設置statement.setFetchSize(200);設置游標每次遍歷的大小;OK,這個其實我用過,oracle用了和沒用沒區別,因為oracle的jdbcAPI默認就是不會將數據cache到java的內存中的,而mysql里頭設置根本無效,我上面說了一堆廢話,呵呵,我只是想說,java提供的標准API也未必有效,很多時候要看廠商的實現機制,還有這個設置是很多網上說有效的,但是這純屬抄襲;對於oracle上面說了不用關心,他本身就不是cache到內存,所以java內存不會導致什麼問題,如果是mysql,首先必須使用5以上的版本,然後在連接參數上加上useCursorFetch=true這個參數,至於游標大小可以通過連接參數上加上:defaultFetchSize=1000來設置,例如:jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000上次被這個問題糾結了很久(mysql的數據老導致程序內存膨脹,並行2個直接系統就宕了),還去看了很多源碼才發現奇跡竟然在這里,最後經過mysql文檔的確認,然後進行測試,並行多個,而且數據量都是500W以上的,都不會導致內存膨脹,GC一切正常,這個問題終於完結了。我們再聊聊其他的,數據拆分和合並,當數據文件多的時候我們想合並,當文件太大想要拆分,合並和拆分的過程也會遇到類似的問題,還好,這個在我們可控制的范圍內,如果文件中的數據最終是可以組織的,那麼在拆分和合並的時候,此時就不要按照數據邏輯行數來做了,因為行數最終你需要解釋數據本身來判定,但是只是做拆分是沒有必要的,你需要的是做二進制處理,在這個二進制處理過程,你要注意了,和平時read文件不要使用一樣的方式,平時大多對一個文件讀取只是用一次read操作,如果對於大文件內存肯定直接掛掉了,不用多說,你此時因該每次讀取一個可控范圍的數據,read方法提供了重載的offset和length的范圍,這個在循環過程中自己可以計算出來,寫入大文件和上面一樣,不要讀取到一定程序就要通過寫入流flush到磁碟;其實對於小數據量的處理在現代的NIO技術的中也有用到,例如多個終端同時請求一個大文件下載,例如視頻下載吧,在常規的情況下,如果用java的容器來處理,一般會發生兩種情況:其一為內存溢出,因為每個請求都要載入一個文件大小的內存甚至於,因為java包裝的時候會產生很多其他的內存開銷,如果使用二進制會產生得少一些,而且在經過輸入輸出流的過程中還會經歷幾次內存拷貝,當然如果有你類似nginx之類的中間件,那麼你可以通過send_file模式發送出去,但是如果你要用程序來處理的時候,內存除非你足夠大,但是java內存再大也會有GC的時候,如果你內存真的很大,GC的時候死定了,當然這個地方也可以考慮自己通過直接內存的調用和釋放來實現,不過要求剩餘的物理內存也足夠大才行,那麼足夠大是多大呢?這個不好說,要看文件本身的大小和訪問的頻率;其二為假如內存足夠大,無限制大,那麼此時的限制就是線程,傳統的IO模型是線程是一個請求一個線程,這個線程從主線程從線程池中分配後,就開始工作,經過你的Context包裝、Filter、攔截器、業務代碼各個層次和業務邏輯、訪問資料庫、訪問文件、渲染結果等等,其實整個過程線程都是被掛住的,所以這部分資源非常有限,而且如果是大文件操作是屬於IO密集型的操作,大量的CPU時間是空餘的,方法最直接當然是增加線程數來控制,當然內存足夠大也有足夠的空間來申請線程池,不過一般來講一個進程的線程池一般會受到限制也不建議太多的,而在有限的系統資源下,要提高性能,我們開始有了newIO技術,也就是NIO技術,新版的裡面又有了AIO技術,NIO只能算是非同步IO,但是在中間讀寫過程仍然是阻塞的(也就是在真正的讀寫過程,但是不會去關心中途的響應),還未做到真正的非同步IO,在監聽connect的時候他是不需要很多線程參與的,有單獨的線程去處理,連接也又傳統的socket變成了selector,對於不需要進行數據處理的是無需分配線程處理的;而AIO通過了一種所謂的回調注冊來完成,當然還需要OS的支持,當會掉的時候會去分配線程,目前還不是很成熟,性能最多和NIO吃平,不過隨著技術發展,AIO必然會超越NIO,目前谷歌V8虛擬機引擎所驅動的node.js就是類似的模式,有關這種技術不是本文的說明重點;將上面兩者結合起來就是要解決大文件,還要並行度,最土的方法是將文件每次請求的大小降低到一定程度,如8K(這個大小是經過測試後網路傳輸較為適宜的大小,本地讀取文件並不需要這么小),如果再做深入一些,可以做一定程度的cache,將多個請求的一樣的文件,cache在內存或分布式緩存中,你不用將整個文件cache在內存中,將近期使用的cache幾秒左右即可,或你可以採用一些熱點的演算法來配合;類似迅雷下載的斷點傳送中(不過迅雷的網路協議不太一樣),它在處理下載數據的時候未必是連續的,只要最終能合並即可,在伺服器端可以反過來,誰正好需要這塊的數據,就給它就可以;才用NIO後,可以支持很大的連接和並發,本地通過NIO做socket連接測試,100個終端同時請求一個線程的伺服器,正常的WEB應用是第一個文件沒有發送完成,第二個請求要麼等待,要麼超時,要麼直接拒絕得不到連接,改成NIO後此時100個請求都能連接上伺服器端,服務端只需要1個線程來處理數據就可以,將很多數據傳遞給這些連接請求資源,每次讀取一部分數據傳遞出去,不過可以計算的是,在總體長連接傳輸過程中總體效率並不會提升,只是相對相應和所開銷的內存得到量化控制,這就是技術的魅力,也許不要太多的演算法,不過你得懂他。類似的數據處理還有很多,有些時候還會將就效率問題,比如在HBase的文件拆分和合並過程中,要不影響線上業務是比較難的事情,很多問題值得我們去研究場景,因為不同的場景有不同的方法去解決,但是大同小異,明白思想和方法,明白內存和體系架構,明白你所面臨的是沈陽的場景,只是細節上改變可以帶來驚人的效果。

Ⅳ java能遠程監控linux主機的cpu和內存使用情況么

能的.你打開其他機器的 SNMP協議.然後用你的機器去訪問其他機器,獲取SNMP信息, 就能得到 CPU使用率,硬碟使用率,內存使用率,網卡流量等等信息了

Ⅳ java怎樣獲取CPU佔用率和硬碟佔用率

通過jmx可以監控vm內存使用,系統內存使用等,以下是網上某博客代碼,特點是通過window和linux命令獲得CPU使用率。

利用java程序實現獲取計算機cpu利用率和內存使用信息。

packagecom.amgkaka.performance;

/***//**
*監視信息的JavaBean類.
*@authoramg
*@version1.0
*Creationdate:2008-4-25-上午10:37:00
*/
publicclassMonitorInfoBean{
/***//**可使用內存.*/
privatelongtotalMemory;

/***//**剩餘內存.*/
privatelongfreeMemory;

/***//**最大可使用內存.*/
privatelongmaxMemory;

/***//**操作系統.*/
privateStringosName;

/***//**總的物理內存.*/
privatelongtotalMemorySize;

/***//**剩餘的物理內存.*/
;

/***//**已使用的物理內存.*/
privatelongusedMemory;

/***//**線程總數.*/
privateinttotalThread;

/***//**cpu使用率.*/
privatedoublecpuRatio;

publiclonggetFreeMemory(){
returnfreeMemory;
}

publicvoidsetFreeMemory(longfreeMemory){
this.freeMemory=freeMemory;
}

(){
returnfreePhysicalMemorySize;
}

(longfreePhysicalMemorySize){
this.freePhysicalMemorySize=freePhysicalMemorySize;
}

publiclonggetMaxMemory(){
returnmaxMemory;
}

publicvoidsetMaxMemory(longmaxMemory){
this.maxMemory=maxMemory;
}

publicStringgetOsName(){
returnosName;
}

publicvoidsetOsName(StringosName){
this.osName=osName;
}

publiclonggetTotalMemory(){
returntotalMemory;
}

publicvoidsetTotalMemory(longtotalMemory){
this.totalMemory=totalMemory;
}

publiclonggetTotalMemorySize(){
returntotalMemorySize;
}

publicvoidsetTotalMemorySize(longtotalMemorySize){
this.totalMemorySize=totalMemorySize;
}

publicintgetTotalThread(){
returntotalThread;
}

publicvoidsetTotalThread(inttotalThread){
this.totalThread=totalThread;
}

publiclonggetUsedMemory(){
returnusedMemory;
}

publicvoidsetUsedMemory(longusedMemory){
this.usedMemory=usedMemory;
}

publicdoublegetCpuRatio(){
returncpuRatio;
}

publicvoidsetCpuRatio(doublecpuRatio){
this.cpuRatio=cpuRatio;
}
}

Ⅵ java程序運行完成之後怎麼看它所用的時間和內存

可以使用java監控工具來監測java程序的執行效率,下面介紹兩種:
1 jconsole工具使回用
1)遠程連接進程
2)連接成功後答可以觀察概覽、內存、線程、類、VM概要、MBean
3)可以查看不同區的內存使用情況
2 jvisualvm工具使用
1)遠程連接進程
2)登錄成功可以查看概述)監視)線程)抽樣器。
3)監視:CPU、內存、類、線程
4)通過抽樣器可以做內存鏡像
另外,還有jps、jstack、jmap、jhat、jstat、hprof等各種工具
工具不在多,選擇一款自己用起來最順手的即可

Ⅶ 如何用java代碼來監控系統內存·cpu·線程佔用情況,並生成日誌

可以學習軟體包 java.lang.management
提供管理介面,用於監視和管理 Java 虛擬機以及 Java 虛擬機在其回上運行的操作系統。答

ClassLoadingMXBean
用於 Java 虛擬機的類載入系統的管理介面。

CompilationMXBean
用於 Java 虛擬機的編譯系統的管理介面。

GarbageCollectorMXBean
用於 Java 虛擬機的垃圾回收的管理介面。

MemoryManagerMXBean
內存管理器的管理介面。

MemoryMXBean
Java 虛擬機內存系統的管理介面。

MemoryPoolMXBean
內存池的管理介面。

OperatingSystemMXBean
用於操作系統的管理介面,Java 虛擬機在此操作系統上運行。

RuntimeMXBean
Java 虛擬機的運行時系統的管理介面。

ThreadMXBean
Java 虛擬機線程系統的管理介面。
更多請訪問(bug315)

Ⅷ 怎麼用JAVA實現監控LINUX下CPU的使用率 windows下怎麼查看呢用什麼方法 請高手指教,謝謝!

用java的話,有來兩個方自法:
1.利用java直接調用shell命令查看cpu的參數(系統不同命令也不同)
類似代碼:
可以查考http://aimer311.javaeye.com/blog/347908
2.利用軟體linux下可以安裝net-snmp實現遠程和本地監控
具體方法的話比較負責你網上查查

因為不知道你的linux到底是什麼系統所有我沒法給你寫命令

閱讀全文

與java監控cpu內存相關的資料

熱點內容
刷入的cp文件是什麼 瀏覽:513
dcp文件是什麼 瀏覽:427
win10驅動刪不了怎麼辦啊 瀏覽:459
win7如何做共享文件夾圖標 瀏覽:178
魔獸120怎麼升級124 瀏覽:395
智能健康手錶下載什麼app 瀏覽:664
想在協和醫院掛號怎麼下載app 瀏覽:86
關於科技產品需要哪些數據 瀏覽:623
linux命令行修改文件內容 瀏覽:526
java通信框架有哪些 瀏覽:331
哪裡看美國報紙app 瀏覽:753
excel打開同一個文件出現兩個窗口 瀏覽:318
手機版用word做文件怎麼換行 瀏覽:822
應用程序無法正常啟動0xc0000013 瀏覽:761
華為鴻蒙主題在哪個文件夾 瀏覽:683
什麼app是扔地雷 瀏覽:497
游戲策劃要學什麼編程語言 瀏覽:600
解壓後的文件哪個是你安裝包 瀏覽:540
g2文件是什麼 瀏覽:782
python中修改文件 瀏覽:198

友情鏈接