Java進(jìn)階1-JVM虛擬機(jī) JVM在字節(jié)碼上的使用方法
1. JVM簡(jiǎn)述
(資料圖片)
JVM是Java Virtual Machine的縮寫(xiě)。它是一種基于計(jì)算設(shè)備的規(guī)范,是一臺(tái)虛擬機(jī),即虛構(gòu)的計(jì)算機(jī)。 JVM屏蔽了具體操作系統(tǒng)平臺(tái)的信息(顯然,就像是我們?cè)陔娔X上開(kāi)了個(gè)虛擬機(jī)一樣),當(dāng)然,JVM執(zhí)行字節(jié)碼時(shí)實(shí)際上還是要解釋成具體操作平臺(tái)的機(jī)器指令的。 如類加載機(jī)制、運(yùn)行時(shí)數(shù)據(jù)區(qū)、垃圾回收機(jī)制等; 官網(wǎng):https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
2. 字節(jié)碼
2.1 字節(jié)碼由來(lái)
Java 所有的指令有 200 個(gè)左右,一個(gè)字節(jié)( 8 位)可以存儲(chǔ) 256 種不同的指令信息,一個(gè)這樣的字節(jié)稱為字節(jié)碼( Bytecode )
JVM 將字節(jié)碼解釋執(zhí)行,屏蔽對(duì)底層操作系統(tǒng)的依賴,JVM也可以將字節(jié)碼編譯執(zhí)行,如果是熱點(diǎn)代碼,會(huì)通過(guò)JIT 動(dòng)態(tài)地編譯為機(jī)器碼,提高執(zhí)行效率
JVM在字節(jié)碼上也設(shè)計(jì)了一套操作碼助記符,使用特殊單詞來(lái)標(biāo)記這些數(shù)字。 加載或存儲(chǔ)指令 、運(yùn)算指令、類型轉(zhuǎn)換指令、對(duì)象創(chuàng)建與訪問(wèn)指令、操作棧管理指令、方法調(diào)用與返回指令。
2.2 源碼轉(zhuǎn)化成字節(jié)碼
詞法解析是通過(guò)空格分隔出單詞 、操作符、控制符等信息 , 將其形成 token 信息流 ,傳遞給語(yǔ)法解析器。 在語(yǔ)法解析時(shí),把詞法解析得到的 token 信息流按照 Java 語(yǔ)法規(guī)則組裝成一棵語(yǔ)法樹(shù) , 如圖 4-2 虛線框所示。 在語(yǔ)義分析階段 , 需要檢查關(guān)鍵字的使用是否合理、類型是否匹配、作用域是否正確等。 當(dāng)語(yǔ)義分析完成之后,即可生成字節(jié)碼。
2.2 執(zhí)行三種模式
字節(jié)碼必須通過(guò)類加載過(guò)程加載到 JVM 環(huán)境后,才可以執(zhí)行。執(zhí)行有三種模式:第一,解釋執(zhí)行;第二,JIT 編譯執(zhí)行;第三, JIT 編譯與解釋混合執(zhí)行(主流 JVM默認(rèn)執(zhí)行模式)。混合執(zhí)行模式的優(yōu)勢(shì)在于解釋器在啟動(dòng)時(shí)先解釋執(zhí)行,省去編譯時(shí)間。隨著時(shí)間推進(jìn) , JVM 通過(guò)熱點(diǎn)代碼統(tǒng)計(jì)分析 , 識(shí)別高頻的方法調(diào)用、循環(huán)體、公共模塊等,基于強(qiáng)大的 JlT 動(dòng)態(tài)編譯技術(shù),將熱點(diǎn)代碼轉(zhuǎn)換成機(jī)器碼,直接交給 CPU執(zhí)行。 JIT 的作用是將 Java 字節(jié)碼動(dòng)態(tài)地編譯成可以直接發(fā)送給處理器指令執(zhí)行的機(jī)器碼。簡(jiǎn)要流程如圖 4-3 所示。 注意解釋執(zhí)行與編譯執(zhí)行在線上環(huán)境微妙的辯證關(guān)系。機(jī)器在熱機(jī)狀態(tài)可以承受的負(fù)載要大于冷機(jī)狀態(tài)(剛啟動(dòng)時(shí) ),如果以熱機(jī)狀態(tài)時(shí)的流量進(jìn)行切流 , 可能使處于冷機(jī)狀態(tài)的服務(wù)器因無(wú)法承載流量而假死。 剛啟動(dòng)的 JVM 均是解釋執(zhí)行,還沒(méi)有進(jìn)行熱點(diǎn)代碼統(tǒng)計(jì)和 JIT 動(dòng)態(tài)編譯。
3. 類加載過(guò)程
3.1 類加載流程
1、Load加載(讀取二進(jìn)制流轉(zhuǎn)特定數(shù)據(jù)結(jié)構(gòu)) 2、Link鏈接( 驗(yàn)證-詳細(xì)校驗(yàn)如類型、常量、靜態(tài)變量等。 準(zhǔn)備-為靜態(tài)變量分配內(nèi)存。 解析-確保類與類之間的相互引用正確性,完成內(nèi)存結(jié)構(gòu)布局) 3、Init初始化(執(zhí)行類構(gòu)造器完成類的初始化) 4、解析執(zhí)行直接給CPU、JIT動(dòng)態(tài)編譯機(jī)器碼再給CPU 類加載是一個(gè)將 . class 字節(jié)碼文件實(shí)例化成 Class 對(duì)象并進(jìn)行相關(guān)初始化的過(guò)程。 全小寫(xiě)的 class 是關(guān)鍵字,用來(lái)定義類,而首字母大寫(xiě)的 Class ,它是所有 class 的類。** 問(wèn)題:**為什么這個(gè)抽象還是另外一個(gè)類 Class 的對(duì)象? 示例代碼如下:
/** * @author cmy * @version 1.0 * @date 2022/6/29 0029 13:43 * @description 類加載過(guò)程測(cè)試 */public class ClassTest {//數(shù)組類型有一個(gè)魔法屬性:length來(lái)獲取數(shù)組長(zhǎng)度 private static int[] array=new int[3]; private static int length=array.length; //任何小寫(xiě)class定義的類,也有一個(gè)魔法屬性:class,來(lái)獲取此類的大寫(xiě)Class類對(duì)象 private static Classone=One.class; private static Classanother=Another.class; public static void main(String[] args) throws Exception {//通過(guò)newInstance方法創(chuàng)建One和 Another的類對(duì)象(第1處) One oneObject=one.newInstance(); oneObject.call(); Another anotherObject=another.newInstance(); anotherObject.speak(); //通過(guò)one這個(gè)大寫(xiě)的Class對(duì)象,反射方式獲取私有成員屬性對(duì)象Field(第2處) Field privateFieldInOne = one.getDeclaredField("inner"); //設(shè)置私有對(duì)象可以訪問(wèn)和修改(第3處) privateFieldInOne.setAccessible(true); privateFieldInOne.set(oneObject,"world changed"); //成功修改類的私有屬性inner變量值為world changed. System.out.println(oneObject.getInner()); }}class One{private String inner="time files."; public void call(){System.out.println("hello world"); } public String getInner(){return inner; }}class Another{public void speak(){System.out.println("easy coding"); }}
第1處說(shuō)明new 是強(qiáng)類型校驗(yàn) , 可以調(diào)用任何構(gòu)造方法 , 在使用new 操作的時(shí)候,這個(gè)類可以沒(méi)有被加載過(guò)。 Class 類下的 newInstance是弱類型,只能調(diào)用無(wú)參數(shù)構(gòu)造方法,如果沒(méi)有默認(rèn)構(gòu)造方法,就拋出InstantiationException 異常,如果此構(gòu)造方法沒(méi)有權(quán)限訪問(wèn),則拋出IllegalAccessException 異常。 第2處說(shuō)明使用類似的方式獲取其他聲明 , 如注解、方法等,如圖4.5所示。 第3處說(shuō)明問(wèn)題:private 成員在類外是否可以修改?通過(guò) setAccessible(true) 操作,即可使用大寫(xiě) C lass 類的 set 方法修改其值。
3.2 類加載器實(shí)現(xiàn)機(jī)制
/** * 查看本地類加載器的方式如下 */ //正在使用得類加載器sun.misc.Launcher$AppClassLoader@18b4aac2 ClassLoader c = One.class.getClassLoader(); //AppClassLoader的父類加載器是ExtensionClassLoader JDK1.9之前 ClassLoader c1 = c.getParent(); //ExtClassLoader父類加載器(最高一層)Bootstrap C++實(shí)現(xiàn) 返回null ClassLoader c2 = c1.getParent(); System.out.println(c); System.out.println(c1); System.out.println(c2);
低層次的當(dāng)前類加載器,不能覆蓋更高層次類加載器已經(jīng)加載的類。 如圖 4-6 所示,左側(cè)綠色箭頭向上逐級(jí)詢問(wèn)是否已加載此類,直至 Bootstrap ClassLoader ,然后向下逐級(jí)嘗試是否能夠加載此類,如果都加載不了,則通知發(fā)起加載請(qǐng)求的當(dāng)前類加載器 ,準(zhǔn)予加載。 通過(guò)如下代碼可以查看 Bootstrap 所有已經(jīng)加載的類庫(kù):
/** * 通過(guò)如下代碼可以查看BootstrapClassLoader所有已經(jīng)加載的類庫(kù): */ URL[] urLs = Launcher.getBootstrapClassPath().getURLs(); for (java.net.URL url:urLs) {System.out.println(url.toExternalForm()); }
在JVM中增加如下啟動(dòng)參數(shù) , 則能通過(guò) Class.forName 正常讀取到指定類 , 說(shuō)明此參數(shù)可以增加Bootstrap 的類加載路徑:
- Xbootclasspath/a:/Users/yangguanbao/book/easyCoding/byJdk11/src
如果想在啟動(dòng)時(shí)觀察加載了哪個(gè)jar包中的哪個(gè)類 ,可以增加-XX:+TraceClassLoading參數(shù)
- XX:+TraceClassLoading
3.3 自定義類加載器
學(xué)習(xí)類加載器的實(shí)現(xiàn)機(jī)制后 , 雙親委派模型并非強(qiáng)制模型, 用戶可以自定義類加載器 。問(wèn)題:在什么情況下需要自定義類加載器呢? ** ** 隔離加載類、修改類加載方式、擴(kuò)展加載源、防止源碼泄露。
實(shí)現(xiàn)自定義類加載器的步驟,繼承ClassLoader,重寫(xiě) findClass()方法,調(diào)用defineClass()方法。一個(gè)簡(jiǎn)單的類加載器實(shí)現(xiàn)的示例代碼如下:
/** * @author cmy * @version 1.0 * @date 2022/6/29 0029 15:34 * @description 自定義類加載器 * * 自定義類加載器步驟: * 繼承ClassLoader * 重寫(xiě)findClass()方法 * 調(diào)用defineClass()方法 */public class CustomClassLoader extends ClassLoader {private String classpath; public CustomClassLoader(String classpath) {this.classpath = classpath; } @Override protected Class findClass(String name) throws ClassNotFoundException {try {byte[] bytes = getClassFromCustomPath(name); return defineClass(name, bytes, 0, bytes.length); } catch (IOException e) {e.printStackTrace(); throw new ClassNotFoundException(); } } private byte[] getClassFromCustomPath(String name) throws IOException {//從自定義路徑中加載指定類 FileInputStream fis = new FileInputStream(classpath + File.separator + name.replace(".", File.separator).concat(".class")); byte[] bytes = new byte[fis.available()]; fis.read(bytes); fis.close(); return bytes; } public static void main(String[] args) {CustomClassLoader customClassLoader = new CustomClassLoader("F:\\IDEA2022\\workmenu\\SoftwareTools\\src\\main\\java"); try {Class clazz = customClassLoader.loadClass("Test"); //調(diào)用的靜態(tài)方法 clazz.getDeclaredMethod("say").invoke(clazz); Object o = clazz.newInstance(); Method print = clazz.getDeclaredMethod("print", String.class); print.invoke(o, "調(diào)用的對(duì)象方法"); //自定義類加載器 System.out.println(clazz.getClassLoader()); //AppClassLoader System.out.println(clazz.getClassLoader().getParent()); //ExtClassLoader System.out.println(clazz.getClassLoader().getParent().getParent()); //BootstrapLoader System.out.println(clazz.getClassLoader().getParent().getParent().getParent()); }catch (Exception e){e.printStackTrace(); } }}//https://blog.csdn.net/weixin_42759726/article/details/114030153
//javac編譯后,記得刪除Test.java比較路徑尋找和Test.class沖突public class Test {public static void say() {System.out.println("this is a static method!"); } public void print(String s) {System.out.println("printing:"+s); }}
按某種規(guī)則 jar 包的版本被統(tǒng)←指定 ,導(dǎo)致某些類存在包路徑、類名相同 的情況 , 就會(huì)引起類沖突 ,導(dǎo)致應(yīng)用程序出現(xiàn)異常。主流的容器類框架都會(huì)自定義類加載器,實(shí)現(xiàn)不同中間件之間的類隔離 , 有效避免了類沖突。
4. 內(nèi)存布局(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)
前面回顧連接
在類加載過(guò)程第二步Link鏈接的解析階段,解析類和方法確保類與類之間的相互引用正確性,完成內(nèi)存 結(jié)構(gòu)布局。
4.1 內(nèi)存布局簡(jiǎn)介
Java 程序在運(yùn)行時(shí),會(huì)為 JVM 單獨(dú)劃出一塊內(nèi)存區(qū)域,而這塊內(nèi)存區(qū)域又可以再次劃分出一塊運(yùn)行時(shí)數(shù)據(jù)區(qū),運(yùn)行時(shí)數(shù)據(jù)區(qū)域大致可以分為五個(gè)部分:
4.2 Heap堆區(qū)
**Heap堆區(qū)作用:**Heap 是 OOM 故障最主要的發(fā)源地 , 它存儲(chǔ)著幾乎所有的實(shí)例對(duì)象, 堆由垃圾收集器自動(dòng)回收 , 堆區(qū)由各子線程共享使用。 堆的內(nèi)存空間既可以固定大小 , 也可以在運(yùn)行時(shí)動(dòng)態(tài)地調(diào)整。
比如 -Xms256M -Xmxl024M ,其中 -X 表示它是 JVM 運(yùn)行參數(shù), ms 是 memory start 的簡(jiǎn) 稱, mx 是 memory max 的簡(jiǎn)稱,分別代表最小堆容量和最大堆容量。 一般最大和最小一樣。避免在GC后調(diào)整堆大小時(shí)帶來(lái)的額外壓力。
堆分成兩大塊:新生代和老年代。新生代= 1 個(gè) Eden 區(qū)+ 2 個(gè)Survivor 區(qū)。
當(dāng) Eden區(qū)裝填滿的時(shí)候 , 會(huì)觸發(fā) Young Garbage Collection , 即 YGC。垃圾回收的時(shí)候 , 在 Eden 區(qū)實(shí)現(xiàn)清除策略 , 沒(méi)有被引用的對(duì)象則直接回收。依然存活的對(duì)象會(huì)被移送到 Survivor 區(qū)。
**問(wèn)題:**Survivor 區(qū)分為 S0和 S1兩塊內(nèi)存空間 , 送到哪塊空間呢? 每次 YGC 的時(shí)候, 它們將存活的對(duì)象復(fù)制到未使用的那塊空間,然后將當(dāng)前正在使用的空間完全清除 , 交換兩塊空間的使用狀態(tài)。
**問(wèn)題:**如何防止對(duì)象沒(méi)有進(jìn)取心? 每個(gè)對(duì)象都有一個(gè)計(jì)數(shù)器,每次 YGC 都會(huì)加1。 -XX:MaxTenuringThreshold 參數(shù)能配置計(jì)數(shù)器的值到達(dá)某個(gè)閥值的時(shí)候 , 對(duì)象從新生代晉升至老年代。
對(duì)象分配與簡(jiǎn)要GC流程圖如圖4-9所示。 圖 的 中,如果 Survivor 區(qū)無(wú)法放下,或者超大對(duì)象的鬧值超過(guò)上限,則嘗試在老年代中進(jìn)行分配 ; 如果老年代也無(wú)法放下,則會(huì)觸發(fā) Full Garbage Collection , 即FGC。如果依然無(wú)法放下, 則拋出 OOM。堆內(nèi)存出現(xiàn) OOM 的概率是所有內(nèi)存耗盡異常中最高的。出錯(cuò)時(shí)的堆內(nèi)信息對(duì)解決問(wèn)題非常有幫助 , 所以給JVM設(shè)置運(yùn)行參數(shù) -XX:+HeapDumpOnOutOfMemoryError,讓JVM遇到OOM 異常時(shí)能輸出堆內(nèi)信息,特別是對(duì)相隔數(shù)月才出現(xiàn)的 OOM 異常尤為重要。
4.3 Metaspace (元空間)
元空間作用:存儲(chǔ)常量池、方法元信息、類元信息。字符串常量String存在堆內(nèi)存。
元空間發(fā)展:源碼解析和示例代碼基本采用 JDK11版本, JVM則為 Hotspot。在 JDK7 及之前的版本中,只有 Hotspot才有 Perm 區(qū),譯為永久代 , 它在啟動(dòng)時(shí)固定大小,很難進(jìn)行調(diào)優(yōu)。動(dòng)態(tài)加載類過(guò)多,容易產(chǎn)生 Perm 區(qū)的 OOM。為了解決Perm 區(qū)的 OOM, 需要設(shè)定運(yùn)行參數(shù) -XX:MaxPermSize= 1280m。
永久代在垃圾回收過(guò)程中還存在諸多問(wèn)題。 JDK8 使用元空間替換永久代。在 JDK8 及以上版本中,設(shè)定 MaxPermSize 參數(shù), JVM在啟動(dòng)時(shí)并不會(huì)報(bào)錯(cuò)。
區(qū)別于永久代 , 元空間在本地內(nèi)存中分配。在 JDK8 里, Perm 區(qū) 中的所有內(nèi)容 中字符串常量移至堆內(nèi)存,其他內(nèi)容包括類元信息、字段、靜態(tài)屬性、方法、常量等 都移動(dòng)至無(wú)空間內(nèi)。
圖 4-10 中顯示在常量池中的 String, 其實(shí)際對(duì)象是被保存在堆內(nèi)存中的。
4.4 JVM Stack (虛擬機(jī)棧)
**虛擬機(jī)棧作用:描述JAVA方法執(zhí)行的內(nèi)存區(qū)域。**方法調(diào)用到執(zhí)行完成~入棧到出棧的過(guò)程。棧頂?shù)膸Q為棧幀,正在執(zhí)行的方法稱為當(dāng)前方法,棧幀是方法運(yùn)行的基本結(jié)構(gòu)。StackOverflowError表示請(qǐng)求的棧溢出,內(nèi)存耗盡。 棧幀在整個(gè) JVM 體系中的地位頗高, 包括局部變量表、操作棧、動(dòng)態(tài)連接、方法返回地址等。
1 局部變量表2 操作棧
public int simpleMethod(){//將常量13壓入操作棧、保存到局部變量表的slot_1中 int x=13; //將常量14壓入操作棧、保存到局部變量表的slot_2中 int y=14; //將slot_1元素壓入操作棧,將slot_2元素壓入操作棧, //再取出來(lái)到CPU中加法,并壓回操作棧,把棧頂結(jié)果保存到局部變量表的slot_3中 int z= x+y; //返回棧頂元素值 return z;}
** 3 動(dòng)態(tài)鏈接** 每個(gè)枝幀中包含一個(gè)在常量池中對(duì)當(dāng)前方法的引用 , 目的是支持方法調(diào)用過(guò)程的動(dòng)態(tài)連接。 4 方法返回地址
4.5 Native Method Stacks (本地方法棧)
本地方法棧作用:虛擬機(jī)?!爸鲀?nèi) ”, 而本地方法?!爸魍狻?。本地方法棧為 Native 方法服務(wù)。本地方法可以通過(guò) JNI ( Java Native Int rface )來(lái)訪問(wèn)虛擬機(jī)運(yùn)行時(shí)的數(shù)據(jù)區(qū) ,甚至可以調(diào)用寄存器,具有和 JVM 相同的能力和權(quán)限。對(duì)于內(nèi)存 不足的情況 本地方法枝還是會(huì)拋出 native heap OutOfMemory。
4.6 Program Counter Register(程序計(jì)數(shù)寄存器)
程序計(jì)數(shù)寄存器作用:CPU 只有把數(shù)據(jù)裝載到寄存器才能夠運(yùn)行。保證在多線程并發(fā)執(zhí)行過(guò)程中,保證分毫無(wú)差。**問(wèn)題:**由于CPU時(shí)間片輪限制,眾多線程在并發(fā)執(zhí)行過(guò)程中,導(dǎo)致經(jīng)常中斷或恢復(fù),如何保證分毫無(wú)差呢? 每個(gè)線程在創(chuàng)建后,都會(huì)產(chǎn)生 自己的程序計(jì)數(shù)器和棧幀,程序計(jì)數(shù)器用來(lái)存放執(zhí)行指令的偏移量和行號(hào)指示器等, 線程執(zhí)行或恢復(fù)都要依賴程序計(jì)數(shù)器。程序計(jì)數(shù)器在各個(gè)線程之間互不影響,此區(qū)域 也不會(huì)發(fā)生內(nèi)存溢出異常。
4.7 運(yùn)行時(shí)數(shù)據(jù)區(qū)域總結(jié)
1 Heap堆區(qū)作用:Heap 是 OOM 故障最主要的發(fā)源地 ,它存儲(chǔ)著幾乎所有的實(shí)例對(duì)象。堆由垃圾收集器自動(dòng)回收 , 堆區(qū)由各子線程共享使用。 堆的內(nèi)存空間既可以固定大小 , 也可以在運(yùn)行時(shí)動(dòng)態(tài)地調(diào)整。 2 元空間作用:存儲(chǔ)常量池、方法元信息、類元信息。字符串常量String存在堆內(nèi)存。3 虛擬機(jī)棧作用:描述JAVA方法執(zhí)行的內(nèi)存區(qū)域。方法調(diào)用到執(zhí)行完成~入棧到出棧的過(guò)程。棧頂?shù)膸Q為棧幀,正在執(zhí)行的方法稱為當(dāng)前方法,棧幀是方法運(yùn)行的基本結(jié)構(gòu)。StackOverflowError表示請(qǐng)求的棧溢出,內(nèi)存耗盡。 4 本地方法棧作用:虛擬機(jī)?!爸鲀?nèi) ”, 而本地方法?!爸魍狻薄1镜胤椒?Native 方法服務(wù)。本地方法可以通過(guò) JNI ( Java Native Int rface )來(lái)訪問(wèn)虛擬機(jī)運(yùn)行時(shí)的數(shù)據(jù)區(qū) ,甚至可以調(diào)用寄存器。 5 程序計(jì)數(shù)寄存器作用:CPU 只有把數(shù)據(jù)裝載到寄存器才能夠運(yùn)行。保證在多線程并發(fā)執(zhí)行過(guò)程中,保證分毫無(wú)差。每個(gè)線程在創(chuàng)建后,都會(huì)產(chǎn)生 自己的程序計(jì)數(shù)器和棧幀,程序計(jì)數(shù)器用來(lái)存放執(zhí)行指令的偏移量和行號(hào)指示器等。
5. 對(duì)象實(shí)例化
Java 是面向?qū)ο蟮撵o態(tài)強(qiáng)類型語(yǔ)言,根據(jù)某個(gè)類聲明一個(gè)引用變量指向被創(chuàng)建的對(duì)象。 問(wèn)題:在實(shí)例化對(duì)象的過(guò)程中,JVM會(huì)發(fā)生什么化學(xué)反應(yīng)?
5.1 從字節(jié)碼的進(jìn)行分析
1、NEW類加載 2、DUP棧頂復(fù)制引用變量 3、INVOKESPECIAL初始化
5.2 從執(zhí)行步驟的角度分析
1、確認(rèn)類元信息是否存在 2、分配對(duì)象內(nèi)存 3、設(shè)定默認(rèn)值 4、設(shè)置對(duì)象頭 5、執(zhí)行init方法
6. 垃圾回收
垃圾回收( Garbage Collection, GC )。垃圾回收的主要目的是清除不再使用的對(duì)象,自動(dòng)釋放內(nèi)存。
6.1 對(duì)象是否存活的標(biāo)準(zhǔn)
問(wèn)題:GC 是如何判斷對(duì)象是否可以被回收的呢?為了判斷對(duì)象是否存活 , JVM 引人了GC Roots。某個(gè)失去任何引用的對(duì)象,或者兩個(gè)互相環(huán)島狀循環(huán)引用的對(duì)象等,可以直接回收。 問(wèn)題:什么對(duì)象可以作為 GC Roots 呢?比如類靜態(tài)屬性中引用的對(duì)象、常量引用的對(duì)象、虛擬機(jī)棧中尋引用的對(duì)象、本地方法棧中引用的對(duì)象等。
6.2 垃圾回收的相關(guān)算法
“標(biāo)記-清除算法”。
該算法從GC Roots出發(fā),依次標(biāo)記有引用關(guān)系的對(duì)象,將沒(méi)有被標(biāo)記的對(duì)象清除。此算法會(huì)帶來(lái)大量的空間碎片,要分配較大連續(xù)空間容易出現(xiàn)FGC。
“標(biāo)記-整理算法”。
該算法從GC Roots出現(xiàn)標(biāo)記存活對(duì)象,然后將存活對(duì)象整理導(dǎo)內(nèi)存空間的一端,形成已使用的連續(xù)空間,最后把已使用空間外的部分全部清理掉。
“Mark-Copy算法”(主流YGC算法新生代垃圾回收)。也稱標(biāo)記-復(fù)制
為了并行地標(biāo)記和整理,將空間分為兩塊,每次只激活一塊。垃圾回收時(shí)只需要把存活對(duì)象復(fù)制到另一塊未激活空間,將未激活空間標(biāo)記為已激活,將已激活空間標(biāo)記為未激活,然后清除原空間對(duì)象,如此反復(fù)置換清除。每次只使用堆區(qū)一塊Eden區(qū)和Survior區(qū),減少了內(nèi)存空間的浪費(fèi)。
6.2 垃圾回收器
垃圾回收器( Garbage Collector )是實(shí)現(xiàn)垃圾回收算法并應(yīng)用在 JVM 環(huán)境中的內(nèi)存管理模塊 。
Serial 回收器
Serial 回收器是一個(gè)主要應(yīng)用于 YGC 的垃圾回收器,采用串行單線程的方式完成 GC 任務(wù)。其中"Stop The World"簡(jiǎn)稱STW,即垃圾回收的某個(gè)階段會(huì)暫停整個(gè)應(yīng)用程序的執(zhí)行。標(biāo)記-復(fù)制算法YGC
CMS 回收器
CMS 回收器 (Concurrent Mark Sweep Collector) 是回收停頓時(shí)間比較短、目前比較常用的垃圾回收器,采用"標(biāo)記-清除算法"。 通過(guò)初始標(biāo)記(Initial Mark) 、并發(fā)標(biāo)記(Concurrent Mark )、重新標(biāo)記(Remark)、并發(fā)清除(Concurrent Sweep)四個(gè)步驟完成垃圾回收工作。
G1回收器
Hotspot 在 JDK7 中 推出了新一代 G1 ( Garbage-First Garbage Collector ) 垃圾回收 ,通過(guò)去-XX:+UseG1GC參數(shù)啟用。G1采用"Mark-Copy算法"。 GI 將 Java 堆空間分割成了若干相同大小的 區(qū)域,即 region ,包括 Eden 、Survivor 、 Old 、 Humongous 四種類型。
7. JVM監(jiān)控工具
7.1 jconsole
Jconsole(Java Monitoring and Management Console)是從 java5 開(kāi)始,在 JD K中自帶的 java 監(jiān)控和管理控制臺(tái),用于對(duì) JVM 中內(nèi)存,線程和類等的監(jiān)控,是一個(gè)基于 JMX(java management extensions)的 GUI 性能監(jiān)測(cè)工具。
7.2 VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序之一,曾經(jīng)在很長(zhǎng)一段時(shí)間內(nèi)是 Oracle 官方主力發(fā)展的虛擬機(jī)故障處理工具。
8. JVM 調(diào)優(yōu)選擇
8.1 選擇合適的垃圾回收器
CPU 單核:那么毫無(wú)疑問(wèn) Serial 垃圾收集器是你唯一的選擇;CPU 多核:關(guān)注吞吐量 ,那么選擇 PS+PO 組合;JDK8默認(rèn)CPU 多核:關(guān)注用戶停頓時(shí)間,JDK 版本 1.6 或者 1.7,那么選擇 CMS;CPU 多核:關(guān)注用戶停頓時(shí)間,JDK1.8 及以上,JVM 可用內(nèi)存 6G 以上,那么選擇 G1。
參數(shù)配置:
//設(shè)置Serial垃圾收集器(新生代)開(kāi)啟:-XX:+UseSerialGC//設(shè)置PS+PO,新生代使用功能Parallel Scavenge 老年代將會(huì)使用Parallel Old收集器開(kāi)啟 -XX:+UseParallelOldGC//CMS垃圾收集器(老年代)開(kāi)啟 -XX:+UseConcMarkSweepGC//設(shè)置G1垃圾收集器 開(kāi)啟 -XX:+UseG1GC
8.2 調(diào)整內(nèi)存大小
現(xiàn)象:垃圾收集頻率非常頻繁。 原因:如果內(nèi)存太小,就會(huì)導(dǎo)致頻繁的需要進(jìn)行垃圾收集才能釋放出足夠的空間來(lái)創(chuàng)建新的對(duì)象,所以增加堆內(nèi)存大小的效果是非常顯而易見(jiàn)的。 注意:如果垃圾收集次數(shù)非常頻繁,但是每次能回收的對(duì)象非常少,那么這個(gè)時(shí)候并非內(nèi)存太小,而可能是內(nèi)存泄露導(dǎo)致對(duì)象無(wú)法回收,從而造成頻繁 GC。 參數(shù)配置:
//設(shè)置堆初始值 指令1:-Xms2g 指令2:-XX:InitialHeapSize=2048m //設(shè)置堆區(qū)最大值 指令1:`-Xmx2g` 指令2: -XX:MaxHeapSize=2048m //新生代內(nèi)存配置 指令1:-Xmn512m 指令2:-XX:MaxNewSize=512m
8.3 設(shè)置符合預(yù)期的停頓時(shí)間
現(xiàn)象:程序間接性的卡頓 原因:如果沒(méi)有確切的停頓時(shí)間設(shè)定,垃圾收集器以吞吐量為主,那么垃圾收集時(shí)間就會(huì)不穩(wěn)定。 注意:不要設(shè)置不切實(shí)際的停頓時(shí)間,單次時(shí)間越短也意味著需要更多的 GC 次數(shù)才能回收完原有數(shù)量的垃圾. 參數(shù)配置:
//GC停頓時(shí)間,垃圾收集器會(huì)嘗試用各種手段達(dá)到這個(gè)時(shí)間 -XX:MaxGCPauseMillis
8.4 調(diào)整內(nèi)存區(qū)域大小比率
現(xiàn)象:某一個(gè)區(qū)域的GC頻繁,其他都正常。 原因:如果對(duì)應(yīng)區(qū)域空間不足,導(dǎo)致需要頻繁GC來(lái)釋放空間,在JVM堆內(nèi)存無(wú)法增加的情況下,可以調(diào)整對(duì)應(yīng)區(qū)域的大小比率。 注意:也許并非空間不足,而是因?yàn)閮?nèi)存泄造成內(nèi)存無(wú)法回收,從而導(dǎo)致 GC 頻繁。 參數(shù)配置:
//survivor區(qū)和Eden區(qū)大小比率 指令:-XX:SurvivorRatio=6 //S區(qū)和Eden區(qū)占新生代比率為1:6,兩個(gè)S區(qū)2:6 //新生代和老年代的占比 -XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整個(gè)堆的4/5;默認(rèn)值=2
8.5 調(diào)整對(duì)象升老年代的年齡
現(xiàn)象:老年代頻繁 GC,每次回收的對(duì)象很多。 原因:如果升代年齡小,新生代的對(duì)象很快就進(jìn)入老年代了,導(dǎo)致老年代對(duì)象變多,而這些對(duì)象其實(shí)在隨后的很短時(shí)間內(nèi)就可以回收,這時(shí)候可以調(diào)整對(duì)象的升級(jí)代年齡,讓對(duì)象不那么容易進(jìn)入老年代解決老年代空間不足頻繁 GC 問(wèn)題。 注意:增加了年齡之后,這些對(duì)象在新生代的時(shí)間會(huì)變長(zhǎng)可能導(dǎo)致新生代的 GC 頻率增加,并且頻繁復(fù)制這些對(duì)象新生的 GC 時(shí)間也可能變長(zhǎng)。 配置參數(shù):
//進(jìn)入老年代最小的GC年齡,年輕代對(duì)象轉(zhuǎn)換為老年代對(duì)象最小年齡值,默認(rèn)值7 -XX:InitialTenuringThreshol=7
8.6 調(diào)整大對(duì)象的標(biāo)準(zhǔn)
現(xiàn)象:老年代頻繁 GC,每次回收的對(duì)象很多,而且單個(gè)對(duì)象的體積都比較大。 原因:如果大量的大對(duì)象直接分配到老年代,導(dǎo)致老年代容易被填滿而造成頻繁 GC,可設(shè)置對(duì)象直接進(jìn)入老年代的標(biāo)準(zhǔn)。 注意:這些大對(duì)象進(jìn)入新生代后可能會(huì)使新生代的 GC 頻率和時(shí)間增加。 配置參數(shù):
//新生代可容納的最大對(duì)象,大于則直接會(huì)分配到老年代,0代表沒(méi)有限制。 -XX:PretenureSizeThreshold=1000000
8.7 調(diào)整GC的觸發(fā)時(shí)機(jī)
現(xiàn)象:CMS,G1 經(jīng)常 Full GC,程序卡頓嚴(yán)重。 原因:G1 和 CMS 部分 GC 階段是并發(fā)進(jìn)行的,業(yè)務(wù)線程和垃圾收集線程一起工作,也就說(shuō)明垃圾收集的過(guò)程中業(yè)務(wù)線程會(huì)生成新的對(duì)象,所以在 GC 的時(shí)候需要預(yù)留一部分內(nèi)存空間來(lái)容納新產(chǎn)生的對(duì)象,如果這個(gè)時(shí)候內(nèi)存空間不足以容納新產(chǎn)生的對(duì)象,那么JVM就會(huì)停止并發(fā)收集暫停所有業(yè)務(wù)線程(STW)來(lái)保證垃圾收集的正常運(yùn)行。這個(gè)時(shí)候可以調(diào)整GC觸發(fā)的時(shí)機(jī)(比如在老年代占用 60% 就觸發(fā) GC),這樣就可以預(yù)留足夠的空間來(lái)讓業(yè)務(wù)線程創(chuàng)建的對(duì)象有足夠的空間分配。 注意:提早觸發(fā) GC 會(huì)增加老年代 GC 的頻率。 配置參數(shù):
//使用多少比例的老年代后開(kāi)始CMS收集,默認(rèn)是68%,如果頻繁發(fā)生SerialOld卡頓,應(yīng)該調(diào)小 -XX:CMSInitiatingOccupancyFraction //G1混合垃圾回收周期中要包括的舊區(qū)域設(shè)置占用率閾值。默認(rèn)占用率為 65% -XX:G1MixedGCLiveThresholdPercent=65
8.8 調(diào)整 JVM本地內(nèi)存大小
現(xiàn)象:GC 的次數(shù)、時(shí)間和回收的對(duì)象都正常,堆內(nèi)存空間充足,但是報(bào) OOM 原因:JVM 除了堆內(nèi)存之外還有一塊堆外內(nèi)存,這片內(nèi)存也叫本地內(nèi)存,可是這塊內(nèi)存區(qū)域不足了并不會(huì)主動(dòng)觸發(fā) GC,只有在堆內(nèi)存區(qū)域觸發(fā)的時(shí)候順帶會(huì)把本地內(nèi)存回收了,而一旦本地內(nèi)存分配不足就會(huì)直接報(bào) OOM 異常。 注意:本地內(nèi)存異常的時(shí)候除了上面的現(xiàn)象之外,異常信息可能是 OutOfMemoryError:Direct buffer memory。解決方式除了調(diào)整本地內(nèi)存大小之外,也可以在出現(xiàn)此異常時(shí)進(jìn)行捕獲,手動(dòng)觸發(fā) GC(System.gc())。 配置參數(shù):
XX:MaxDirectMemorySize
9. JVM 調(diào)試實(shí)戰(zhàn)
為什么要調(diào)整JVM
JVM調(diào)優(yōu)背景
生產(chǎn)環(huán)境中的問(wèn)題 生產(chǎn)環(huán)境發(fā)生了內(nèi)存溢出該如何處理? 生產(chǎn)環(huán)境應(yīng)該給服務(wù)器分配多少內(nèi)存合適? 如何對(duì)垃圾回收器的性能進(jìn)行調(diào)優(yōu)? 生產(chǎn)環(huán)境 CPU 負(fù)載飆高該如何處理? 生產(chǎn)環(huán)境應(yīng)該給應(yīng)用分配多少線程合適? 不加 log,如何確定請(qǐng)求是否執(zhí)行了某一行代碼? 不加 log,如何實(shí)時(shí)查看某個(gè)方法的入?yún)⑴c返回值?
為什么要調(diào)優(yōu)
防止出現(xiàn) OOM解決 OOM減少 Full GC 出現(xiàn)的頻率
不同階段的考慮
上線前項(xiàng)目運(yùn)行階段線上出現(xiàn) OOM
JVM調(diào)優(yōu)方案
監(jiān)控的依據(jù)
運(yùn)行日志異常堆棧GC 日志線程快照堆轉(zhuǎn)儲(chǔ)快照
調(diào)優(yōu)的大方向
合理地編寫(xiě)代碼充分并合理的使用硬件資源合理地進(jìn)行 JVM 調(diào)優(yōu)
JVM性能優(yōu)化的步驟
第 1 步:性能監(jiān)控
GC 頻繁 cpu load 過(guò)高 OOM 內(nèi)存泄露 死鎖 程序響應(yīng)時(shí)間較長(zhǎng)
第 2 步:性能分析
打印 GC 日志,通過(guò) GCviewer 或者 Universal JVM GC analyzer - Java Garbage collection log analysis made easy 來(lái)分析異常信息 靈活運(yùn)用命令行工具、jstack、jmap、jinfo 等 dump 出堆文件,使用內(nèi)存分析工具分析文件 使用阿里 Arthas、jconsole、JVisualVM 來(lái)實(shí)時(shí)查看 JVM 狀態(tài) jstack 查看堆棧信息
第 3 步:性能調(diào)優(yōu)
適當(dāng)增加內(nèi)存,根據(jù)業(yè)務(wù)背景選擇垃圾回收器優(yōu)化代碼,控制內(nèi)存使用增加機(jī)器,分散節(jié)點(diǎn)壓力合理設(shè)置線程池線程數(shù)量使用中間件提高程序效率,比如緩存、消息隊(duì)列等其他……
性能評(píng)價(jià)/測(cè)試指標(biāo)
**1 停頓時(shí)間(或響應(yīng)時(shí)間):**提交請(qǐng)求和返回該請(qǐng)求的響應(yīng)之間使用的時(shí)間,一般比較關(guān)注平均響應(yīng)時(shí)間。常用操作的響應(yīng)時(shí)間列表:
2 垃圾回收環(huán)節(jié):
暫停時(shí)間:執(zhí)行垃圾收集時(shí),程序的工作線程被暫停的時(shí)間。-XX:MaxGCPauseMillis 表示每次GC最大的停頓毫秒
3 吞吐量
對(duì)單位時(shí)間內(nèi)完成的工作量(請(qǐng)求)的量度在 GC 中:運(yùn)行用戶代碼的事件占總運(yùn)行時(shí)間的比例(總運(yùn)行時(shí)間:程序的運(yùn)行時(shí)間+內(nèi)存回收的時(shí)間)吞吐量為 1-1/(1+n),其中-XX::GCTimeRatio=n
4 并發(fā)數(shù)
同一時(shí)刻,對(duì)服務(wù)器有實(shí)際交互的請(qǐng)求數(shù)
5 內(nèi)存占用
Java 堆區(qū)所占的內(nèi)存大小
6 相互間的關(guān)系
以高速公路通行狀況為例
吞吐量:每天通過(guò)高速公路收費(fèi)站的車輛的數(shù)據(jù)并發(fā)數(shù):高速公路上正在行駛的車輛的數(shù)目響應(yīng)時(shí)間:車速
9.1 網(wǎng)站流量瀏覽量暴增后,網(wǎng)站反應(yīng)頁(yè)面響很慢
1、問(wèn)題推測(cè):在測(cè)試環(huán)境測(cè)速度比較快,但是一到生產(chǎn)就變慢,所以推測(cè)可能是因?yàn)槔占瘜?dǎo)致的業(yè)務(wù)線程停頓。 2、定位:為了確認(rèn)推測(cè)的正確性,在線上通過(guò) jstat -gc 指令 看到 JVM 進(jìn)行 GC 次數(shù)頻率非常高,GC 所占用的時(shí)間非常長(zhǎng),所以基本推斷就是因?yàn)?GC 頻率非常高,所以導(dǎo)致業(yè)務(wù)線程經(jīng)常停頓,從而造成網(wǎng)頁(yè)反應(yīng)很慢。 3、解決方案:因?yàn)榫W(wǎng)頁(yè)訪問(wèn)量很高,所以對(duì)象創(chuàng)建速度非???,導(dǎo)致堆內(nèi)存容易填滿從而頻繁 GC,所以這里問(wèn)題在于新生代內(nèi)存太小,所以這里可以增加 JVM 內(nèi)存就行了,所以初步從原來(lái)的 2G 內(nèi)存增加到 16G 內(nèi)存。 4、第二個(gè)問(wèn)題:增加內(nèi)存后的確平常的請(qǐng)求比較快了,但是又出現(xiàn)了另外一個(gè)問(wèn)題,就是不定期的會(huì)間斷性的卡頓,而且單次卡頓的時(shí)間要比之前要長(zhǎng)很多。 5、問(wèn)題推測(cè):之前的優(yōu)化加大了內(nèi)存,所以推測(cè)可能是因?yàn)閮?nèi)存加大了,從而導(dǎo)致單次 GC 的時(shí)間變長(zhǎng)從而導(dǎo)致間接性的卡頓。 6、定位:還是通過(guò) jstat -gc 指令 查看到 的確 FGC 次數(shù)并不是很高,但是花費(fèi)在 FGC 上的時(shí)間是非常高的,根據(jù) GC 日志 查看到單次 FGC 的時(shí)間有達(dá)到幾十秒的。 7、解決方案:因?yàn)?JVM 默認(rèn)使用的是 PS+PO 的組合,PS+PO 垃圾標(biāo)記和收集階段都是 STW,所以內(nèi)存加大了之后,需要進(jìn)行垃圾回收的時(shí)間就變長(zhǎng)了,所以這里要想避免單次 GC 時(shí)間過(guò)長(zhǎng),所以需要更換并發(fā)類的收集器,因?yàn)楫?dāng)前的 JDK 版本為 1.7,所以最后選擇 CMS 垃圾收集器,根據(jù)之前垃圾收集情況設(shè)置了一個(gè)預(yù)期的停頓的時(shí)間,上線后網(wǎng)站再也沒(méi)有了卡頓問(wèn)題。
9.2 后臺(tái)導(dǎo)出數(shù)據(jù)引發(fā)的 OOM
問(wèn)題描述:公司的后臺(tái)系統(tǒng),偶發(fā)性的引發(fā) OOM 異常,堆內(nèi)存溢出。 1、因?yàn)槭桥及l(fā)性的,所以第一次簡(jiǎn)單的認(rèn)為就是堆內(nèi)存不足導(dǎo)致,所以單方面的加大了堆內(nèi)存從 4G 調(diào)整到 8G。 2、但是問(wèn)題依然沒(méi)有解決,只能從堆內(nèi)存信息下手,通過(guò)開(kāi)啟了 -XX:+HeapDumpOnOutOfMemoryError 參數(shù) 獲得堆內(nèi)存的 dump 文件。 3、VisualVM 對(duì)堆 dump 文件進(jìn)行分析,通過(guò) VisualVM 查看到占用內(nèi)存最大的對(duì)象是 String 對(duì)象,本來(lái)想跟蹤著 String 對(duì)象找到其引用的地方,但 dump 文件太大,跟蹤進(jìn)去的時(shí)候總是卡死,而 String 對(duì)象占用比較多也比較正常,最開(kāi)始也沒(méi)有認(rèn)定就是這里的問(wèn)題,于是就從線程信息里面找突破點(diǎn)。 4、通過(guò)線程進(jìn)行分析,先找到了幾個(gè)正在運(yùn)行的業(yè)務(wù)線程,然后逐一跟進(jìn)業(yè)務(wù)線程看了下代碼,發(fā)現(xiàn)有個(gè)引起我注意的方法,導(dǎo)出訂單信息。 5、因?yàn)橛唵涡畔?dǎo)出這個(gè)方法可能會(huì)有幾萬(wàn)的數(shù)據(jù)量,首先要從數(shù)據(jù)庫(kù)里面查詢出來(lái)訂單信息,然后把訂單信息生成 excel,這個(gè)過(guò)程會(huì)產(chǎn)生大量的 String 對(duì)象。 6、為了驗(yàn)證自己的猜想,于是準(zhǔn)備登錄后臺(tái)去測(cè)試下,結(jié)果在測(cè)試的過(guò)程中發(fā)現(xiàn)到處訂單的按鈕前端居然沒(méi)有做點(diǎn)擊后按鈕置灰交互事件,結(jié)果按鈕可以一直點(diǎn),因?yàn)閷?dǎo)出訂單數(shù)據(jù)本來(lái)就非常慢,使用的人員可能發(fā)現(xiàn)點(diǎn)擊后很久后頁(yè)面都沒(méi)反應(yīng),結(jié)果就一直點(diǎn),結(jié)果就大量的請(qǐng)求進(jìn)入到后臺(tái),堆內(nèi)存產(chǎn)生了大量的訂單對(duì)象和 EXCEL 對(duì)象,而且方法執(zhí)行非常慢,導(dǎo)致這一段時(shí)間內(nèi)這些對(duì)象都無(wú)法被回收,所以最終導(dǎo)致內(nèi)存溢出。 7、知道了問(wèn)題就容易解決了,最終沒(méi)有調(diào)整任何 JVM 參數(shù),只是在前端的導(dǎo)出訂單按鈕上加上了置灰狀態(tài),等后端響應(yīng)之后按鈕才可以進(jìn)行點(diǎn)擊,然后減少了查詢訂單信息的非必要字段來(lái)減少生成對(duì)象的體積,然后問(wèn)題就解決了。
9.3 Window JVM調(diào)優(yōu)
查詢JDK所用虛擬機(jī)
java version "1.8.0_91"Java(TM) SE Runtime Environment (build 1.8.0_91-b14)Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)//支持 Java 8, 使用的是 Oracle 的64位HotSpot虛擬機(jī)。//HotSpot VM 是 OracleJDK / SunJDK 以及 OpenJDK 里的 JVM 實(shí)現(xiàn)。使用最廣泛,JDK默認(rèn)安裝的。
Java問(wèn)題診斷和排查工具(查看JVM參數(shù)、內(nèi)存使用情況及分析等)
常用查詢命令
JPS (打印Java進(jìn)程信息)
使用場(chǎng)景 : 查看當(dāng)前機(jī)器的所有Java進(jìn)程信息(可追蹤到應(yīng)用進(jìn)程ID 、啟動(dòng)類名、文件路徑。)。jps 顯示當(dāng)前所有java進(jìn)程pid的命令jps -v 輸出傳遞給JVM的參數(shù)
jstack(JVM線程信息監(jiān)控)
使用場(chǎng)景: 查看JVM線程信息 和生成線程快照。jstack pid 主要用于生成指定進(jìn)程當(dāng)前時(shí)刻的線程快照,線程快照是當(dāng)前java虛擬機(jī)每一條線程正在執(zhí)行的方法堆棧的集合。分析線程棧
Jmap(JVM內(nèi)存占用信息和快照)
使用場(chǎng)景: 監(jiān)控堆內(nèi)存使用情況和對(duì)象占用情況, 生成堆內(nèi)存快照文件,查看堆內(nèi)存區(qū)域配置信息。**jmap **打印指定java進(jìn)程的共享對(duì)象內(nèi)存映射或堆內(nèi)存細(xì)節(jié)。堆Dump是反映堆使用情況的內(nèi)存鏡像,其中主要包括系統(tǒng)信息、虛擬機(jī)屬性、完整的線程Dump、所有類和對(duì)象的狀態(tài)等。
**jmap pid **共享對(duì)象的起始地址、映射大小、共享對(duì)象路徑的全程。 jmap -heap pid:查看堆使用情況jmap -histo pid:查看堆中對(duì)象數(shù)量和大小
Jstat (JVM內(nèi)存信息統(tǒng)計(jì))
使用場(chǎng)景 :用于查看各個(gè)功能和區(qū)域的統(tǒng)計(jì)信息(如:類加載、編譯相關(guān)信息統(tǒng)計(jì),各個(gè)內(nèi)存區(qū)域GC概況和統(tǒng)計(jì))jstat-gc pid: 統(tǒng)計(jì)垃圾回收堆的行為
Jinfo(JVM參數(shù)查看和修改)
使用場(chǎng)景: 查看和調(diào)整JVM啟動(dòng)和運(yùn)行參數(shù)。
Jinfo pid 查看JVM整個(gè)系統(tǒng)參數(shù)信息jinfo -flag [參數(shù)名] pid 查看某個(gè)具體參數(shù)jinfo -flag啟動(dòng)某個(gè)配置
java查詢JVM配置參數(shù)
查詢JVM配置參數(shù)java -XX:+PrintCommandLineFlags
C:\Program Files\Java\jdk1.8.0_91\bin>java -XX:+PrintCommandLineFlags-XX:InitialHeapSize=199690240 //初始堆大小bytes 這里23M-XX:MaxHeapSize=3195043840 //最大堆大小bytes 這里380M-XX:+PrintCommandLineFlags //PrintCommandLineFlags 是打印那些被新值覆蓋的項(xiàng)-XX:+UseCompressedClassPointers //UseCompressedClassPointers:類指針壓縮-XX:+UseCompressedOops //UseCompressedOops:普通對(duì)象指針壓縮-XX:-UseLargePagesIndividualAllocation //關(guān)閉減少處理器 TLB 緩存壓力的技術(shù)-XX:+UseParallelGC //設(shè)置并行收集器 “Parallel Scavenge” + "Parallel Old"組合
查詢JVM配置參數(shù)java -XX:+PrintFlagsFinal -version |FINDSTR /i “:”
C:\Program Files\Java\jdk1.8.0_91\bin>java -XX:+PrintFlagsFinal -version |FINDSTR /i ":" intx CICompilerCount := 3 {product} uintx InitialHeapSize := 201326592 //初始堆大小bytes {product} uintx MaxHeapSize := 3196059648 //最大堆大小bytes {product} uintx MaxNewSize := 1065353216 //新生代分配內(nèi)存最大上限,小于-Xmx的值; {product} uintx MinHeapDeltaBytes := 524288 //要擴(kuò)容或者縮容最小擴(kuò)/縮多少 {product} uintx NewSize := 67108864 //新生代初始內(nèi)存的大小,應(yīng)該小于-Xms的值; {product} uintx OldSize := 134217728 //老年代的默認(rèn)大小 {product} bool PrintFlagsFinal := true //打印所有的默認(rèn)參數(shù)設(shè)置 {product} bool UseCompressedClassPointers := true {lp64_product} bool UseCompressedOops := true {lp64_product} bool UseLargePagesIndividualAllocation := false {pd product} bool UseParallelGC := true {product}java version "1.8.0_91"Java(TM) SE Runtime Environment (build 1.8.0_91-b14)Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
配置Windows JVM參數(shù)
1、系統(tǒng)環(huán)境中配置(推薦)
虛擬機(jī)內(nèi)存的大小除了在web容器中設(shè)置,我們還可以通過(guò)系統(tǒng)環(huán)境變量來(lái)設(shè)置,下面看看設(shè)置步驟: 打開(kāi)windows系統(tǒng)環(huán)境變量,在系統(tǒng)變量中,新建變量JAVA_OPTS,值設(shè)置為:
8G物理內(nèi)存JVM虛擬機(jī)配置idea優(yōu)化命令-XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=95 -Xms5120m -Xmx5120m -Xmn1024m -Xss128k -XX:MaxTenuringThreshold=0jdk8 使用G1垃圾回收器-XX:-UseParallelGC -Xms3550m -Xmx3550m -Xmn1024m -Xss128k -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=95 -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MatespaceSize=6
優(yōu)化前啟動(dòng)優(yōu)化前jmeter測(cè)試
優(yōu)化后啟動(dòng)優(yōu)化后jmeter測(cè)試
jvm中常用的參數(shù)含義:
每個(gè)對(duì)象都有一個(gè)計(jì)數(shù)器,每次YGC 都會(huì)加1,配置計(jì)數(shù)器的值到達(dá)某個(gè)闡值的時(shí)候, 對(duì)象從 新生代晉升至老年。 -XX:MaxTenuringThreshold
為功能點(diǎn)比較多,在運(yùn)行過(guò)程中,要不斷動(dòng)態(tài)加載很多的類,經(jīng)常出現(xiàn)致命錯(cuò)誤。為了解決該問(wèn)題, 需要設(shè)定運(yùn)行參數(shù) -XX: MaxPermSize= 1280m ,
以給NM 設(shè)置運(yùn)行參數(shù)讓JVM 遇到OOM 異常時(shí)能輸出堆內(nèi)信息。 -XX:+HeapDumpOnOutOfMemoryError
1: -Xmx指定 jvm 的最大內(nèi)存大小 , 如 :-Xmx=2048M(根據(jù)設(shè)備物理內(nèi)存以及實(shí)際情況設(shè)定,建議為物理內(nèi)存的80%) 2: -Xms指定 jvm 的初始內(nèi)存大小 , 如 :-Xms=2048M, 高并發(fā)應(yīng)用, 建議和-Xmx一樣, 防止因?yàn)閮?nèi)存收縮/突然增大帶來(lái)的性能影響. 3: -Xmn指定 jvm 中 New Generation (堆空間的新生代空間)的大小 , 如 :-Xmn=256m。 這個(gè)參數(shù)很影響性能, 如果你的程序需要比較多的臨時(shí)內(nèi)存, 建議設(shè)置到512M, 如果用的少, 盡量降低這個(gè)數(shù)值, 一般來(lái)說(shuō)128/256足以使用了。 4: -XX:PermSize (java7,java8移除)指定 jvm 中 Perm Generation (永久存儲(chǔ)區(qū))的最小值 , 如 :-XX:PermSize=32m。 這個(gè)參數(shù)需要看你的實(shí)際情況??梢酝ㄟ^(guò)jmap 命令看看到底需要多少。 5: -XX:MaxPermSize(java7,java8移除)指定 Perm Generation 的最大值 , 如 :-XX:MaxPermSize=64m 6: -Xss指定線程桟大小 , 如 :-Xss=128k, 一般來(lái)說(shuō),webx框架下的應(yīng)用需要256K。 如果程序中有大規(guī)模的遞歸行為,請(qǐng)考慮設(shè)置到512K/1M。 這個(gè)需要全面的測(cè)試才能知道。 不過(guò),256K已經(jīng)很大了。 這個(gè)參數(shù)對(duì)性能的影響比較大的。 7:-XX:MatespaceSize(java8)和-XX:MatespaceSize(java8)JVM加載類的時(shí)候,需要記錄類的元數(shù)據(jù),這些數(shù)據(jù)會(huì)保存在一個(gè)單獨(dú)的內(nèi)存區(qū)域內(nèi),在Java 7里,這個(gè)空間被稱為永久代(Permgen),在Java 8里,使用元空間(Metaspace)代替了永久代。由于調(diào)整元空間的大小需要Full GC,這是非常昂貴的操作,如果應(yīng)用在啟動(dòng)的時(shí)候發(fā)生大量Full GC,通常都是由于永久代或元空間發(fā)生了大小調(diào)整,基于這種情況一般建議在JVM參數(shù)中將MetaspaceSize和MaxMetaspaceSize設(shè)置成一樣的值,并設(shè)置得比初始值要大,對(duì)于8G物理內(nèi)存的機(jī)器來(lái)說(shuō),一般我會(huì)將這兩個(gè)值都設(shè)置為512M。
2、使用命令配置
java命令配置
8G物理內(nèi)存JVM虛擬機(jī)配置java -XX:+UseG1GC-Xms3550m -Xmx3550m -Xmn1024m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MatespaceSize=512m -XX:MaxMetaspaceSize=512m -XX:MaxTenuringThreshold=0
使用 -Xms 設(shè)置堆的初始空間大小 java -Xms20m -Xmx30m GCDemo
JVM 提供了參數(shù) -Xmn 來(lái)設(shè)置年輕代內(nèi)存的大小 java -Xms20m -Xmn10M GCDemo
使用 -XX:SurvivorRatio 這個(gè)參數(shù),該參數(shù)設(shè)置 eden / from 空間的比例關(guān)系 -XX:SurvivorRatio = eden/from = eden/to java -Xms20m -Xmn10M -XX:SurvivorRatio=2 -XX:+PrintGCDetails GCDemo
永久代(JDK1.7)所加載的類信息都放在永久代中。用 -XX:PermSize 設(shè)置永久代初始大小,用 -XX:MaxPermSize 設(shè)置永久代最大大小。 java -XX:PermSize=10m -XX:MaxPermSize=50m -XX:+PrintGCDetails GCDemo
元空間(JDK1.8)在 JDK1.8 之時(shí),永久代被移除,取而代之的是元空間 java -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=50m -XX:+PrintGCDetails GCDemo
棧空間是每個(gè)線程各自有的一塊區(qū)域,如果??臻g太小,也會(huì)導(dǎo)致 StackOverFlow 異常。而要設(shè)置??臻g大小,只需要使用 -Xss 參數(shù)就可以。 java -Xss2m GCDemo
在 JVM 中還有一塊內(nèi)存,它獨(dú)立于 JVM 的堆內(nèi)存,它就是:直接內(nèi)存。 java -XX:MaxDirectMemorySize=50m GCDemo
實(shí)時(shí)修改JVM參數(shù):jinfo -flag name = value PID 如果要對(duì)參數(shù)進(jìn)行實(shí)時(shí)調(diào)整:則需要看到參數(shù)后面有manageable的才能被實(shí)時(shí)調(diào)整
9.4 Linux JVM調(diào)優(yōu)
基本同windows,只是命令上大同小異。 使用命令配置
8G物理內(nèi)存JVM虛擬機(jī)配置java -XX:+UseG1GC-Xms3550m -Xmx3550m -Xmn1024m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MatespaceSize=512m -XX:MaxMetaspaceSize=512m -XX:MaxTenuringThreshold=0
參考鏈接
jmeter
https://cloud.tencent.com/developer/article/1633626 https://blog.csdn.net/wust_lh/article/details/86095924 https://blog.csdn.net/qq_37453279/article/details/107990659 https://zhuanlan.zhihu.com/p/142897766
獲取jvm日志
https://blog.csdn.net/zlzlei/article/details/46471627 https://blog.csdn.net/S1124654/article/details/125467265 https://www.jianshu.com/p/0167a0fc8063 [https://zhuanlan.zhihu.com/p/355765061[https://blog.csdn.net/qq_35925558/article/details/116464460
jvm監(jiān)控調(diào)優(yōu)關(guān)注參數(shù)指標(biāo)
[https://blog.csdn.net/weixin_41605937/article/details/121704836https://blog.csdn.net/weixin_43935927/article/details/109233111 [https://zhuanlan.zhihu.com/p/269597178[https://zhuanlan.zhihu.com/p/267381560
jvm調(diào)優(yōu)
https://blog.csdn.net/augsm/article/details/109272205 https://tianweichang.blog.csdn.net/article/details/109712806 https://heapdump.cn/ https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&mid=2247495919&idx=1&sn=71010d91e376270afc31bbe61c8326aa&chksm=c0e82807f79fa111d7c339832f48c9542d5fc1540c1a619c1a3281040fc1631616e016d0dc36&mpshare=1&scene=23&srcid=0630pKVRvfxq3GMy1Oa2Wxda&sharer_sharetime=1656582521218&sharer_shareid=4b447a3cb6ab5d3443a5fc9771951705#rd https://www.cnblogs.com/z-sm/p/6745375.html https://www.cnblogs.com/zhi-leaf/p/10629033.html https://blog.csdn.net/weixin_43474695/article/details/108248756
https://blog.csdn.net/weixin_28864057/article/details/119661743 https://blog.csdn.net/qq_40902067/article/details/106003880
idea中設(shè)置JVM參數(shù)
https://zhuanlan.zhihu.com/p/117627812
Java自定義類加載器
https://blog.csdn.net/weixin_42759726/article/details/114030153
查詢JVM配置參數(shù)分析參考
https://blog.csdn.net/m0_45406092/article/details/110766297 https://www.cnblogs.com/milton/p/6134251.html https://blog.csdn.net/qq13933506749/article/details/120187991 https://www.cnblogs.com/yidaixiaohui/p/10216180.html
JVM關(guān)鍵參數(shù)
https://www.cnblogs.com/bapiera/p/13592525.html https://www.cnblogs.com/GtShare/p/9767768.html https://jishuin.proginn.com/p/763bfbd66a1c https://blog.csdn.net/a469517790/article/details/104916916 https://blog.csdn.net/a469517790/article/details/104916916 https://blog.csdn.net/m0_45406092/article/details/110766297
JVM參數(shù)之堆棧空間配置
https://blog.csdn.net/qq_40902067/article/details/106003880 https://blog.csdn.net/weixin_28864057/article/details/119661743
JDK8使用G1無(wú)效
https://blog.csdn.net/weixin_42629445/article/details/120717860 https://bbs.huaweicloud.com/blogs/247828 https://www.jianshu.com/p/7dd309cc3442 https://www.cnblogs.com/frankyou/p/15048531.html https://blog.csdn.net/Megustas_JJC/article/details/105470675 https://zhuanlan.zhihu.com/p/458098236
java程序輸出jvm參數(shù)
https://blog.csdn.net/sjl110/article/details/41516745
JDK1.8默認(rèn)垃圾回收器
https://blog.csdn.net/qq_27500493/article/details/108063108
JVM垃圾收集器【Serial、ParNew、PS、CMS、Serial Old、PO、G1】總結(jié)
https://blog.csdn.net/qq_43661709/article/details/122793803
windows配置jVM
https://blog.csdn.net/qq_38776582/article/details/109738067 https://blog.csdn.net/mhqyr422/article/details/79691042
標(biāo)簽:
相關(guān)推薦:
精彩放送:
- []在哪里看股指期貨的行情?股指期貨行情信息
- []當(dāng)前動(dòng)態(tài):基金定投可以隨時(shí)取出來(lái)嗎
- []Java進(jìn)階1-JVM虛擬機(jī) JVM在字節(jié)碼上的使用方法
- []5.0以下的主流圖片加載框架有哪些?安卓加載圖片四大框架
- []環(huán)球微頭條丨如何使用視頻剪輯軟件將qsv格式視頻轉(zhuǎn)換為MP4格式?方法步驟
- []環(huán)球今日?qǐng)?bào)丨中國(guó)“北斗”衛(wèi)星導(dǎo)航系統(tǒng)——定位模塊需求介紹
- []如何利用大數(shù)據(jù)實(shí)現(xiàn)精準(zhǔn)營(yíng)銷?會(huì)員管理中用戶數(shù)據(jù)的流轉(zhuǎn)及應(yīng)用邏輯
- []世界快看:操作系統(tǒng)中死鎖的算法——銀行家算法
- []當(dāng)前資訊!DirectSound能幫我們做什么?DirectSound開(kāi)發(fā)指南
- []“流氓”劉邦戰(zhàn)勝英雄項(xiàng)羽的因素有哪些?詳情介紹
- []當(dāng)前熱門(mén):【干貨】Python與STAT時(shí)間日期轉(zhuǎn)換問(wèn)題
- []]]全球觀速訊丨st股票什么股
- []股票開(kāi)戶需要多少錢(qián)
- []海昌海洋公園2022年?duì)I收同比下降近七成,將持續(xù)發(fā)展頂流IP
- []鏈家將27座城市轉(zhuǎn)為加盟模式?貝殼:消息不實(shí),僅為小范圍合伙人模式
- []當(dāng)前速訊:美達(dá)股份:公司生產(chǎn)的部分產(chǎn)品可在軍民融合領(lǐng)域進(jìn)行應(yīng)用,具體請(qǐng)以公司公告和定期報(bào)告為準(zhǔn)
- []每日看點(diǎn)!國(guó)??萍迹褐袊?guó)的城市軌道交通全自動(dòng)運(yùn)行(無(wú)人駕駛)信號(hào)系統(tǒng)處于國(guó)際先進(jìn)水平
- []【全球報(bào)資訊】悅榕集團(tuán)2022財(cái)年總計(jì)63家酒店收官 計(jì)劃2025年擴(kuò)張至113家
- []全球看熱訊:我愛(ài)我家副總裁何洋辭任
- []我愛(ài)我家:五八有限公司擬減持不超過(guò)2.74%股份 持股比例將低于5%
- []中國(guó)恒大披露重組進(jìn)展
- []電科院:公司具體經(jīng)營(yíng)情況詳見(jiàn)以往定期報(bào)告
- []焦點(diǎn)訊息:航班老是臨時(shí)取消?民航局要出手了
- []環(huán)球新資訊:國(guó)泰君安醫(yī)藥一季報(bào)業(yè)績(jī)前瞻:業(yè)績(jī)復(fù)蘇環(huán)比趨勢(shì)明確
- []【速看料】中信建投:TOPCon電池、組件超額利潤(rùn)有望擴(kuò)大
- []眼看AI主題基金起高樓 “消費(fèi)選手”仍在默默堅(jiān)守
- []天天亮點(diǎn)!AI+元宇宙!Meta離夢(mèng)想更進(jìn)一步?
- []蘇州常熟2宗宅地將于5月5日出讓 起價(jià)合計(jì)5.4億元
- []昭衍新藥:公司會(huì)緊跟行業(yè)技術(shù)的發(fā)展變化,學(xué)習(xí)和借鑒相關(guān)技術(shù)在安評(píng)業(yè)務(wù)中的運(yùn)用
- []環(huán)球百事通!中南建設(shè)前3月合同銷售額120.4億元 同比減少26.2%
- []消息!南昌中溢置業(yè)將轉(zhuǎn)讓杭州通原地產(chǎn)40%股權(quán) 底價(jià)8031.3萬(wàn)元
- []亞通精工:公司未有應(yīng)披露而未披露事項(xiàng),股價(jià)漲跌受多種因素影響,股價(jià)波動(dòng)是正常的市場(chǎng)交易行為
- []西安國(guó)際港務(wù)區(qū)掛牌2宗宅地面積共117畝 起始總價(jià)為7.894億元
- []財(cái)面兒丨越秀地產(chǎn)1-3月累計(jì)合同銷售額約人民幣438.33億元 同比上升約217.3%
- []當(dāng)前視點(diǎn)!海容冷鏈:公司產(chǎn)品不應(yīng)用于殯葬行業(yè),公司產(chǎn)品應(yīng)用于快速消費(fèi)品行業(yè)的渠道建設(shè)
- []每日時(shí)訊!將優(yōu)化調(diào)整高校兩成左右學(xué)科專業(yè)布點(diǎn)
- []【全球報(bào)資訊】合肥放開(kāi)部分區(qū)域限購(gòu)! 多孩家庭可買(mǎi)第3套住房
- []世界今日訊!鏈家欲在北京、上海以外城市轉(zhuǎn)為加盟模式?貝殼回應(yīng):無(wú)此計(jì)劃
- []每經(jīng)熱評(píng)|當(dāng)前并非出臺(tái)房產(chǎn)稅政策的好時(shí)機(jī)
- []天天訊息:一個(gè)月的寶寶很容易被驚嚇怎么辦_一個(gè)月的寶寶發(fā)育指標(biāo)
- []【熱聞】怎樣取公積金
- []今日熱門(mén)!怎么取公積金
- []天天快看:交強(qiáng)險(xiǎn)怎么用
- []貝殼:鏈家將27座城市轉(zhuǎn)為加盟模式消息不實(shí) 僅為小范圍合伙人模式
- []當(dāng)前消息!滕哈赫:現(xiàn)在才是賽季真正的開(kāi)始,輸給紐卡后我們要有積極回應(yīng)
- []道達(dá)爾能源與伊拉克政府就100億美元天然氣開(kāi)發(fā)項(xiàng)目達(dá)成一致
- []世界快資訊丨林斌辭任奧園美谷財(cái)務(wù)總監(jiān)職務(wù)?江永標(biāo)繼任
- []中南建設(shè):中南城投減持212.03萬(wàn)股 占所持股比例0.11%
- []天天百事通!中南建設(shè)前三月累計(jì)合同銷售金額120.4億元 同比降26.2%
- []胡泊、李強(qiáng)分別辭任南國(guó)置業(yè)聯(lián)席總經(jīng)理、副總經(jīng)理
- []萬(wàn)達(dá)投資新增質(zhì)押1930萬(wàn)股萬(wàn)達(dá)電影 累計(jì)質(zhì)押6665萬(wàn)股
- []環(huán)球今頭條!劉鑫獲任榮盛發(fā)展副總裁
- []全球熱文:廈門(mén)象嶼與河南能源集團(tuán)簽訂戰(zhàn)略合作協(xié)議
- []環(huán)球最新:4月05日20時(shí)青海海東今天新增確診名單 4月05日20時(shí)青海海東疫情防控政策最新通知
- []當(dāng)前視點(diǎn)!一半鄉(xiāng)土質(zhì)樸,一半文藝先鋒,沙漠河流共生的小城,最美季節(jié)到了
- []全球熱門(mén):戶用儲(chǔ)能系統(tǒng)有什么用,有哪些特點(diǎn)和應(yīng)用?
- []全球看熱訊:長(zhǎng)久物流設(shè)立儲(chǔ)能全資子公司!
- []天天亮點(diǎn)!不低于1GW!泰達(dá)股份聯(lián)手千泉實(shí)業(yè)投建光伏項(xiàng)目
- []30萬(wàn)噸光伏玻璃硅砂提純項(xiàng)目環(huán)評(píng)
- []天天視點(diǎn)!超10GW!TCL中環(huán)單月出貨新突破
- []一彬科技:公司生產(chǎn)經(jīng)營(yíng)一切正常。公司對(duì)未來(lái)汽車產(chǎn)業(yè)的發(fā)展充滿信心
- []國(guó)際油價(jià)小跌,受制于美國(guó)制造業(yè)降溫,本周重頭戲待上演
- []焦點(diǎn)要聞:深圳到九江火車時(shí)刻表查詢_南昌到九江火車時(shí)刻表
- []醫(yī)道彤行,厚積薄發(fā)|2021道彤投資年度合伙人大會(huì)特寫(xiě)
- []海淘的childlife大瓶鈣含防腐劑?專家建議嬰幼兒產(chǎn)品選購(gòu)要謹(jǐn)慎
- []好好香鍋公司怎么樣
- []觀察:鴻路鋼構(gòu):鋼結(jié)構(gòu)是綠色節(jié)能產(chǎn)品,是國(guó)家提倡并大力推廣的裝配式建筑的重要組成部分
- []基金經(jīng)理猛追AI 但斌卻突然唱空:一旦被套 不知猴年馬月解套
- []關(guān)注:難道是真的?青海發(fā)現(xiàn)形狀怪異的遺骸,揭開(kāi)大禹治水背后的真相!
- []世界微頭條丨維宏股份:整個(gè)Phoenix平臺(tái)包含了軟件和硬件兩個(gè)部分
- []簡(jiǎn)訊:拜登:人工智能是否危險(xiǎn)還有待觀察 但科技公司需為安全負(fù)責(zé)
- []世界聚焦:2023年Q1季度精選文章合集 | 商旅會(huì)獎(jiǎng)賽道
- []觀速訊丨申請(qǐng)破產(chǎn)!暴跌90%
- []【全球新要聞】2023年Q1季度精選文章合集 | 在線旅游/分銷賽道
- []每日關(guān)注!四川宜賓:住房公積金最高貸款額度可達(dá)90萬(wàn)元
- []全球快訊:伊戈?duì)枺汗緯?huì)根據(jù)客戶需求和業(yè)務(wù)開(kāi)拓的情況提前布局或者調(diào)整相應(yīng)的產(chǎn)能
- []越秀地產(chǎn):一季度累計(jì)銷售約438億元
- []環(huán)球今日訊!合肥調(diào)整購(gòu)房政策:部分區(qū)域放開(kāi)限購(gòu)
- []全球微資訊!全國(guó)春風(fēng)地圖出爐 看看你那兒的四月天
- []環(huán)球關(guān)注:黃金大漲近2% 逼近歷史最高紀(jì)錄!金價(jià)為何持續(xù)大漲?專家解讀
- []當(dāng)前快報(bào):是否想念籃球?維金斯:我非常想念隊(duì)友們 期待與他們并肩作戰(zhàn)
- []外匯交易提醒:降息預(yù)期升溫,美元跌創(chuàng)近兩個(gè)月新低,新西蘭聯(lián)儲(chǔ)決議來(lái)襲,紐元續(xù)漲有望
- []周鴻祎突然離婚,要AI不要愛(ài)?董秘回應(yīng)來(lái)了
- []accountnumber怎么讀_Accountnumber
- []4月5日財(cái)經(jīng)早餐:美數(shù)據(jù)疲軟強(qiáng)化美聯(lián)儲(chǔ)放緩加息押注,金價(jià)站上2000美元/盎司大關(guān)創(chuàng)三十二個(gè)月新高
- []【世界聚看點(diǎn)】高達(dá)65%成本節(jié)約 施耐德電氣適配改造服務(wù)助企業(yè)把握“循環(huán)”機(jī)遇
- []銀行信貸投放不足原因_銀行信貸的作用
- []恒達(dá)集團(tuán)控股2022年收入增加約3.4% 純利減74.3%至7780萬(wàn)
- []環(huán)球速讀:車險(xiǎn)傭金
- []看熱訊:三大保險(xiǎn)
- []熱訊:壽險(xiǎn)功用
- []當(dāng)前資訊!聚焦中概 | 小鵬汽車跌幅擴(kuò)大至7% 造車新勢(shì)力普跌
- []雙十原則
- []當(dāng)前快看:烏龜冬眠是為了放水還是放沙?
- []天天快消息!周鴻祎與胡歡離婚 后者分得三六零4.46億股、對(duì)應(yīng)市值近90億元
- []環(huán)球觀熱點(diǎn):周度經(jīng)濟(jì)觀察:斜率放緩的經(jīng)濟(jì)復(fù)蘇
- []世界觀焦點(diǎn):申通快遞:公司與阿里云合作,通過(guò)引入云原生技術(shù)實(shí)現(xiàn)了技術(shù)全面升級(jí)
- []全球短訊!深交所、滬交所4月8日全面實(shí)行注冊(cè)制交易業(yè)務(wù)通關(guān)測(cè)試
- 全球速讀:進(jìn)銷存軟件哪家強(qiáng)?上百種進(jìn)銷存軟件大比拼
- 世界新動(dòng)態(tài):跨境電商營(yíng)銷推廣的方法有哪些?跨境電商8大推廣引流方式
- 即時(shí):個(gè)人用戶如何在知網(wǎng)系統(tǒng)提交知網(wǎng)查重?具體操作步驟
- 當(dāng)前訊息:美國(guó)三大股指什么意思
- 基金托管費(fèi)是什么
- 環(huán)球熱議:python程序接收命令行參數(shù)的方式及步驟
- 當(dāng)前頭條:筆記本電腦當(dāng)無(wú)線路由器怎么設(shè)置?設(shè)置流程
- pp助手安裝失敗怎么辦?PP助手修復(fù)方法
- 【環(huán)球報(bào)資訊】VEX為什么要用到中間表達(dá)式?為什么要用到VEX?
- 全球要聞:C語(yǔ)言基礎(chǔ)知識(shí)入門(mén) C語(yǔ)言的具體結(jié)構(gòu)
- B站注冊(cè)資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨(dú)家財(cái)務(wù)顧問(wèn) 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年?duì)I收11.24億元 期內(nèi)研發(fā)費(fèi)用投入增長(zhǎng)19.05%
- 紅棗期貨尾盤(pán)拉升大漲近6% 目前紅棗市場(chǎng)總庫(kù)存約30萬(wàn)噸
- 嘉銀金科發(fā)布2021年Q2財(cái)報(bào) 期內(nèi)凈利潤(rùn)達(dá)1.27億元同比增長(zhǎng)208%
- 成都銀行2021上半年凈利33.89億元 期內(nèi)實(shí)現(xiàn)營(yíng)收同比增長(zhǎng)17.27億元
- 汽車之家發(fā)布2021年第二季度業(yè)績(jī) 期內(nèi)新能源汽車品牌收入增長(zhǎng)238%
- 中信銀行上半年實(shí)現(xiàn)凈利潤(rùn)290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價(jià)格創(chuàng)新高 全天成交額達(dá)1.29億元
- 上半年生物藥大增45% 關(guān)鍵財(cái)務(wù)指標(biāo)好轉(zhuǎn)營(yíng)收賬款持續(xù)下降
- 亞太藥業(yè)向下修正可轉(zhuǎn)債價(jià)格 律師:索賠宜趁早
- 假期安全注意事項(xiàng)內(nèi)容圖片_假期安全注意事項(xiàng)內(nèi)容
- 香山股份:目前尚無(wú)詳細(xì)的市場(chǎng)份額數(shù)據(jù),更多詳情敬請(qǐng)留意公司官網(wǎng)及相關(guān)公告和定期報(bào)告
- 全球快看:秦安股份:4月3日公司高管劉宏慶減持公司股份合計(jì)1.16萬(wàn)股
- 保利發(fā)展:房地產(chǎn)持續(xù)向好的基本面沒(méi)有變
- 世界快資訊:越秀地產(chǎn)前三月銷售438億?同比上升217%
- 當(dāng)前聚焦:格力地產(chǎn):珠海國(guó)資委同意公司收購(gòu)免稅集團(tuán) 并募資不超70億元
- 天天觀點(diǎn):保利發(fā)展:公司負(fù)債率連續(xù)三年下降 繼續(xù)保持穩(wěn)健財(cái)務(wù)政策
- 保利發(fā)展:靈活安排推貨節(jié)奏?把握市場(chǎng)修復(fù)窗口
- 今日要聞!國(guó)家加強(qiáng)鐵礦石價(jià)格形勢(shì)分析研判和期現(xiàn)貨市場(chǎng)監(jiān)管
- 世界熱資訊!寶馨科技:目前公司懷遠(yuǎn)一期2GW異質(zhì)結(jié)電池及組件項(xiàng)目正在加速推進(jìn)中,預(yù)計(jì)年內(nèi)投產(chǎn)
- 天天觀點(diǎn):中交城投鄭州古滎城更項(xiàng)目獲得首筆融資
- 嶺南股份:公有云是云計(jì)算的主要形態(tài)。公司已與騰訊建立云計(jì)算、數(shù)字虛擬人、大數(shù)據(jù)等方面的戰(zhàn)略合作
- 世界短訊!西安土拍市場(chǎng)“活”了?
- 世界快報(bào):湖北襄陽(yáng)高新區(qū)2.08億售出65畝宅地 競(jìng)得者為本地房企
- 今日熱訊:協(xié)創(chuàng)數(shù)據(jù):公司存儲(chǔ)設(shè)備主要與聯(lián)想集團(tuán)合作
- 【全球播資訊】三代人七十余載接力守護(hù)156座抗美援朝烈士墓
- 全球觀天下!每日互動(dòng):AIGC和ChatGPT都是融合多種AI技術(shù)的成果
- 天天滾動(dòng):神州高鐵:截至2023年3月31日,公司股東人數(shù)為91207
- 【天天新要聞】昭衍新藥:股價(jià)走勢(shì)受多方面因素的影響,還請(qǐng)謹(jǐn)慎投資
- 世界滾動(dòng):財(cái)面兒丨建發(fā)國(guó)際:前3月權(quán)益銷售額353.4億元,同比增長(zhǎng)63.5%
- 全球?qū)崟r(shí):土地注冊(cè)處:香港3月樓宇買(mǎi)賣(mài)合約8599份 按年升124.6%
- 【天天新要聞】昆明公租房開(kāi)發(fā)公司最終發(fā)行6億 品種一利率6.5%、品種二未發(fā)行
- 全球觀點(diǎn):拼多多升級(jí)組織架構(gòu) 聯(lián)合創(chuàng)始人趙佳臻出任聯(lián)席CEO搭檔陳磊
- 上海3月新建商品住宅成交面積環(huán)比增長(zhǎng)94% 均價(jià)下跌2.8%
- 天天最資訊丨迪馬股份為江蘇2家子公司提供融資擔(dān)保 涉資8.04億元
- 滾動(dòng):狂飆910%!德國(guó)大儲(chǔ)市場(chǎng)崛起,戶儲(chǔ)地位岌岌可危?
- 新消息丨最新進(jìn)展!中科云網(wǎng)5GW TOPCON電池項(xiàng)目一期簽署建設(shè)施工合同
- 焦點(diǎn)信息:煤矸石綜合利用與礦山生態(tài)修復(fù)的戰(zhàn)略思考
- 環(huán)球觀熱點(diǎn):年產(chǎn)500萬(wàn)噸!全球規(guī)模最大光伏砂項(xiàng)目成功簽約
- 最大涉水750mm 北京越野BJ60新增車型上市售24.58萬(wàn)-27.68萬(wàn)元
- 【天天播資訊】晶硅組件有什么作用和特點(diǎn),有哪些種類?
- 環(huán)球旅訊+WiT新加坡主題沙龍開(kāi)場(chǎng)演講:你好,中國(guó)!
- 天天報(bào)道:新地University Hill料最快4月底開(kāi)售
- 環(huán)球速遞!萬(wàn)通發(fā)展:萬(wàn)通控股解質(zhì)押270萬(wàn)股股份 現(xiàn)持公司股份3.34億股
- 全球微動(dòng)態(tài)丨建發(fā)房地產(chǎn):10億元公司債券票面利率為4.25%
- 世界頭條:中核鈦白:公司第三期員工持股計(jì)劃并未在2023年3月14日進(jìn)行大宗交易
- 全球觀速訊丨祥生控股首季銷售額54.19億元 同比下滑38.73%
- 國(guó)際油價(jià)走強(qiáng),但多頭須警惕OPEC+最新減產(chǎn)的潛在負(fù)效用
- 恒基達(dá)鑫:公司始終密切關(guān)注橫琴粵澳深度合作區(qū)相關(guān)的措施和政策情況,望能充分利用和享受到政策帶來(lái)的紅利
- 當(dāng)前滾動(dòng):顧家家居:截至3月末累計(jì)回購(gòu)股份106.28萬(wàn)股 總代價(jià)4187.73萬(wàn)元
- 海新能科: 截至2023年03月31日,公司股東總?cè)藬?shù)為45,272名
- 中紅醫(yī)療:我國(guó)丁腈手套產(chǎn)品與馬來(lái)西亞相比有一定的成本優(yōu)勢(shì)
- 經(jīng)緯輝開(kāi):副董事長(zhǎng)擬減持公司不超0.39%股份
- 富力地產(chǎn):2022年度凈虧損157.79億元 預(yù)計(jì)今年可售貨值超1250億元
- 全球熱點(diǎn)!小摩增持萬(wàn)物云39.86萬(wàn)股 總金額約1406.76萬(wàn)港元
- 全球速訊:嶸泰股份:我公司上市公司同行有旭升集團(tuán)、愛(ài)柯迪、文燦股份等
- 新大正:正積極推進(jìn)收購(gòu)云南滄恒投資80%股權(quán) 尚存在不確定性
- 環(huán)球要聞:航天發(fā)展:截至2023年3月31日,航天發(fā)展股東戶數(shù)為179,101戶
- 當(dāng)前快播:NYMEX原油仍上看83.17美元
- 4月4日福晶科技漲停分析:3D感應(yīng),中科院系,光通信概念熱股
- 會(huì)德豐合作盤(pán)MIAMI QUAY I暫累售49伙 套現(xiàn)4.8億港元
- 環(huán)球速讀:“20綠城03”將于4月13日提前摘牌 發(fā)行金額為10億元
- 天天資訊:4月4日中儲(chǔ)股份漲停分析:央企改革,快遞物流,國(guó)企改革概念熱股
- 4月4日四川黃金漲停分析:黃金概念熱股
- 環(huán)球今日訊!信達(dá)證券發(fā)布金陵飯店研報(bào) 年報(bào)點(diǎn)評(píng):全年業(yè)績(jī)穩(wěn)中有增 布局中高端 注重品牌打造
- 焦點(diǎn)!學(xué)習(xí)心得怎么寫(xiě)?學(xué)習(xí)心得范本?
- 怎樣追女生?追女孩子的方法有哪些?
- 環(huán)球觀熱點(diǎn):仙劍奇?zhèn)b傳3有哪些歌曲?仙劍奇?zhèn)b傳3所有歌曲匯總?
- 合山市景點(diǎn)有哪些?合山市景點(diǎn)介紹?
- 每日短訊:降雨量50毫米是怎么計(jì)算的?降雨量50毫米的計(jì)算方法?
- 當(dāng)前資訊!生物圈2號(hào)為什么會(huì)失?。可锶Χ?hào)失敗的重要原因?
- 中青旅2022年?duì)I收64.17億元,旅行社業(yè)務(wù)虧損收窄
- 捷信金融怎樣貸款?捷信金融貸款條件有哪些?
- 環(huán)球熱議:lol英雄聯(lián)盟怎么觀戰(zhàn)?觀看別人的游戲戰(zhàn)斗方法?
- 每日看點(diǎn)!速干衣的特點(diǎn)有哪些?速干衣的主要功能是什么?
- 速訊:and1鞋子怎么樣?and1鞋子有哪些特點(diǎn)?
- 焦點(diǎn)簡(jiǎn)訊:北京:加大老舊平房院落、老舊小區(qū)、危舊樓房和簡(jiǎn)易樓等更新力度
- 世界熱文:常青股份:年報(bào)審計(jì)工作正在進(jìn)行中,年報(bào)將于2023年4月26日披露
- 天天最新:山西大同:住房公積金貸款最高額度提至100萬(wàn)元
- 環(huán)球今頭條!國(guó)際金價(jià)跌勢(shì)受限,美國(guó)數(shù)據(jù)再現(xiàn)疲軟,F(xiàn)ED鷹派呼聲難響
- 美原油交易策略:需求預(yù)期接力,油價(jià)或延續(xù)漲勢(shì)
- 環(huán)球新消息丨蘇泊爾擬分紅24.40億元 控股股東SEB國(guó)際或分得20.12億元
- 千方科技:公司未參與您所提及的業(yè)務(wù)
- 當(dāng)前快播:河南新鄉(xiāng):住房公積金最高貸款額度升至65萬(wàn)元
- 全球速讀:發(fā)改委:產(chǎn)業(yè)目錄引導(dǎo)橫琴加大對(duì)新興產(chǎn)業(yè)等的培育
- 焦點(diǎn)消息!年報(bào)橫評(píng)①|(zhì) 這些物企表現(xiàn)最好!五大指標(biāo)透視2022年指標(biāo)之最
- 世界焦點(diǎn)!醫(yī)貝云服銷售總監(jiān)陳小飛:醫(yī)貝云服伴隨著藥品和耗材供應(yīng)鏈改革而誕生
- 孕婦補(bǔ)鈣用金丐,早吃早手藝
- 環(huán)球新資訊:甘化科工:截至2023年3月31日,公司股東人數(shù)為27,947戶
- 天天動(dòng)態(tài):上海新華聯(lián)國(guó)際獨(dú)棟商墅第三次流拍 起始價(jià)1.29億元
- 焦點(diǎn)精選!明陽(yáng)智能:尊敬的公司公司對(duì)外信息披露均按照信息披露要求進(jìn)行
- 環(huán)球時(shí)訊:德恩精工子公司擬與億盛房地產(chǎn)合作開(kāi)發(fā)“濱江一號(hào)”項(xiàng)目 預(yù)計(jì)總投資約1.4億元
- 環(huán)球今日訊!二手房成交量“狂飆”,百城落地“帶押過(guò)戶”
- 環(huán)球焦點(diǎn)!國(guó)際金價(jià)短線下看1970美元
- 【天天熱聞】上海鋼聯(lián):根據(jù)創(chuàng)業(yè)板上市公司相關(guān)規(guī)則,創(chuàng)業(yè)板上市公司無(wú)需披露季度業(yè)績(jī)預(yù)告
- 非凡舞蹈學(xué)院創(chuàng)辦人Jamila 王海青,打破自我,永不設(shè)限!善濟(jì)有約
- 股票進(jìn)倉(cāng)是什么意思
- 云南省餐飲行業(yè)協(xié)會(huì)交流座談會(huì)在文山舉行
- “AI”拼才會(huì)贏?16只基金單日飆漲超7% 公募基金開(kāi)始密集大調(diào)倉(cāng)
- 三圍怎么量
- 當(dāng)前焦點(diǎn)!炒外匯為什么要拉人
- 用了“借錢(qián)三巨頭”之一的錢(qián)小樂(lè),真實(shí)感受:靠譜!
- 手機(jī)炒股票用什么軟件最好
- 全球信息:收購(gòu)瑞信后 瑞銀將取代摩根大通成為拉美最大財(cái)富管理公司
- 市場(chǎng)對(duì)黃金ETF和金幣的興趣激增,渣打稱這還只是開(kāi)始!
- 天天熱點(diǎn)!現(xiàn)貨黃金交易策略:美元仍存下行風(fēng)險(xiǎn),金價(jià)或震蕩上攻
- 對(duì)沖基金放棄看空押注,金銀正蓄勢(shì)待漲!
- 當(dāng)前播報(bào):長(zhǎng)春城投10億元私募債券項(xiàng)目狀態(tài)更新為“已反饋”
- 全球看點(diǎn):北京:土地出讓收入用于農(nóng)業(yè)農(nóng)村比例不低于7.5%
