成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java GC

justCoding / 649人閱讀

摘要:對(duì)字節(jié)碼文件進(jìn)行解釋執(zhí)行,把字節(jié)碼翻譯成相關(guān)平臺(tái)上的機(jī)器指令。使用命令可對(duì)字節(jié)碼文件以及配置文件進(jìn)行打包可對(duì)一個(gè)由多個(gè)字節(jié)碼文件和配置文件等資源文件構(gòu)成的項(xiàng)目進(jìn)行打包。和不存在永久代這種說法。

Java技術(shù)體系

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

Java程序設(shè)計(jì)語言

各種硬件平臺(tái)上的Java虛擬機(jī)

Class文件格式

Java API類庫

來自商業(yè)機(jī)構(gòu)和開源社區(qū)的第三方Java類庫

我們可以把Java程序設(shè)計(jì)語言、Java虛擬機(jī)、Java API類庫這三部分統(tǒng)稱為JDK(Java Development Kit),JDK是用于支持Java程序開發(fā)的最小環(huán)境。

另外,可以把Java API類庫中的Java SE API子集[1]和Java虛擬機(jī)這兩部分統(tǒng)稱為JRE(Java Runtime Environment),JRE是支持Java程序運(yùn)行的標(biāo)準(zhǔn)環(huán)境。

以上是根據(jù)各個(gè)組成部分的功能來進(jìn)行劃分的,如果按照技術(shù)所服務(wù)的領(lǐng)域來劃分,或者說按照J(rèn)ava技術(shù)關(guān)注的重點(diǎn)業(yè)務(wù)領(lǐng)域來劃分,Java技術(shù)體系可以分為4個(gè)平臺(tái),分別為:

Java Card:支持一些Java小程序(Applets)運(yùn)行在小內(nèi)存設(shè)備(如智能卡)上的平臺(tái)。

Java ME(Micro Edition):支持Java程序運(yùn)行在移動(dòng)終端(手機(jī)、PDA)上的平臺(tái),對(duì)Java API有所精簡(jiǎn),并加入了針對(duì)移動(dòng)終端的支持,這個(gè)版本以前稱為J2ME。

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

Java EE(Enterprise Edition):支持使用多層架構(gòu)的企業(yè)應(yīng)用(如ERP、CRM應(yīng)用)的Java平臺(tái),除了提供Java SE API外,還對(duì)其做了大量的擴(kuò)充[3]并提供了相關(guān)的部署支持,這個(gè)版本以前稱為J2EE。

JVM

Java Virtual Machine,Java虛擬機(jī)。是java編譯后的.class文件(字節(jié)碼文件)與硬件系統(tǒng)之間的接口,也就是說用來運(yùn)行.class文件。JVM實(shí)現(xiàn)了Java最重要的特性:平臺(tái)無關(guān)性

編譯后的 Java 程序指令并不直接在硬件系統(tǒng)的 CPU 上執(zhí)行,而是由 JVM 執(zhí)行,JVM屏蔽了與具體平臺(tái)相關(guān)的信息。JVM對(duì)字節(jié)碼文件進(jìn)行解釋執(zhí)行,把字節(jié)碼翻譯成相關(guān)平臺(tái)上的機(jī)器指令。

javac 是收錄于 JDK 中的 Java 語言編譯器。我們使用javac命令編譯Java源文件,得到.class文件。然后使用java命令執(zhí)行.class文件(也就是使用JVM運(yùn)行.class文件)。使用jar命令可對(duì)字節(jié)碼文件以及配置文件進(jìn)行打包(可對(duì)一個(gè)由多個(gè)字節(jié)碼文件和配置文件等資源文件構(gòu)成的項(xiàng)目進(jìn)行打包)。

所以不熟悉java的同學(xué)要注意了,JVM并不是用來編譯和執(zhí)行java的,JVM只負(fù)責(zé)執(zhí)行字節(jié)碼文件,編譯java文件由javac來完成

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

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

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

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

JVM的內(nèi)存可分為:線程棧、堆、靜態(tài)方法區(qū),native方法使用的是直接內(nèi)存,不包含在JVM中。Java NDK可以調(diào)用C/C++。

方法區(qū)

方法區(qū)是可供各線程共享的運(yùn)行時(shí)內(nèi)存區(qū)域

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

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

方法區(qū)和永久代的關(guān)系

方法區(qū)(method area)只是JVM規(guī)范中定義的一個(gè)概念,用于存儲(chǔ)類信息、常量池、靜態(tài)變量、JIT編譯后的代碼等數(shù)據(jù),具體放在哪里,不同的實(shí)現(xiàn)可以放在不同的地方。

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

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

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

也就是說永久代是JVM規(guī)范中方法區(qū)的一種實(shí)現(xiàn)方式

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

根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。

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

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

JVM每次只會(huì)使用Eden和其中一塊Survivor區(qū)域來為對(duì)象服務(wù),所以無論什么時(shí)候,總有一塊Survivor區(qū)域空閑著。因此,新生代實(shí)際上可以用的內(nèi)存空間為90%的新生代空間。

下面要講的GC(garbage collection)就是針對(duì)進(jìn)行內(nèi)存回收。

GC的策略

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

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

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

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

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.

虛擬機(jī)初始化時(shí)已經(jīng)設(shè)定了各部分的內(nèi)存大小,分為三部分:

新生代:新創(chuàng)建的對(duì)象

老年代:經(jīng)過多次垃圾回收沒有被回收的對(duì)象或者太大的對(duì)象

永久代:JVM自身使用的內(nèi)存,包含類信息等

新生代策略

新生代采用復(fù)制算法。將新生代分為3個(gè)區(qū):較大的Eden和兩個(gè)較小的Survivor。發(fā)生在新生代的GC為Minor GC,在Minor GC時(shí)會(huì)將新生代中還存活著的對(duì)象復(fù)制進(jìn)一個(gè)Survivor中,然后對(duì)Eden和另一個(gè)Survivor進(jìn)行清理。所以平??捎玫男律笮镋den大小+一個(gè)Survivor大小。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72658.html

相關(guān)文章

  • [譯]GC專家系列2:Java 垃圾回收的監(jiān)控

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

    yiliang 評(píng)論0 收藏0
  • Java 開啟 gc 日志

    摘要:?jiǎn)?dòng)使用或這兩個(gè)參數(shù)可以創(chuàng)建基本的日志,使用可以創(chuàng)建更加詳細(xì)的日志。我們可以設(shè)置日志的文件大小和數(shù)量上面設(shè)置只輸出個(gè)文件,每個(gè)文件,文件的基本名字是,使用啟動(dòng)的時(shí)間和進(jìn)程來分割日志。 構(gòu)建一個(gè) jar 包程序 使用 Spring Boot 構(gòu)建一個(gè)簡(jiǎn)單的 web 程序,可以直接使用 java -jar 來啟動(dòng)。 @RestController @RequestMapping(/root...

    huashiou 評(píng)論0 收藏0
  • Java7的新特性

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

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

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

    diabloneo 評(píng)論0 收藏0
  • jvm性能優(yōu)化

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

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

    摘要:堆內(nèi)存使用分析,垃圾收集器日志解讀重要的東東在中,對(duì)象實(shí)例都是在堆上創(chuàng)建。機(jī)制是由提供,用來清理需要清除的對(duì)象,回收堆內(nèi)存。在中,是由一個(gè)被稱為垃圾回收器的守護(hù)線程執(zhí)行的。 堆內(nèi)存使用分析,垃圾收集器 GC 日志解讀 重要的東東 在Java中,對(duì)象實(shí)例都是在堆上創(chuàng)建。一些類信息,常量,靜態(tài)變量等存儲(chǔ)在方法區(qū)。堆和方法區(qū)都是線程共享的。 GC機(jī)制是由JVM提供,用來清理需要清除的對(duì)象,...

    CODING 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<