国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

服務器之家 - 編程語言 - JAVA教程 - Java 可視化垃圾回收_動力節點Java學院整理

Java 可視化垃圾回收_動力節點Java學院整理

2020-10-26 16:37動力節點 JAVA教程

Ben Evans是一名資深培訓師兼顧問,他在演講可視化垃圾回收中從基礎談起討論了垃圾回收。以下是對其演講的簡短總結。感興趣的朋友一起學習吧

ben evans是一名資深培訓師兼顧問,他在演講可視化垃圾回收中從基礎談起討論了垃圾回收。

以下是對其演講的簡短總結。

基礎

當談到釋放不再使用的內存,垃圾回收已經在很大程度上取代了早期技術,比如手動內存管理和引用計數。

這是件好事,因為內存管理令人厭煩,學究式地簿記是計算機擅長的,而不是人擅長的。在這方面,語言的運行時環境比人強。

現代的垃圾回收非常高效,遠遠超過早期語言中典型的手工分配。通常,具有其它語言背景的人只盯著垃圾回收造成的中斷,卻沒有完全理解自動內存管理發生作用的上下文環境。

標記&清除是java(及其它運行時環境)用于垃圾回收的基本算法。

在標記&清除算法中,引用會從每個線程棧的楨指向程序的堆。所以,從棧開始,循著指針找到所有可能的引用,然后再循著這些引用遞歸下去。

當遞歸完成,就找到了所有的活對象,其它的都是垃圾。

請注意,人們經常漏掉的一點是,運行時環境本身也有一個“分配清單(allocation list)”,上面列出了指向每個對象的指針,該列表由垃圾回收器負責維護,并幫助垃圾回收器進行垃圾清理。因此,運行時環境總是可以找出由它創建但尚未回收的對象。

Java 可視化垃圾回收_動力節點Java學院整理

圖一

上面插圖中所示的棧只是一個與單個應用程序線程相關的棧;每個應用程序線程都有一個類似的棧,每個棧本身都有一組指向堆的指針。

如果垃圾回收器試圖在應用程序運行過程中獲取活對象的快照,那么它就要追蹤運動著的目標,那樣很容易漏掉一些嚴重超時的對象分配,因而無法獲得一個準確的快照。因此,“stop the world”是有必要的;也就是,停止應用程序線程足夠長的時間,以便捕獲活對象的快照。

下面是垃圾回收器必須遵循的兩條黃金法則:

垃圾回收器必須回收所有的垃圾。 垃圾回收器必須從不回收任何活對象。

但這兩條規則并不是對等的;如果違反了第二條規則,結果會使數據遭到破壞。

另一方面,如果違反了第一條規則,則會是另一種情況,系統并不總是能夠回收所有的垃圾,但最終會回收所有的垃圾,那么這是可以接受的,而實際上,這是垃圾回收器的基本原理。

hotspot

現在,我們來說下hotspot,它實際上是一個c、c++以及許多特定于平臺的匯編程序組成的混合體。

當人們想到解釋器,就會想到一個很大的while循環,其中包含一個很長的switch語句。但hotspot解釋器比那個要復雜的多(由于性能原因)。在開始閱讀jdk源代碼的時候,就會發現hotspot中實在是有許多匯編程序代碼。

對象創建

java會預先分配大量的連續空間,就是我們所說的“堆”。之后,hotspot完全在用戶空間里管理這塊內存。

如果一個java進程占用了大量的系統(或內核)時間,那么毫無疑問,它不是在進行垃圾回收——因為所有的垃圾回收內存“簿記(bookkeeping)”都是在用戶空間進行的。

內存池

Java 可視化垃圾回收_動力節點Java學院整理

圖二

“永久代(permgen)”是一個存儲區域,用于保存那些需要在程序生存期內一直存活的東西,如類的元數據。不過,隨著應用程序服務器的出現,它們有自己的類加載器,并且需要重新加載類的元數據,永久代作為一個優化決策開始顯得糟糕,所幸,它在java 8中消失了。

java 8將會使用一個名為“元空間(metaspace)”的新概念。元空間與永久代并不完全相同。它在堆的外面,由操作系統管理。這意味著,它不會在java堆中,而是在本地內存里。目前,這還不是一個非常好的消息,因為沒有多少工具能夠讓用戶輕松地查看本地內存。所以,永久代消失是件好事,但工具趕上這個變化還需要一些時間。

java堆布局

現在,我們來看下java堆。注意堆空間之間的虛擬空間。它們提供了一點浮動量,以允許對內存池進行一定量的尺寸調整,又不用為任何對象移動付出代價。

Java 可視化垃圾回收_動力節點Java學院整理

圖三

“弱代假設(weak generational hypothesis)”

就現狀而言,究竟為什么要將堆分成所有這些內存池?

Java 可視化垃圾回收_動力節點Java學院整理

圖四

有的運行時事實無法通過靜態分析推導出來。上面的插圖說明有兩組對象:一組存活時間短,一組存活時間長——所以,做額外的簿記以便利用這一事實是有意義的。在java平臺中,有許多類似的作為優化寫入平臺的事實。

演示

ben evans進行了一系列的動畫演示。第一個演示是個flash,說明了對象在eden區和一個新生代survivor空間之間移動,并最終進入老年代的過程。

圖五是用javafx再現了同樣的過程。

Java 可視化垃圾回收_動力節點Java學院整理

圖五

運行時開關

‘強制性'參數

-verbose:gc——為用戶輸出一些gc信息 -xloggc:<文件路徑>——指定日志輸出路徑,要確保磁盤有空間 -xx:+pringgcdetails——為輔助工具提供“最低限度信息(minimum information)”

——用這個參數代替-verbose:gc

--xx:printtenuringdistribution——“過早提升(premature promotion)”信息 基本堆大小參數-xms<size>—— 設置預留給堆的最小內存值 -xmx<size>—— 設置預留給堆的最大內存值 -xx:maxpermsize=<size>——設置永久代的最大內存值

——有利于spring應用程序和應用服務器

以前,我們被教導要把-xms和-xmx的值設的一樣大。不過這已經變了。因此,現在可以為-xms設置一個合理范圍內較小的值,或者根本就不設置,因為堆的適應能力現在已經非常好了。

其它參數-xx:newratio=n -xx:newsize=n -xx:maxnewsize=n -xx:maxheapfreeratio -xx:minheapfreeratio -xx:survivorratio=n -xx:maxtenuringthreshold=n

Java 可視化垃圾回收_動力節點Java學院整理

圖六

為什么要有日志文件

日志文件的好處是能夠用于取證分析,可以使用戶免于為了再現問題而不得不再執行一次代碼(如果是一個罕見的生產環境錯誤,那么重現并不容易)。

另外,它們包含的信息比針對內存的jmx mxbeans所能提供的信息更多,且不說輪詢jmx本身會引入一系列gc問題。

工具

hp jmeter(用google查詢一下)

——免費,非??煽?,但不再提供支持/功能增強

gcviewer

——免費,開源,但界面有點丑

garbagecat

——名字最好聽

ibm gcmv

——支持j9

jclarity censum

——界面最美觀,而且最有用——不過,這是我們的偏見!

小結

  • 需要了解一些gc基礎理論
  • 要讓新生代的大部分對象在年輕時死亡
  • 打開gc日志!——原始日志文件難以閱讀——使用工具
  • 使用工具來幫助自己調優——測量,而不是猜測

以上所述是小編給大家介紹的java 可視化垃圾回收,希望對大家有所幫助!

延伸 · 閱讀

精彩推薦
  • JAVA教程Spring @Value 設置默認值的實現

    Spring @Value 設置默認值的實現

    這篇文章主要介紹了Spring @Value 設置默認值的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    carol_gao4992020-09-11
  • JAVA教程用Java設計模式中的觀察者模式開發微信公眾號的例子

    用Java設計模式中的觀察者模式開發微信公眾號的例子

    這篇文章主要介紹了用Java設計模式中的觀察者模式開發微信公眾號的例子,這里Java的微信SDK等部分便不再詳述,只注重關鍵部分和開發過程中觀察者模式優點...

    鴻洋_2742020-04-06
  • JAVA教程Java遍歷集合的三種方式

    Java遍歷集合的三種方式

    本文主要對于遍歷集合獲取其對象,總結的三種簡單的方式進行介紹,文章中舉了兩個案例進行對比,具有很好的參考價值,下面就跟小編一起來看下吧...

    Bigerf4872020-07-14
  • JAVA教程Javaweb EL自定義函數開發及代碼實例

    Javaweb EL自定義函數開發及代碼實例

    這篇文章主要介紹了Javaweb EL自定義函數開發及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可...

    考拉熊_124982020-06-29
  • JAVA教程Scala中的mkString的具體使用方法

    Scala中的mkString的具體使用方法

    這篇文章主要介紹了Scala中的mkString的具體方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    LittleLawson5122019-07-08
  • JAVA教程Java Web請求與響應實例詳解

    Java Web請求與響應實例詳解

    這篇文章主要介紹了Java Web請求與響應實例詳解的相關資料,需要的朋友可以參考下 ...

    luoxn282862020-04-26
  • JAVA教程Java 字節數組類型(byte[])與int類型互轉方法

    Java 字節數組類型(byte[])與int類型互轉方法

    下面小編就為大家帶來一篇Java 字節數組類型(byte[])與int類型互轉方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看...

    jingxian1772020-08-05
  • JAVA教程淺談java中六大時間類的使用和區別

    淺談java中六大時間類的使用和區別

    下面小編就為大家帶來一篇淺談java中六大時間類的使用和區別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    jingxian4382020-07-27
主站蜘蛛池模板: 国产一区二区三区在线视频观看 | 午夜免费在线 | 免费观看欧美一级大片 | 久久艹色| 精品一区二区免费视频视频 | 国产丝袜视频 | 视频1区 | 午夜午夜精品一区二区三区文 | 人人九九精 | 欧美成人精品 | 国产日韩一区二区三免费高清 | 国产精品久久久91 | 国产激情 | 午夜精品久久久久久久久久久久 | 欧美一级欧美三级在线观看 | 黄色网址免费 | 免费观看一区二区三区毛片软件 | 久久久久久久av | 国产精品成人久久久久 | 欧美在线操| 亚洲精品视频观看 | 日韩欧美在线一区二区 | 最新中文字幕在线 | 久久高清 | 国产成人毛片 | 永久黄网站色视频免费 | 日日躁夜夜躁狠狠躁 | 欧美精品在线视频 | 黄色av三级 | 免费观看一级视频 | 羞羞网| 激情五月综合网 | 亚洲五码在线 | 中文字幕乱码亚洲精品一区 | 免费观看黄色 | 黄色片网站在线 | 成人精品视频一区二区三区 | 久草社区 | 一区二区免费 | 一级免费视频 | 国产一级一级毛片女人精品 |