java對象池
⑴ java都有哪些池技術
Java池技術
常量池
對象池
連接池
線程池
⑵ java生成對象的開銷和對象池維護對象的開銷哪個大
使用頻率比較高的,沒有屬性或屬性不會變化的對象適合對象池維護。
需要臨時創建,並不常用的對象適合直接創建。
⑶ Java 中常量池 和 對象池是一回事兒嗎
對象池就是在heap上開辟的內存,用new產生的對象都在這個區域開辟空間存儲。
常量池就是String常量定義以後都會放到常量池裡面
⑷ java對象池裡的對象如果長時間不被使用,會被jvm垃圾回收嗎
GC是有條件的,我們的確可以在一定硬體基礎上配置這個條件讓GC少發生,GC是耗資源性能的,
很多時候我們都是通過減少GC來提高系統的性能。
你說得對,對象池的大小不會造成內存緊張,基本上jvm是不會回收的,但是我們不能保證。
所以不要把這個放到你的業務邏輯里去,就像盡量不要把異常與業務邏輯掛鉤。
如果在你的程序里,能找到這樣的一條引用方向,那麼這個單體類是不會被回收的。
main->實例A->...->實例D->你所說的單體
GC發生時,判斷對象是否需要回收不是看是否被調用,而是是否被引用。
比如,main函數所在的類中所引用的成員變數List是不會被回收的。直到程序結束。
如果你的單體類只有一個,相信這個單體類還是一直被引用這比較好。這樣就不會被回收了。
-------------------------
java對象是否被垃圾回收不是看時間長短的,
是看是否被使用著,如果沒有被使用,又到了垃圾回收的條件時,
就會被回收的。
如果是被使用的,那麼不管怎麼樣都不會被回收的。
如果是靜態變數的話,看這個類是否被使用了。
⑸ 對象池用在哪些方面
恰 當地使用對象池化技術,可以有效地減少對象生成和初始化時的消耗,提高系統的運行效率。Jakarta Commons Pool組件提供了一整套用於實現對象池化的框架,以及若干種各具特色的對象池實現,可以有效地減少處理對象池化時的工作量,為其它重要的工作留下更多的 精力和時間。
創建新的對象並初始化的操作,可能會消耗很多的時間。在這種對象的初始化工作包含了一些費時的操作(例如,從一台位於20,000千 米以外的主機上讀出一些數據)的時候,尤其是這樣。在需要大量生成這樣的對象的時候,就可能會對性能造成一些不可忽略的影響。要緩解這個問題,除了選用更 好的硬體和更棒的虛擬機以外,適當地採用一些能夠減少對象創建次數的編碼技巧,也是一種有效的對策。對象池化技術(Object Pooling)就是這方面的著名技巧,而Jakarta Commons Pool組件則是處理對象池化的得力外援。
對象池化技術
對象池化的基本思路是:將用過的對象保存起來,等下一次需要這種對象的時候,再拿出來重復使用,從而在一定程度上減少頻繁創建對象所造成的開銷。用於充當保存對象的「容器」的對象,被稱為「對象池」(Object Pool,或簡稱Pool)。
對 於沒有狀態的對象(例如String),在重復使用之前,無需進行任何處理;對於有狀態的對象(例如StringBuffer),在重復使用之前,就需要 把它們恢復到等同於剛剛生成時的狀態。由於條件的限制,恢復某個對象的狀態的操作不可能實現了的話,就得把這個對象拋棄,改用新創建的實例了。
並非所有對象都適合拿來池化??因為維護對象池也要造成一定開銷。對生成時開銷不大的對象進行池化,反而可能會出現「維護對象池的開銷」大於「生成新對象的開銷」,從而使性能降低的情況。但是對於生成時開銷可觀的對象,池化技術就是提高性能的有效策略了。
說明:英語中的Pool除了「池」之外,還有「供多方共享的資源」意思。作者十分懷疑第二種才是「Object Pool」中的Pool的實際含義,但是「對象池」的說法已經廣為流傳,而一時又沒有足以替代的貼切譯法,因此這里仍然沿用這種譯名。
Jakarta Commons Pool組件
Jakarta Commons Pool是一個用於在Java程序中實現對象池化的組件。它的基本情況是:
主要作者:Morgan Delagrange、Geir Magnusson、Craig McClanahan、Rodney Waldhoff、David Weinrich和Dirk Verbeeck
⑹ java 線程池機制的原理是什麼
線程池屬於對象池.所有對象池都具有一個非常重要的共性,就是為了最大程度復用對象.那麼線程池的最
重要的特徵也就是最大程度利用線程.
首先,創建線程本身需要額外(相對於執行任務而必須的資源)的開銷.
作業系統在每創建一個線程時,至少需要創建以下資源:
(1) 線程內核對象:用於對線程上下文的管理.
(2) 用戶模式執行棧.
(3) 內核模式執行棧.
這些資源被線程佔有後作業系統和用戶都無法使用.
相反的過程,銷毀線程需要回收資源,也需要一定開銷.
其次,過多的線程將導致過度的切換.線程切換帶來的性能更是不可估量.系統完成線程切換要經過以下過程:
(1) 從用戶模式切換到內核模式.
(2) 將CPU寄存器的值保存到當前線程的內核對象中.
(3)打開一個自旋鎖,根據調度策略決定下一個要執行的線程.釋放自旋鎖,如果要執行的線程不是同一進
程中的線程,還需要切換虛擬內存等進程環境.
(4) 將要執行的線程的內核對象的值寫到CPU寄存器中.
(5) 切換到用戶模式執行新線程的執行邏輯.
所以線程池的目的就是為了減少創建和切換線程的額外開銷,利用已經的線程多次循環執行多個任務從而提
高系統的處理能力.
⑺ 如何創建一個可以生成多種數據類型的的JAVA對象池,我自己看到的都是只能返回固定的對象。
創建一個工廠設計模式就可以達到你想要的
⑻ java中對象池的在什麼時候應用比較合適
一段程序由兩個線程實現:
線程A負責接收數據報並將其儲存在一個byte數組中,數據長度不超過4K並且大多數時間遠小於4K,然後數據被加入一個隊列;
線程B依次處理數據(處理完畢後byte數組就不需要了)
⑼ java資源池指什麼呢,如何理解
常見的資源池有:資料庫連接池,web容器中的request,response對象池,web容器中的線程池。
拿資料庫連接池為例。就是將資料庫連接資源的創建、使用與銷毀交由資料庫連接池去管理。
創建:由於創建資料庫連接比較耗時間,所以由資料庫連接池管理器事先創建好一定數量的連接。以便有請求需要連接資源時可以及時使用。
使用管理:當有請求需要資源時,向資源池拿資源,如果有資源則給予請求使用,如果沒有資源則需要看最大連接數。請求使用完連接資源時再將資源釋放給連接池以待下一個請求使用。
銷毀:當連接池資源過剩,空閑數達到了最小空閑數時,則會銷毀一些資源,以防資源浪費
⑽ java中九個對象池的對象都存放在方法區嗎
不是的,基本類型的包裝類是存儲在堆內的,其實String類也是一樣,值存儲在哪裡取決於怎麼聲明String對象,new String()就不在棧內,而是在堆內。