java快照
Ⅰ java的monitor機制中,為什麼阻塞隊列用list等待隊列用set
java阻塞隊列應用於生產者消費者模式、消息傳遞、並行任務執行和相關並發設計的大多數常見使用上下文。
BlockingQueue在Queue介面基礎上提供了額外的兩種類型的操作,分別是獲取元素時等待隊列變為非空和添加元素時等待空間變為可用。
BlockingQueue新增操作的四種形式:
3.2.1.3 HashMap類
對Map類的另外一個實現是HashMap。HashMap使用Hash表數據結構。HashMap假定哈希函數能夠將元素適當的分布在各桶之間,提供一種接近O(1)的查詢和更新操作。但是如果需要對集合進行迭代,則與HashMap的容量和桶的大小有關,因此HashMap的迭代效率不會很高(尤其是你為HashMap設置了較大的容量時)。
與HashMap性能有影響的兩個參數是,初始容量和載入因子。容量是哈希表中桶的數量,初始容量是哈希表在創建時的容量。載入因子是哈希表在容器容量被自動擴充之前,HashMap能夠達到多滿的一種程度。當hash表中的條目數超出了載入因子與當前容量的乘積時,Hash表需要進行rehash操作,此時Hash表將會擴充為以前兩倍的桶數,這個擴充過程需要進行完全的拷貝工作,效率並不高,因此應當盡量避免。合理的設置Hash表的初始容量和載入因子會提高Hash表的性能。HashMap自身不是線程安全的,可以通過Collections的synchronizedMap方法對HashMap進行包裝。
3.2.1.4 ConcurrentHashMap類
ConcurrentHashMap類實現了ConcurrentMap介面,並提供了與HashMap相同的規范和功能。實際上Hash表具有很好的局部可操作性,因為對Hash表的更新操作僅會影響到具體的某個桶(假設更新操作沒有引發rehash),對全局並沒有顯著影響。因此ConcurrentHashMap可以提供很好的並發處理能力。可以通過concurrencyLevel的設置,來控制並發工作線程的數目(默認為16),合理的設置這個值,有時很重要,如果這個值設置的過高,那麼很有可能浪費空間和時間,使用的值過低,又會導致線程的爭用,對數量估計的過高或過低往往會帶來明顯的性能影響。最好在創建ConcurrentHashMap時提供一個合理的初始容量,畢竟rehash操作具有較高的代價。
3.2.2 ConcurrentSkipListSet類
實際上Set和Map從結構來說是很像的,從底層的演算法原理分析,Set和Map應當屬於同源的結構。所以Java也提供了TreeSet和ConcurrentSkipListSet兩種SortedSet,分別適合於非多線程(或低並發多線程)和多線程程序使用。具體的演算法請參考前述的Map相關介紹,這里不在累述。
3.2.3 CopyOnWriteArrayList類
CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中對於所有的可變操作都是通過對底層數組進行一次新的復制來實現的。
由於可變操作需要對底層的數據進行一次完全拷貝,因此開銷一般較大,但是當遍歷操作遠遠多於可變操作時,此方法將會更有效,這是一種被稱為「快照」的模式,數組在迭代器生存期內不會發生更改,因此不會產生沖突。創建迭代器後,迭代器不會反映列表的添加、移除或者更改。不支持在迭代器上進行remove、set和add操作。CopyOnWriteArraySet與CopyOnWriteArrayList相似,只不過是Set類的一個變體。
3.2.3 Collections提供的線程安全的封裝
Collections中提供了synchronizedCollection、synchronizedList、synchronizedMap、synchronizedSet、synchronizedSortedMap、synchronizedSortedMap等方法可以完成多種集合的線程安全的包裝,如果在並發度不高的情況下,可以考慮使用這些包裝方法,不過由於Concurrent相關的類的出現,已經不這么提倡使用這些封裝了,這些方法有些人稱他們為過時的線程安全機制。
3.2.4簡單總結
提供線程安全的集合簡單概括分為三類,首先,對於並發性要求很高的需求可以選擇以Concurrent開頭的相應的集合類,這些類主要包括:ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentSkipListMap、ConcurrentSkipSet。其次對於可變操作次數遠遠小於遍歷的情況,可以使用CopyOnWriteArrayList和CopyOnWriteArraySet類。最後,對於並發規模比較小的並行需求可以選擇Collections類中的相應方法對已有集合進行封裝。
此外,本章還對一些集合類的底層實現進行簡單探討,對底層實現的了解有利於對何時使用何種方式作出正確判斷。希望大家能夠將涉及到原理(主要有循環隊列、堆、HashMap、紅黑樹、SkipList)進行仔細研究,這樣才能更深入了解Java為什麼這樣設計類庫,在什麼情況使用,應當如何使用。
Ⅱ java如何實現不開web頁面取得頁面快照
我以前有類似的需求: 前台提供組織架構的設置,然後提供生成這個架構(html內容)的圖片。
我使用的是一個工具html2image,它使用了firefox的內核來生成頁面內容並轉換為圖片,整個過程是一氣呵成的,只需要提供url作為命令參數就可以了!
Ⅲ java snapshot版本是什麼意思
Maven的Snapshot版本與Release版本
1. Snapshot版本代表不穩定、尚處於開發中的版本
2. Release版本則代表穩定的版本
3. 什麼情況下該用SNAPSHOT?
協同開發時,如果A依賴構件B,由於B會更新,B應該使用SNAPSHOT來標識自己。這種做法的必要性可以反證如下:
a.如果B不用SNAPSHOT,而是每次更新後都使用一個穩定的版本,那版本號就會升得太快,每天一升甚至每個小時一升,這就是對版本號的濫用。
b.如果B不用SNAPSHOT, 但一直使用一個單一的Release版本號,那當B更新後,A可能並不會接受到更新。因為A所使用的repository一般不會頻繁更新release版本的緩存(即本地repository),所以B以不換版本號的方式更新後,A在拿B時發現本地已有這個版本,就不會去遠程Repository下載最新的B
4. 不用Release版本,在所有地方都用SNAPSHOT版本行不行?
不行。正式環境中不得使用snapshot版本的庫。 比如說,今天你依賴某個snapshot版本的第三方庫成功構建了自己的應用,明天再構建時可能就會失敗,因為今晚第三方可能已經更新了它的snapshot庫。你再次構建時,Maven會去遠程repository下載snapshot的最新版本,你構建時用的庫就是新的jar文件了,這時正確性就很難保證了。
Ⅳ java如何實現不開web頁面取得頁面快照
請問有什麼辦法能直接在後台得到網頁快照嗎?請大牛們賜教,謝謝了!
【注意】:此處的快照,相當於截圖,最後產生的是一個圖片
趁著這次活動的機會,不但自己要回答比人問題,也得給他人提供一個答題的機會,一舉兩得吧!
問題補充:原始需求是:我前台利用程序產生了一個html頁面(這個功能是需要用戶參與設計的),而且想要得到這個html的預覽圖,使用iframe載入這個頁面的話,速度太慢了,於是就想到了自動生成頁面圖片的辦法,每設計一個html頁面,就自動生成一張預覽圖片,而且要讓用戶感知不到這個預覽圖片是如何產生的,可能確實比較難,所以才想讓大牛們出個主意啊,再次謝謝了! 問題補充:jkxydp 寫道用webkit作為渲染器來生成內存圖像不曉得可行不。不是要求瀏覽器的滿足什麼,而是圖像的生成要在後台完成,而且要用純java的,其實也有不少方法可以實現,不過要麼圖像生成的太差,要麼是收費的,為難啊!不過還是要謝謝你了!
Ⅳ 如何使用Java實現百度快照的功能
網路快照新舊。筆者最近一個月做幾個網站的優化,經過觀察及試驗得出些更利於網路快照更新的方法,下面給 交換友情鏈接時不要只看pr,pr對於網路優化來說並不是很看重,網路優化看重的是網路快照及收錄,要求高點
Ⅵ 如何導出Java應用程序的內存快照文件
問了一下我之前的在遠標教育的大學同學,他說在windows下找到要導出的Java應用的進程號。比如我要導出本機的Eclipse的內存快照,因為Eclipse也是Java應用。首先要找到Eclispe的進程號。在命令行輸入:tasklist | findstr eclipse。
可以看到,Eclispe的進程號是8052。然後在命令行輸入:jmap -mp:format=b,file=elipse.hprof 8052。file=elipse.hprof意思是設置生成的文件名,8052就是Java程序的進程號。
如果是在Linux系統下面,在命令行輸入:ps -ef | grep eclipse。
可以看到eclipse的進程號是2622。同樣,在命令行輸入:jmap -mp:format=b,file=elipse.hprof 2622。
把生成的elipse.hprof在SecureCRT命令行輸入:sz elipse.hprof,把文件下載到本地,用MAT之類的工具進行分析就可以了。
Ⅶ 如何以Java實現網頁截圖技術,根據URL得到網頁快照
如何以Java實現網頁截圖技術,根據URL得到網頁快照
// 此方法僅適用於JdK1.6及以上版本
Desktop.getDesktop().browse(
new URL("http://www.csdn.net/").toURI());
Robot robot = new Robot();
//停留10s
//robot.delay(10000);
Dimension d = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
int width = (int) d.getWidth();
int height = (int) d.getHeight();
// 最大化瀏覽器
robot.keyRelease(KeyEvent.VK_F11);
robot.delay(2000);
Image image = robot.createScreenCapture(new Rectangle(0, 0, width,
height));
BufferedImage bi = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
// 保存圖片
ImageIO.write(bi, "jpg", new File("c:/iteye.com.jpg"));
Ⅷ java如何判斷某個URL的百度快照是否存在、有效
確實有點難的問題,我的一點思路
1、用HttpClient向網路發出一條查詢,這個查詢盡可能與URL相關
2、用一些網頁parse庫,檢查返回的結果裡面有沒有你的目標URL
3、如果有,找到那條記錄下面網路快照對應的URL
4、再用HttpClient訪問網路快照的URL。看返回結果,就知道快照是否有效了
但是很可能出現第一次查詢找不到目標URL的情況
Ⅸ 如何查看java虛擬機當前線程的快照
使用jvisualvm命令 打開界面直接可以查看快照,分析javacode等。
使用weblogic anaysier等第三方工具也可以。