国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java GC

justCoding / 647人閱讀

摘要:對字節碼文件進行解釋執行,把字節碼翻譯成相關平臺上的機器指令。使用命令可對字節碼文件以及配置文件進行打包可對一個由多個字節碼文件和配置文件等資源文件構成的項目進行打包。和不存在永久代這種說法。

Java技術體系

從廣義上講,Clojure、JRuby、Groovy等運行于Java虛擬機上的語言及其相關的程序都屬于Java技術體系中的一員。如果僅從傳統意義上來看,Sun官方所定義的Java技術體系包括以下幾個組成部分:

Java程序設計語言

各種硬件平臺上的Java虛擬機

Class文件格式

Java API類庫

來自商業機構和開源社區的第三方Java類庫

我們可以把Java程序設計語言、Java虛擬機、Java API類庫這三部分統稱為JDK(Java Development Kit),JDK是用于支持Java程序開發的最小環境。

另外,可以把Java API類庫中的Java SE API子集[1]和Java虛擬機這兩部分統稱為JRE(Java Runtime Environment),JRE是支持Java程序運行的標準環境。

以上是根據各個組成部分的功能來進行劃分的,如果按照技術所服務的領域來劃分,或者說按照Java技術關注的重點業務領域來劃分,Java技術體系可以分為4個平臺,分別為:

Java Card:支持一些Java小程序(Applets)運行在小內存設備(如智能卡)上的平臺。

Java ME(Micro Edition):支持Java程序運行在移動終端(手機、PDA)上的平臺,對Java API有所精簡,并加入了針對移動終端的支持,這個版本以前稱為J2ME。

Java SE(Standard Edition):支持面向桌面級應用(如Windows下的應用程序)的Java平臺,提供了完整的Java核心API,這個版本以前稱為J2SE。

Java EE(Enterprise Edition):支持使用多層架構的企業應用(如ERP、CRM應用)的Java平臺,除了提供Java SE API外,還對其做了大量的擴充[3]并提供了相關的部署支持,這個版本以前稱為J2EE。

JVM

Java Virtual Machine,Java虛擬機。是java編譯后的.class文件(字節碼文件)與硬件系統之間的接口,也就是說用來運行.class文件。JVM實現了Java最重要的特性:平臺無關性

編譯后的 Java 程序指令并不直接在硬件系統的 CPU 上執行,而是由 JVM 執行,JVM屏蔽了與具體平臺相關的信息。JVM對字節碼文件進行解釋執行,把字節碼翻譯成相關平臺上的機器指令。

javac 是收錄于 JDK 中的 Java 語言編譯器。我們使用javac命令編譯Java源文件,得到.class文件。然后使用java命令執行.class文件(也就是使用JVM運行.class文件)。使用jar命令可對字節碼文件以及配置文件進行打包(可對一個由多個字節碼文件和配置文件等資源文件構成的項目進行打包)。

所以不熟悉java的同學要注意了,JVM并不是用來編譯和執行java的,JVM只負責執行字節碼文件,編譯java文件由javac來完成

java有一套公用的規范:Java Language and Virtual Machine Specifications

目前有三大Java虛擬機:HotSpot,oracle JRockit,IBM J9。

JRockit是oracle發明的,用于其WebLogic服務器,IBM JVM是IBM發明的用于其Websphere服務器,不同的JDK可能存在兼容性問題。

JRockit和J9不存在永久代這種說法。這里只討論HotSpot虛擬機,這也是目前使用的最多的JVM。Sun JDK7 HotSpot虛擬機的內存模型如下圖所示:

JVM的內存可分為:線程棧、堆、靜態方法區,native方法使用的是直接內存,不包含在JVM中。Java NDK可以調用C/C++。

方法區

方法區是可供各線程共享的運行時內存區域

方法區(Method Area)與Java堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。雖然Java虛擬機規范把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應該是與Java堆區分開來。

在不同的JDK版本中,方法區中存儲的數據是不一樣的。在JDK1.6及之前,運行時常量池是方法區的一個部分,同時方法區里面存儲了類的元數據信息、靜態變量、即時編譯器編譯后的代碼(比如spring 使用IOC或者AOP創建bean時,或者使用cglib,反射的形式動態生成class信息等)等。在JDK1.7及以后,JVM已經將運行時常量池從方法區中移了出來,在JVM堆開辟了一塊區域存放常量池。

方法區和永久代的關系

方法區(method area)只是JVM規范中定義的一個概念,用于存儲類信息、常量池、靜態變量、JIT編譯后的代碼等數據,具體放在哪里,不同的實現可以放在不同的地方。

永久代是Hotspot虛擬機特有的概念,是方法區的一種實現,別的JVM都沒有這個東西。在Java 8中,永久代被徹底移除,取而代之的是另一塊與堆不相連的本地內存——元空間(Metaspace),?XX:MaxPermSize 參數失去了意義,取而代之的是-XX:MaxMetaspaceSize。

永久代(PermGen)包含了JVM需要的應用元數據,這些元數據描述了在應用里使用的類和方法。注意,永久代不是Java堆內存的一部分。永久代存放JVM運行時使用的類。永久代同樣包含了Java SE庫的類和方法。永久代的對象在full GC時進行垃圾收集。

對于習慣在HotSpot虛擬機上開發、部署程序的開發者來說,很多人都更愿意把方法區稱為“永久代”(Permanent Generation),本質上兩者并不等價,僅僅是因為HotSpot虛擬機的設計團隊選擇把GC分代收集擴展至方法區,或者說使用永久代來實現方法區而已,這樣HotSpot的垃圾收集器可以像管理Java堆一樣管理這部分內存,能夠省去專門為方法區編寫內存管理代碼的工作。對于其他虛擬機(如BEA JRockit、IBM J9等)來說是不存在永久代的概念的。原則上,如何實現方法區屬于虛擬機實現細節,不受虛擬機規范約束,不同的JVM廠商,針對自己的JVM可能有不同的方法區實現方式。但使用永久代來實現方法區,現在看來并不是一個好主意,因為這樣更容易遇到內存溢出問題(永久代有-XX:MaxPermSize的上限,J9和JRockit只要沒有觸碰到進程可用內存的上限,例如32位系統中的4GB,就不會出現問題),而且有極少數方法(例如String.intern())會因這個原因導致不同虛擬機下有不同的表現。因此,對于HotSpot虛擬機,根據官方發布的路線圖信息,現在也有放棄永久代并逐步改為采用Native Memory來實現方法區的規劃了,在目前已經發布的JDK 1.7的HotSpot中,已經把原本放在永久代的字符串常量池移出。

也就是說永久代是JVM規范中方法區的一種實現方式

Java虛擬機規范對方法區的限制非常寬松,除了和Java堆一樣不需要連續的內存和可以選擇固定大小或者可擴展外,還可以選擇不實現垃圾收集。相對而言,垃圾收集行為在這個區域是比較少出現的,但并非數據進入了方法區就如永久代的名字一樣“永久”存在了。這區域的內存回收目標主要是針對常量池的回收和對類型的卸載,一般來說,這個區域的回收“成績”比較難以令人滿意,尤其是類型的卸載,條件相當苛刻,但是這部分區域的回收確實是必要的。在Sun公司的BUG列表中,曾出現過的若干個嚴重的BUG就是由于低版本的HotSpot虛擬機對此區域未完全回收而導致內存泄漏。

根據Java虛擬機規范的規定,當方法區無法滿足內存分配需求時,將拋出OutOfMemoryError異常。

堆大小=新生代+老年代。默認情況下,新生代(Young generation)占$frac{1}{3}$的堆空間大小,老年代(Old generation)占$frac{2}{3}$的堆空間大小。

新生代被細分為一個Eden(伊甸園)和兩個Survivor區域,這兩個Survivor區域分別被命名為fromto以示區分。默認情況下,它們的空間大小關系是Eden:from:to=8:1:1

JVM每次只會使用Eden和其中一塊Survivor區域來為對象服務,所以無論什么時候,總有一塊Survivor區域空閑著。因此,新生代實際上可以用的內存空間為90%的新生代空間。

下面要講的GC(garbage collection)就是針對進行內存回收。

GC的策略

分區的目的是為了方便對不同的區采取不同的回收策略。GC分為兩種:新生代中的Minor GC,老生代中的Major GC;兩個加在一起叫做Full GC,由于Major GC的前提是Minor GC,所以發生Major GC就一定代表著Full GC,。新生代是GC收集垃圾的頻繁區域。

數據會首先分配到Eden區中(當然也有特殊情況,如果是大對象那么會直接放到老年代(大對象是指需要大量連續內存的java對象)),當Eden沒有足夠的空間的時候就會觸發JVM發起一次Minor GC。如果對象經歷一次Minor GC還存活,并且又能被Survivor空間接受,那么將被移動到Survivor空間當中,并將其年齡設為1,對象在Survivor中每熬過一次Minor GC,年齡就加1,當年齡達到一定的程度(默認為15)時,就被晉升到老年代中了,當然晉升老年代的年齡是可以設置的。新生代是GC收集垃圾的頻繁區域。

新生代主要存放的是那些很快就會被GC回收掉的或者不是特別大的對象(要看你是否設置了-XX:PretenureSizeThreshold參數了)。-XX:PretenureSizeThreshold 的默認值和作用

-Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -Xss1M Xms是JVM初始堆的大小,Xmx是JVM最大堆大小,Xmn是新生代大小,PermSize是永久代的初始大小,MaxPermSize是永久代的最大大小,Xss是每個線程棧的大小。JVM系列三:JVM參數設置、分析

Xms64m or -Xms64M

Xmx1g or -Xmx1G

Can also use 2048MB to specify 2GB

Also, make sure you just use whole numbers when specifying your arguments. Using -Xmx512m is a valid option, but -Xmx0.5g will cause an error.

虛擬機初始化時已經設定了各部分的內存大小,分為三部分:

新生代:新創建的對象

老年代:經過多次垃圾回收沒有被回收的對象或者太大的對象

永久代:JVM自身使用的內存,包含類信息等

新生代策略

新生代采用復制算法。將新生代分為3個區:較大的Eden和兩個較小的Survivor。發生在新生代的GC為Minor GC,在Minor GC時會將新生代中還存活著的對象復制進一個Survivor中,然后對Eden和另一個Survivor進行清理。所以平常可用的新生代大小為Eden大小+一個Survivor大小。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72658.html

相關文章

  • [譯]GC專家系列2:Java 垃圾回收的監控

    摘要:原文鏈接這是專家系列文章的第二篇。運行在本地虛擬機上的應用的又稱為,通常與相同。性能數據需要持續觀察,因此在運行時需要定時輸出的監控信息。新生代容量的統計信息。是提供的一個式的圖表監控工具。 原文鏈接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 這是GC專家系列文章的第二...

    yiliang 評論0 收藏0
  • Java 開啟 gc 日志

    摘要:啟動使用或這兩個參數可以創建基本的日志,使用可以創建更加詳細的日志。我們可以設置日志的文件大小和數量上面設置只輸出個文件,每個文件,文件的基本名字是,使用啟動的時間和進程來分割日志。 構建一個 jar 包程序 使用 Spring Boot 構建一個簡單的 web 程序,可以直接使用 java -jar 來啟動。 @RestController @RequestMapping(/root...

    huashiou 評論0 收藏0
  • Java7的新特性

    摘要:語言特性系列的新特性的新特性的新特性的新特性的新特性的新特性的新特性的新特性的新特性序本文主要講的新特性,相對于而言,增加了一些重要的特性,比如,不像那么雞肋,也算是一個重要的版本。其他支持的下劃線支持參考 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12...

    April 評論0 收藏0
  • [譯]GC專家系列1:理解Java垃圾回收

    摘要:本文是成為專家系列的第一篇。然而,在多線程環境下,將會有別樣的狀況。在中正是通過解決了多線程問題。在最后的并發清理階段,垃圾回收過程被真正執行。在垃圾回收執行過程中,其他線程依然在執行。 原文鏈接:http://www.cubrid.org/blog/de... 了解Java的垃圾回收(GC)原理能給我們帶來什么好處?對于軟件工程師來說,滿足技術好奇心可算是一個,但重要的是理解GC能幫...

    diabloneo 評論0 收藏0
  • jvm性能優化

    摘要:前言入門垃圾回收機制后,接下來可以學習性能調優了。輸出老年代空間的性能數據。新生代最小空間容量,單位。擁有者表示線程成功競爭到對象鎖。線程狀態,未啟動的。,無限期等待另一個線程執行特定操作。主要調優參數設定堆內存大小,這是最基本的。 Java程序員進階三條必經之路:數據庫、虛擬機、異步通信。 前言 入門JVM垃圾回收機制后,接下來可以學習性能調優了。主要有兩部分內容: JDK工具的使...

    WelliJhon 評論0 收藏0
  • 《深入理解Java虛擬機》(六)堆內存使用分析,垃圾收集器 GC 日志解讀

    摘要:堆內存使用分析,垃圾收集器日志解讀重要的東東在中,對象實例都是在堆上創建。機制是由提供,用來清理需要清除的對象,回收堆內存。在中,是由一個被稱為垃圾回收器的守護線程執行的。 堆內存使用分析,垃圾收集器 GC 日志解讀 重要的東東 在Java中,對象實例都是在堆上創建。一些類信息,常量,靜態變量等存儲在方法區。堆和方法區都是線程共享的。 GC機制是由JVM提供,用來清理需要清除的對象,...

    CODING 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<