java線程內存
❶ java線程是什麼
一、操作系統中線程和進程的概念
現在的操作系統是多任務操作系統。多線程是實現多任務的一種方式。
進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啟動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。
線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬於某個進程,進程中的多個線程共享進程的內存。
「同時」執行是人的感覺,在線程之間實際上輪換執行。
二、Java中的線程
在Java中,「線程」指兩件不同的事情:
1、java.lang.Thread類的一個實例;
2、線程的執行。
使用java.lang.Thread類或者java.lang.Runnable介面編寫代碼來定義、實例化和啟動新線程。
一個Thread類實例只是一個對象,像Java中的任何其他對象一樣,具有變數和方法,生死於堆上。
Java中,每個線程都有一個調用棧,即使不在程序中創建任何新的線程,線程也在後台運行著。
一個Java應用總是從main()方法開始運行,mian()方法運行在一個線程內,它被稱為主線程。
一旦創建一個新的線程,就產生一個新的調用棧。
線程總體分兩類:用戶線程和守候線程。
當所有用戶線程執行完畢的時候,JVM自動關閉。但是守候線程卻不獨立於JVM,守候線程一般是由操作系統或者用戶自己創建的
❷ 在 java中 線程的工作內存,是不是指的就是,操作數棧 和 局部變數表 求解答!!!
並不是一個層次上的概念,線程中的工作內存可以類比與操作系統中的數據緩存區域,而局部變數表中的變數與操作數棧在虛擬機分配內存時,有可能會分配帶數據緩存區域。
❸ java多線程開多少上限量。
1。java的線程開啟,默認的虛擬機會分配1M的內存,但是在4G的windows上線程最多也就開到300多 ,是因為windows本身的一些限制導致。
2。虛擬機給每個線程分配的內存(棧空間)是由虛擬機參數-Xss來指定的,在不同平台上對應的默認大小可以 在oracle的官方文檔上查詢到:
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman /optionX.html
其中,Linux64位默認Xss值為256K,並非1M或10M
3。一個Java進程可以啟動的線程數可以通過如下公式計算:
(系統剩餘內存 - 最大堆容量Xmx - 最大方法區容量MaxPermSize)/ 最大棧空間Xss
這樣,4G的伺服器單個進程可以開多少線程,可以粗略計算出來,大概是5000個線程。
❹ 在java中是否能限制每個線程的佔用內存
進程是可以控制的,線程的是沒法控制的。只能增大XmxXms這些參數,或者優化程序。
避免因為用戶查詢大量數據佔用內存這個可以通過程序優化的方式來解決,比如:用分頁、動態分頁、流的方式向前台輸出數據。
❺ 新建一個JAVA線程,佔用的是JAVA堆內存還是操作系統的內存
Thread對象本身是在堆內存創建的,調用start()後開辟的線程空間是屬於棧內存的。內存管理在Java語言中是JVM自動操作的,當JVM發現某些對象不再需要的時候,就會對該對象佔用的內存進行重分配(釋放)操作,而且使得分配出來的內存能夠提供給所需要的對象。
在一些編程語言裡面,內存管理是一個程序的職責,但是書寫過C++的程序員很清楚,如果該程序需要自己來書寫很有可能引起很嚴重的錯誤或者說不可預料的程序行為,最終大部分開發時間都花在了調試這種程序以及修復相關錯誤上。
相關信息
在以前的編程過程中,手動內存管理帶了計算機程序不可避免的錯誤,而且這種錯誤對計算機程序是毀滅性的,所以內存管理就成為了一個很重要的話題,但是針對大多數純面向對象語言而言,比如Java,提供了語言本身具有的內存特性。
自動化內存管理,這種語言提供了一個程序垃圾回收器(Garbage Collector[GC]),自動內存管理提供了一個抽象的介面以及更加可靠的代碼使得內存能夠在程序裡面進行合理的分配。最常見的情況就是垃圾回收器避免了懸掛引用的問題。
因為一旦這些對象沒有被任何引用「可達」的時候,也就是這些對象在JVM的內存池裡面成為了不可引用對象,該垃圾回收器會直接回收掉這些對象佔用的內存,當然這些對象必須滿足垃圾回收器回收的某些對象規則,而垃圾回收器在回收的時候會自動釋放掉這些內存。
❻ Java如何獲取某個線程所使用的內存的大小
要實時查看某個Thread所使用的內存大小並沒有具體的語句。
但是可以通過前後對比法進行階段性監控與分析。
首先加入一個靜態方法:
public static long getMemory() {
return Runtime.getRuntime().freeMemory();
}
這個是查看運行時空閑內存的語句。
所以應該在需要檢測的線程執行點前後進行插樁。
long point1 = getMemory();
線程調用
long point2 = getMemory();
注意:另外,在這個過程中不應該有其他的干擾(調用其他線程或者其他操作)
甚至可以在線程中進行插樁,然後分析所有點的數值變化,根據數值差,就可以得出答案。
❼ java 一個線程佔多少內存
對於某個線程的內存佔用,是無法知道的,因為是共享內存的。
限制每個線程的佔用內存,避免因為用戶查詢大量數據佔用內存,從而引發java的out of memory錯誤。
進程是可以控制的,線程的是沒法控制的。只能增大Xmx Xms這些參數,或者優化程序。
❽ 怎樣查看java線程內存使用情況
首先加入一個靜態方法:
public static long getMemory() {
return Runtime.getRuntime().freeMemory();
}
這個是查看運行時空閑內存的語句。
線程啟動前
long point1 = getMemory();
線程調用
long point2 = getMemory();
兩數之差 就是佔用內存
❾ java項目中很多地方使用線程池,線上伺服器內存佔用越來越大.每個線程佔用8.8M.問題是哪兒
針對你說的這種情況,可以使用jvisualvm.exe直接查看內存使用情況,查看是否是有大對象。
❿ 如何查看java線程佔用的內存
首先加入一個靜態方法:
public static long getMemory() {
return Runtime.getRuntime().freeMemory();
}
這個是查看運行時空閑內存的語句。
線程啟動前
long point1 = getMemory();
線程調用
long point2 = getMemory();
兩數之差 就是佔用內存