1、cms gc過程中哪幾個階段暫停應用程序
問題解決:中間調整過幾次,先搞了幾台機器做了驗證,後來逐步推廣的。
1、調大heap區,由原來的4g,調整到5g,young區的大小不變,還是2g,這時候old區就由2g變為3g了(這樣保證old區有足夠的空間);
2、設置-XX:UseCMSInitiatingOccupancyOnly,其實這個不關這個問題,只是發現半夜CMS進行的有點頻繁,就禁止掉了悲觀策略;
3、設置CMS區回收的比例,從80%調整到75%,讓old區盡早的進行,有足夠的空間剩餘;
為什麼要有GC(垃圾回收)?
JVM通過GC來回收堆和方法區中的內存,GC的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。
2、cms垃圾回收演算法在gc過程中哪幾個階段會暫停應用縣城
中間調整過幾次,先搞了幾台機器做了驗證,後來逐步推廣的。
1、調大heap區,由原來的4g,調整到5g,young區的大小不變,還是2g,這時候old區就由2g變為3g了(這樣保證old區有足夠的空間);
2、設置-XX:UseCMSInitiatingOccupancyOnly,其實這個不關這個問題,只是發現半夜CMS進行的有點頻繁,就禁止掉了悲觀策略;
3、設置CMS區回收的比例,從80%調整到75%,讓old區盡早的進行,有足夠的空間剩餘;
為什麼要有GC(垃圾回收)?
JVM通過GC來回收堆和方法區中的內存,GC的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。
主要的收集器有哪些?
引用計數器和跟蹤計數器兩種。
引用計數器記錄對象是否被引用,當計數器為零時,說明對象已經不再被使用,可以進行回收。java中的對象有復雜的引用關系,不是很適合引用計數器,所以sun jdk中並沒有實現這種GC方式。
跟蹤收集器,全局記錄數據的引用狀態,基於一定的條件觸發。執行的時候,從根集合開始掃描對象的引用關系,主要有復制(copying)、標記-清除(Mark-Sweep)、標記-壓縮(Mark-Compact)那種演算法。
3、JDK1.8版本對於CMS演算法有哪些改進
JDK7.0和JDK6.0有什麼區別?
jdk7是模塊化程序,模塊間的依賴性變小了.jdk的好多功能間有相互依賴性,導致一個配置不對,好多不能用.舉例來說:假設你正使用Logging API(java.util.logging)),Logging需要NIO和JMX,JMX需要JavaBeans, JNDI, RMI和CORBA,JNDI需要java.applet.Applet而且JavaBeans依賴AWT.
JDK7 新特性:
JSR203:JDK中會更多的IO API(「NIO.2」)訪問文件系統與之前的JDK中通過java.io.File訪問文件的方式不同,JDK7將通過java.nio.file包中的類完成。JDK7會使用java.nio.file.Path類來操作任何文件系統中的文件。(這里說的任何文件系統指的是可以使用任何文件存儲方式的文件系統)
示例:
Java7之前
File file = new File(「some_file」);
使用Java7
Path path = Paths.get(「some_file」);
在File類中加入了新的方法toPath(),可以方便的轉換File到Path
Path path = new File(「some_file」).toPath();
Socket通道綁定和配置在JDK7中面向通道的網路編程也得以更新!JDK7中可以直接綁定通道的socket和直接操作socket屬性。JDK7提供了平台socket屬性和指定實現的socket屬性。
JDK7加入了一個新的位元組通道類,SeekableByteChannel
NetworkChannel是面向網路通道編程模塊中的又一個新的超介面。利用它可以方便的綁定通道socket,並且方便設置和獲取socket的屬性。
MulticastChannel介面方便創建IP協議多播。多播實現直接綁定到本地的多播設備。
靈活的非同步I/O可以通過真正的非同步I/O,在不同的線程中運行數以萬計的流操作!JKD7提供了對文件和socket的非同步操作。一些JDK7中的新通道:
AsynchronousFileChannel:非同步文件通道可以完成對文件的非同步讀寫操作。
AsynchronouseSocketChannel:Socket中的一個簡單非同步通道,方法是非同步的並且支持超時。
:非同步的ServerSocket
AsynchronousDatagramChannel:基於數據包的非同步socket
JSR292:Java平台中的動態編程語言Da Vinci Machine項目(JSR292)的主旨是擴展JVM支持除Java以外的其它編程語言,尤其是對動態編程語言的支持。所支持的語言必須和Java一樣不收到歧視並共同存在。JSR334:Java語言的一些改進OpenJDK項目的創造(JSR334)的主旨是對Java語言進行一些小的改進來提高每天的Java開發人員的工作。這些改進包括:
Switch語句允許使用String類型
支持二進制常量和數字常量中可以使用下劃線
使用一個catch語言來處理多種異常類型
對通用類型實例的創建提供類型推理
Try-with-resources語句來自動關閉資源
JSR119:Java編譯器APIJSR199是在JDK6中加入的,主要用來提供調用Java編譯器的API。除了提供javac的命令行工具,JSR199提供Java編譯器到程序交互的能力。Java編譯器API要達到三個目標:
對編譯器和其它工具的調用
對結構化的編譯信息進行訪問
對文件輸入輸出定製化處理的能力
JSR206:Java XML處理的API (JAXP)JSR206即Java API for XML Processing(JAXP),是Java處理XML文檔的一個與實現無關,靈活的API。
JAXP1.3的主要特性包括:
DOM3
內建通過XML Schema進行文檔校驗的處理器
對XML Schema中的數據類型的實現,在javax.xml.datatype包中。
XSLTC,最快的轉換器,也是XSLT處理中的默認引擎。
提供對XInclude的實現。這將會方便我們使用文本和其它已有的XML來創建新的文檔,這樣可以對文檔片段進行重用。
JDK7中會包含JAXP1.3,這個是JAXP的最新實現。
綁定技術(JAXB)JSR222即Java Architecture for XML Binding(JAXB)。JAXB的目的是便於Java程序進行Java類到XML文檔的映射。
JAXB2的主要特性:
支持全部的W3C XML Schema特性。(JAXB1.0說明了對於W3C XML Schema中某些特性的不支持)
支持綁定Java到XML文檔,通過添加javax.xml.bind.annotation包來控制綁定。
大量減少了對於schema衍生出來的類。
通過JAXP1.3的校驗API來提供額外的校驗能力。
JDK7中將包括JAXB2.2
JSR224:基於XML的Web服務API(JAX-WS)JSR224即Java API for XML-based Web Services(JAX-WS),是一個基於Annotation標注的編程模型,主要針對Web Service應用和客戶端開發。
JAX-WS2的主要特性包括:
對JAXB2.1 API的支持(JSR222)
對Web Services Addressing 1.0的支持
EndpointReference(EPR)的API:創建(BindingProvider.getEndpointReference(),Endpoint.getEndpointReference(),MessageContext.getEndpointReference())
事務處理(使用JAXB2.1綁定W3C EPR到W3CEndpointReference類,使用JAXB Marshall/Unmarshall W3CendpointReference類)
提供友好的API來啟用和停止某些特性,例如MTOM特性和Addressing特性
JDK7將包含JAX-WS2.2
可插拔的Annotation處理APIJSR269即Pluggable Annotation-Processing API
從JDK5開始,Annotation標注就成了強大的機制用來標注我們的類、屬性和方法。通常Annotation標注是在創建階段或者運行階段進行處理的,並獲取語義結果。JSR269主要用來定義一套API,允許通過可插拔的API來進行標注處理器的創建。
規范包括一部分的API用來對Java編程語言進行構建,還有就對標注處理器聲明和控制運行的部分。
有了程序中的Annotation標注,就需要有標注處理器框架來反射程序的結構。
Annotation處理器會指定他們處理的標注並且更多的處理器可以合作運行。
標注處理器和程序結構的API可以在構建階段訪問。
小的改進java.util.Objects提供了一套9個靜態方法。其中兩個方法用來檢測當前對象是null還是非null。兩個方法用來提供生成toString()字元串同時支持null對象。兩個用來處理hash的方法。兩個方法用來處理equals。最後一個compare方法用來進行比較。Swing JLayer組件JXLayer是一個組件裝飾器,提供了用來裝飾多個組合組件的方式,並且可以捕獲所有滑鼠、鍵盤和FocusEvent的事件,並針對所有的XLayer子組件。這個組件只會對public swing的api起作用,對全局設置沒有作用,例如對EventQueue或者RepaintManager。(除了這些,Swing還將在JDK7中提供JXDatePicker和CSS方式樣式)並發和集合APIJSR166,並發和集合API提供了靈活的非同步處理,並發HashMap,傳輸隊列和輕量級的fork/join框架以及本地線程方式的偽隨機數生成器。類載入器體系結構類載入器已經升級到了可以在無等級類載入器拓撲中避免死鎖。JDK7中包含了一個對於多線程自定義類載入器的增強實現,名字為具有並行能力的類載入器。使用平行能力的類載入器載入class,會同步到類載入器和類名。Locale類的改進Java Locale避免由於小的變化導致數據丟失。除此,Locale應該提供更多的特性,例如IETF BCP 47和UTR 35(CLDR/LDML)。分離用戶Locale和用戶介面LocaleJDK7分離了UI語言的locale和格式化locale,這個已經在Vista之後的windows系統中實現了。嚴格的類文件檢測通過JavaSE6的規范,version51(SE7)的類文件和之後的版本必須通過類型檢測來檢驗。對於老的推理驗證VM不可以宕掉Elliptic-Curve
Cryptography (ECC)橢圓曲線加密
從JDK7開始,Java提供對標準的ECC演算法的靈活實現(基於橢圓曲線的公鑰加密演算法)Swing中的Nimbus外觀Nimbus是JDS(Java Desktop System)中的新外觀。這個也是Solaris11的GTK主題Java2D中的XRender PipelineJDK7中加入了基於X11 XRender擴展的Java2D圖形管道。這將提供更多的對於當前先進的GPUs訪問的功能。TLS1.2TLS (Transport Layer Security)是一個用在Internet上的數據傳輸安全協議,用來避免監聽、引誘和消息偽造。TLS的主要目的是提供兩個應用間通信的隱私和數據完整。TLS是RFC5246標准,在JDK7中提供1.2JDBC4.0/4.1JDBC4.1特性只在JDK7或者更高版本中存在。JDBC4.1隻是對JDBC4.0進行較小的改動。關於一些JDBC4.0/4.1的特性:
數據源—Derby包括了對於javax.sql.DataSource的新的實現
JDBC驅動自動載入—應用不必在通過Class.forName()方法來載入資料庫驅動了。取而代之的是DriverManager會根據應用請求連接的情況,自動查找到合適的JDBC驅動。
包裝—這是JDBC4.0中的新的概念,主要是通過這種機制可以讓應用獲取的廠商提供的標准JDBC對象實現,例如Connections,Statements和ResultSets。
Statement事件—連接池可以監聽Statement的關閉和錯誤時間。addStatementEventListener和removeStatementEventListener被加入到了javax.sql.PooledConnection
JDK7提供了JDBC4.1全部的支持
透明窗體和異形窗體為了6u10版本的圖形處理,JDK提供了透明效果的支持(簡單透明和像素透明)並且提供了對於異形窗體的支持(可以將窗體設置成任意形狀),輕重混合並且增強了AWT安全警告。透明效果和異形窗體是通過com.sun.awt.AWTUtilities類實現的。Unicode6.0Unicode6.0提供了諸如2.088字元集、對已經存在字元集的屬性改進、格式化改進以及新的屬性和數據文件。
JDK7已經更新到對Unicode6.0的支持。
要來關閉URLClassLoader的方法
對JMX代理和MBeans的改進
通過URLClassLoader,應用可以通過URL搜索路徑來載入類和資源。JKD7提供了close()新方法來幫助URLClassLoader清理資源。
這個改進來至於JRockit,可以方便連接平台。MBean伺服器可以通過防火牆提供一套MBeans,這些暴露了VM中的一些內部操作的信息
新的垃圾回收器JDK7提供了新的垃圾回收器,針對目前的CMS垃圾回收器,這將會讓垃圾回收器有更少的停頓時間和更高的語言效果。改進的JSRJSR901:Java Language Specification(JLS)Java語言計劃
JSR901包括了從第一版Java規范到現在為止的所有的變化、說明和補充。Java語言通過JLS規范。
對於JLS的改變通過JSR901進行管理
JDK7將會包括最新的JSR901
JSR924:JVM平台規范
JSR924目的是維護Java虛擬機規范的變化,其中第二版是為了J2SE1.5的。
Java SE API
JavaSE APIs保持著對例行維護和小范圍改進的加入計劃的記錄
延期到JDK8或者之後的規范
JSR294:Java語言和虛擬機對模塊編程技術的支持—當前JSR主要的目的是提供在編譯期和運行期的模塊編程支持
JSR308:對於Java類型的Annotation注釋—這將是對於當前注釋符號系統的擴展,將允許我們在類型中出現注釋符號。
JSR296:Swing應用框架—主旨是消除Swing編程中的模板代碼並且提供Swing程序更加簡單的結構。
模塊化—提供一個明確的、簡單的、低級別的模塊系統,主要目的是將JDK模塊化。
JSR TBD:Lambda項目—Lambda表達式(通俗的也稱為「閉包「)和對Java編程語言的保護方法
JSR TBD:對於集合支持的語言—常量表達式對於lists、sets和maps的迭代以及通過索引符號對lists和maps的訪問。
Swing JDatePicker組件—添加SwingLabs JXDatePicker組件到平台。
4、如何指定定java cms垃圾回收
如果你的JAVA應用程序有以下幾個特點,那麼可以使用Concurrent Mark Sweep (CMS) 垃圾收集器。
希望JAVA垃圾回收器回收垃圾的時間盡可能短;
應用運行在多CPU的機器上,有足夠的CPU資源;
有比較多生命周期長的對象;
希望應用的響應時間短。
5、cms垃圾回收演算法在gc過程中的哪個階段會暫停應用線程
GC在java中是垃圾回收機制,當你創建一個對象時,它就開始跟蹤,當對象「可到達」時,就自動回收,也可以手動調用,但一般不推薦使用
6、JVM的垃圾演算法有哪幾種
一、垃圾收集器概述
如上圖所示,垃圾回收演算法一共有7個,3個屬於年輕代、三個屬於年老代,G1屬於橫跨年輕代和年老代的演算法。
JVM會從年輕代和年老代各選出一個演算法進行組合,連線表示哪些演算法可以組合使用
二、各個垃圾收集器說明
1、Serial(年輕代)
年輕代收集器,可以和Serial Old、CMS組合使用
採用復制演算法
使用單線程進行垃圾回收,回收時會導致Stop The World,用戶進程停止
client模式年輕代默認演算法
GC日誌關鍵字:DefNew(Default New Generation)
圖示(Serial+Serial Old)
2、ParNew(年輕代)
新生代收集器,可以和Serial Old、CMS組合使用
採用復制演算法
使用多線程進行垃圾回收,回收時會導致Stop The World,其它策略和Serial一樣
server模式年輕代默認演算法
使用-XX:ParallelGCthreads參數來限制垃圾回收的線程數
GC日誌關鍵字:ParNew(Parallel New Generation)
圖示(ParNew + Serail Old)

3、Paralle Scavenge(年輕代)
新生代收集器,可以和Serial Old、Parallel組合使用,不能和CMS組合使用
採用復制演算法
使用多線程進行垃圾回收,回收時會導致Stop The World
關注系統吞吐量
-XX:MaxGCPauseMillis:設置大於0的毫秒數,收集器盡可能在該時間內完成垃圾回收
-XX:GCTimeRatio:大於0小於100的整數,即垃圾回收時間占總時間的比率,設置越小則希望垃圾回收所佔時間越小,CPU能花更多的時間進行系統操作,提高吞吐量
-XX:UseAdaptiveSizePolicy:參數開關,啟動後系統動態自適應調節各參數,如-Xmn、-XX:SurvivorRatio等參數,這是和ParNew收集器重要的區別
GC日誌關鍵字:PSYoungGen
4、Serial Old(年老代)
年老代收集器,可以和所有的年輕代收集器組合使用(Serial收集器的年老代版本)
採用 」標記-整理「演算法,會對垃圾回收導致的內存碎片進行整理
使用單線程進行垃圾回收,回收時會導致Stop The World,用戶進程停止
GC日誌關鍵字:Tenured
圖示(Serial+Serial Old)
5、Parallel Old(年老代)
年老代收集器,只能和Parallel Scavenge組合使用(Parallel Scavenge收集器的年老代版本)
採用 」標記-整理「演算法,會對垃圾回收導致的內存碎片進行整理
關注吞吐量的系統可以將Parallel Scavenge+Parallel Old組合使用
GC日誌關鍵字:ParOldGen
圖示(Parallel Scavenge+Parallel Old)
6、CMS(Concurrent Mark Sweep年老代)
年老代收集器,可以和Serial、ParNew組合使用
採用 」標記-清除「演算法,可以通過設置參數在垃圾回收時進行內存碎片的整理
1、:默認開啟,FullGC時進行內存碎片整理,整理時用戶進程需停止,即發生Stop The World
2、CMSFullGCsBeforeCompaction:設置執行多少次不壓縮的Full GC後,執行一個帶壓縮的(默認為0,表示每次進入Full GC時都進行碎片整理)
CMS是並發演算法,表示垃圾回收和用戶進行同時進行,但是不是所有階段都同時進行,在初始標記、重新標記階段還是需要Stop the World。CMS垃圾回收分這四個階段
1、初始標記(CMS Initial mark) Stop the World 僅僅標記一下GC Roots能直接關聯到的對象,速度快
2、並發標記(CMS concurrent mark) 進行GC Roots Tracing,時間長,不發生用戶進程停頓
3、重新標記(CMS remark) Stop the World 修正並發標記期間因用戶程序繼續運行導致標記變動的那一部分對象的標記記錄,停頓時間較長,但遠比並發標記時間短
4、並發清除(CMS concurrent sweep) 清除的同時用戶進程會導致新的垃圾,時間長,不發生用戶進程停頓
適合於對響應時間要求高的系統
GC日誌關鍵字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等
缺點
1、對CPU資源非常敏感
2、CMS收集器無法處理浮動垃圾,即清除時用戶進程同時產生的垃圾,只能等到下次GC時回收
3、因為是使用「標記-清除」演算法,所以會產生大量碎片
圖示

7、G1
G1收集器由於沒有使用過,所以從網上找了一些教程供大家了解
並行與並發
分代收集
空間整合
可預測的停頓