試試修改sqldeveloper\sqldeveloper\bin\sqldeveloper.conf文件中的SetJavaHome 為你想要修改的javaHome
創(chuàng)新新互聯(lián),憑借10年的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有上千案例。做網(wǎng)站建設(shè),選成都創(chuàng)新互聯(lián)公司。
JAVACORE與HEAPDUMP生成大法 原創(chuàng)
2016-11-01 10:52:41
5點(diǎn)贊
Z.Virgil
碼齡10年
關(guān)注
Windows平臺(tái):
ORACLE JDK:HOTSPOT
IBM JDK:V9
目錄
前言
JAVACORE篇:
Windows平臺(tái):
ORACLE JDK:HOTSPOT
IBM JDK:V9
LINUX平臺(tái):
HEAPDUMP篇:
LINUX平臺(tái):
前言
在項(xiàng)目上我們經(jīng)常要生成javacore和heapdump來進(jìn)行分析。這里總結(jié)一下我自己在項(xiàng)目上生成這兩個(gè)文件的方法。
JAVACORE篇:
JavaCore文件主要保存的是Java應(yīng)用各線程在某一時(shí)刻的運(yùn)行的位置,即JVM執(zhí)行到哪一個(gè)類、哪一個(gè)方法、哪一個(gè)行上。它是一個(gè)文本文件,打開后可以看到每一個(gè)線程的執(zhí)行棧,以stack trace的顯示。
通過對(duì)JavaCore文件的分析可以得到應(yīng)用是否“卡”在某一點(diǎn)上,即在某一點(diǎn)運(yùn)行的時(shí)間太長(zhǎng),例如數(shù)據(jù)庫(kù)查詢,長(zhǎng)期得不到響應(yīng),最終導(dǎo)致系統(tǒng)崩潰等情況。
Windows平臺(tái):
ORACLE JDK:HOTSPOT
1.jvisualvm工具
jvisualvm是sun的JDK中自帶的工具,在java_home/bin/jvisualvm.exe中就可以打開。
掛在到對(duì)應(yīng)的java進(jìn)程后,可以直接生javacore。
2.jstack工具
jstack為JDK自帶的命令行工具。
其中-l -r 可以顯示出詳細(xì)信息,鎖信息等。
3.sendsignal工具
sendsignal工具是老外開發(fā)的一個(gè)小工具,用來生成已知進(jìn)程號(hào)的java進(jìn)程的javacore。
附件中有具體工具。通過sendsignal.exe pid即可生成。
4.ctrl+break按鍵
在Windows上啟動(dòng)程序的時(shí)候,可以直接在啟動(dòng)進(jìn)程的窗口按組合鍵生成javacore。
然而由于NC涉及到兩個(gè)java進(jìn)程,一個(gè)小的導(dǎo)程序,一個(gè)是正式的程序。
所以用該方法只能生成引導(dǎo)程序的javacore??床坏缴a(chǎn)環(huán)境的實(shí)際快照。
你還在使用Java 8么,使用的又是Oracle JDK 8么?
如果這兩個(gè)答案的回答都是肯定的,那接下來我要說的就對(duì)你是非常有幫助的信息了。
其實(shí)直白點(diǎn)說就是以下兩點(diǎn):
上述兩點(diǎn),任意一點(diǎn)存在問題,那都意味著你都可能得做出改變以應(yīng)對(duì)可能的風(fēng)險(xiǎn)。
Oracle在2019年4月的時(shí)候,對(duì)Oracle JDK的License做了一次變更。
后續(xù),由于爭(zhēng)議過大,Java SE 17及以后的JDK版本,又變更為Oracle No-Fee Terms and Conditions License協(xié)議了。
好吧,也許有點(diǎn)復(fù)雜,你會(huì)覺得非常繞。
簡(jiǎn)單點(diǎn)說,大致就是:
這樣是不是比較容易理解了。
好,有什么影響?
這篇文章只討論Java SE 8,不討論Java SE 11及Java SE 17這兩個(gè)LTS版本。因?yàn)橄嘈艊?guó)內(nèi)還有相當(dāng)一部分在使用Java SE 8.
對(duì)于使用Oracle Java SE 8的項(xiàng)目來說,通常有以下幾種選擇
如果你仍在使用Java SE 8u202或之前的版本,那可以放心的一點(diǎn)是,你不用擔(dān)心需要為此付費(fèi)的事情。你仍然可以免費(fèi)使用這個(gè)版本。
但問題隨之而來,你將不再獲取到安全補(bǔ)丁更新了。
對(duì)于一個(gè)仍然需要繼續(xù)開發(fā)與維護(hù)的項(xiàng)目來說,沒有安全補(bǔ)丁更新是否是你能接受的一件事情,這是你做為技術(shù)負(fù)責(zé)人要慎重對(duì)待的一件事情。
如果你把安全看的非常重要,那選擇付費(fèi)來使用Java SE 8u211及之后的SE 8版本,是個(gè)不錯(cuò)的選擇。
這仍然是個(gè)值得考慮的選擇,因?yàn)閷?duì)很多項(xiàng)目來說,相比更換其它JDK或升級(jí)至11,17等方案來說,也許付費(fèi)是更廉價(jià)的方案。
還有沒有其它選擇?
當(dāng)然還是有的,以下也是你可以考慮的選擇之一。
上述的版權(quán)限制,都是針對(duì)Oracle JDK而言的,但JDK并不只有Oracle JDK,還有其它很多不同的JDK可供你選擇。
比如,你一定知道的 OpenJDK ,它是一個(gè)完全開源免費(fèi)的版本,你不需要為使用OpenJDK付費(fèi)。
由于Oracle在19年4月的這個(gè)改變,在業(yè)界造成了很大的爭(zhēng)議,許多團(tuán)隊(duì)已經(jīng)遷移至使用OpenJDK了,OpenJDK的使用占比已經(jīng)高于Oracle JDK了
其實(shí),不只是OpenJDK,許多大公司基于OpenJDK都發(fā)行與維護(hù)著自己的JDK,列舉一些如下:
等,這個(gè)列表其實(shí)可以很長(zhǎng)。這些JDK發(fā)行版本都是由一些大公司基于OpenJDK構(gòu)建的,也都是開源的,并且提供了一定的支持時(shí)間。
但很多Java程序員會(huì)疑問,OpenJDK與Oracle JDK究竟有什么區(qū)別,這些不同的OpenJDK發(fā)行版本是否可靠?
關(guān)于OpenJDK與Oracle JDK的區(qū)別,后續(xù)我單獨(dú)再聊一下這個(gè)話題。
現(xiàn)在OpenJDK與Oracle JDK的代碼幾乎完全一樣,所以可靠性是完全不用擔(dān)心的,而顯而易見的一個(gè)事實(shí)是,大公司自己都在用自己的發(fā)行版本,能不可靠?
如果你確實(shí)特別喜歡Oracle JDK,或只信任它。在不付費(fèi)又想要有安全補(bǔ)丁的前提下,你仍然可以選擇使用Oracle JDK 17.
Oracle JDK 17是基于Oracle No-Fee Terms and Conditions License協(xié)議,無論是個(gè)人或是商用,都可以無償使用,只是有一定的時(shí)間限制。
Oracle宣稱,這是在它們聽到企業(yè)的期望之后做出的改變,因?yàn)榇蠖鄶?shù)企業(yè)仍然期望使用Oracle JDK。
最后,說一下關(guān)于Java SE 8的問題。
做為一個(gè)架構(gòu)師,你需要明白一點(diǎn):
不使用Java SE 8,并不是一個(gè)你可以選擇的事情,它只是一個(gè)時(shí)間問題
無論你有多少理由或困難在前,讓你想繼續(xù)使用Java SE 8,你要明白,Java SE 8終有告別的一天,它只是一個(gè)時(shí)間上的問題。
1、首先,下載JDK安裝包,到oracle官首頁(yè)進(jìn)行下載,點(diǎn)左邊的Java Platform (JDK1.5) 7u51進(jìn)入下一個(gè)下載頁(yè)面.
2、點(diǎn)左邊的Accept License Agreement,接受許可協(xié)議,方能下載,由于我裝的WIN7 64位系統(tǒng),所以選對(duì)應(yīng)的64位安裝包
3、Windows x64?對(duì)應(yīng)的?jdk-7u51-windows-x64.exe?下載,
4、下載完安裝,習(xí)慣把軟件裝到D盤,各位可根據(jù)自己習(xí)慣改存放位置
oracle8i中為jdk1.2,
oracle9i中為jdk1.3,
oracle10g中為jdk1.4
如果你不相信可以去看系統(tǒng)“環(huán)境變量”中的path,因?yàn)閛racle安裝后會(huì)自動(dòng)將其默認(rèn)的jre路徑寫入path變量。
首先要先明確之間,以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等項(xiàng)目之間是什么關(guān)系,這有助于確定接下來編譯要使用的JDK版本和源碼分支。
從前面介紹的Java發(fā)展史中我們了解到OpenJDK是Sun在2006年末把Java開源而形成的項(xiàng)目,這里的“開源”是通常意義上的源碼開放形式,即源碼是可被復(fù)用的,例如IcedTea、UltraViolet都是從OpenJDK源碼衍生出的發(fā)行版。但如果僅從“開源”字面意義(開放可閱讀的源碼)上看,其實(shí)Sun自JDK 1.5之后就開始以Java Research License(JRL)的形式公布過Java源碼,主要用于研究人員閱讀(JRL許可證的開放源碼至JDK 1.6 Update 23為止)。把這些JRL許可證形式的Sun/OracleJDK源碼和對(duì)應(yīng)版本的OpenJDK源碼進(jìn)行比較,發(fā)現(xiàn)除了文件頭的版權(quán)注釋之外,其余代碼基本上都是相同的,只有字體渲染部分存在一點(diǎn)差異,Oracle JDK采用了商業(yè)實(shí)現(xiàn),而OpenJDK使用的是開源的FreeType。當(dāng)然,“相同”是建立在兩者共有的組件基礎(chǔ)上的,Oracle JDK中還會(huì)存在一些Open JDK沒有的、商用閉源的功能,例如從JRockit移植改造而來的Java Flight Recorder。預(yù)計(jì)以后JRockit的MissionControl移植到HotSpot之后,也會(huì)以O(shè)racle JDK專有、閉源的形式提供。
Oracle的項(xiàng)目發(fā)布經(jīng)理Joe Darcy在OSCON 2011上對(duì)兩者關(guān)系的介紹也證實(shí)了OpenJDK 7和Oracle JDK 7在程序上是非常接近的,兩者共用了大量相同的代碼(如下圖,注意圖中提示了兩者共同代碼的占比要遠(yuǎn)高于圖形上看到的比例),所以我們編譯的OpenJDK,基本上可以認(rèn)為性能、功能和執(zhí)行邏輯上都和官方的Oracle JDK是一致的。
Dalvik 與java虛擬機(jī):
1.java虛擬機(jī)基于棧。 基于棧的機(jī)器必須使用指令來載入和操作棧上數(shù)據(jù),所需指令更多更多 .
而dalvik虛擬機(jī)是基于寄存器的:java虛擬機(jī)運(yùn)行的是java字節(jié)碼。
(java類會(huì)被編譯成一個(gè)或多個(gè)字節(jié)碼.class文件,打包到.jar文件中,java虛擬機(jī)從相應(yīng)的.class文件和.jar文件中獲取相應(yīng)的字節(jié)碼)2.Dalvik和Java之間的另外一大區(qū)別就是運(yùn)行環(huán)境——Dalvik經(jīng)過優(yōu)化,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例OpenJDK :
[root@localhost ~]# java -version
java version "1.6.0_39"
OpenJDK Runtime Environment (IcedTea6 1.13.11) (rhel-1.13.11.0.el5_11-x86_64)OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)oracle jdk:
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)OpenJDK下載:
8:yum install java-1.8.0-openjdk
JDK 7:
yum install java-1.7.0-openjdk
JDK 6:yum install java-1.6.0-openjdk
1. HotSpot歷史
SUN的JDK版本從1.3.1開始運(yùn)用HotSpot虛擬機(jī), 2006年底開源,主要使用C++實(shí)現(xiàn),JNI接口部分用C實(shí)現(xiàn)。
HotSpot是較新的Java虛擬機(jī),用來代替JIT(Just in Time),可以大大提高Java運(yùn)行的性能。
Java原先是把源代碼編譯為字節(jié)碼在虛擬機(jī)執(zhí)行,這樣執(zhí)行速度較慢。而HotSpot將常用的部分代碼編譯為本地(原生,native)代碼,這樣顯著提高了性能。
HotSpot JVM 參數(shù)可以分為規(guī)則參數(shù)(standard options)和非規(guī)則參數(shù)(non-standard options)。
規(guī)則參數(shù)相對(duì)穩(wěn)定,在JDK未來的版本里不會(huì)有太大的改動(dòng)。
非規(guī)則參數(shù)則有因升級(jí)JDK而改動(dòng)的可能。
規(guī)則和非規(guī)則參數(shù)這里不做介紹了,網(wǎng)上資料很多。
2.HotSpot基礎(chǔ)知識(shí)
HotSpot包括一個(gè)解釋器和兩個(gè)編譯器(client 和 server,二選一的),解釋與編譯混合執(zhí)行模式,默認(rèn)啟動(dòng)解釋執(zhí)行。
編譯器:java源代碼被編譯器編譯成class文件(字節(jié)碼),java字節(jié)碼在運(yùn)行時(shí)可以被動(dòng)態(tài)編譯(JIT)成本地代碼(前提是解釋與編譯混合執(zhí)行模式且虛擬機(jī)不是剛啟動(dòng)時(shí))。
解釋器: 解釋器用來解釋class文件(字節(jié)碼),java是解釋語(yǔ)言(書上這么說的)。
server啟動(dòng)慢,占用內(nèi)存多,執(zhí)行效率高,適用于服務(wù)器端應(yīng)用;client啟動(dòng)快,占用內(nèi)存小,執(zhí)行效率沒有server快,默認(rèn)情況下不進(jìn)行動(dòng)態(tài)編譯,適用于桌面應(yīng)用程序。
由-XX:+RewriteFrequentPairs參數(shù)控制 client模式默認(rèn)關(guān)閉,server模式默認(rèn)開啟在jre安裝目錄下的lib/i386/jvm.cfg 文件下。
java -version
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)mixed mode 解釋與編譯 混合的執(zhí)行模式 默認(rèn)使用這種模式j(luò)ava -Xint -version
Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)interpreted 純解釋模式 禁用JIT編譯
java -Xcomp -version
Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)compiled 純編譯模式(如果方法無法編譯,則回退到解釋模式執(zhí)行無法編譯的方法)3.動(dòng)態(tài)編譯
動(dòng)態(tài)編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個(gè)意思。
HotSpot對(duì)bytecode的編譯不是在程序運(yùn)行前編譯的,而是在程序運(yùn)行過程中編譯的。
HotSpot里運(yùn)行著一個(gè)監(jiān)視器(Profile Monitor),用來監(jiān)視程序的運(yùn)行狀況。
java字節(jié)碼(class文件)是以解釋的方式被加載到虛擬機(jī)中(默認(rèn)啟動(dòng)時(shí)解釋執(zhí)行)。 程序運(yùn)行過程中,那一部分運(yùn)用頻率大,那些對(duì)程序的性能影響重要。對(duì)程序運(yùn)行效率影響大的代碼,稱為熱點(diǎn)(hotspot),HotSpot會(huì)把這些熱點(diǎn)動(dòng)態(tài)地編譯成機(jī)器碼(native code),同時(shí)對(duì)機(jī)器碼進(jìn)行優(yōu)化,從而提高運(yùn)行效率。對(duì)那些較少運(yùn)行的代碼,HotSpot就不會(huì)把他們編譯。
HotSpot對(duì)字節(jié)碼有三層處理:不編譯(字節(jié)碼加載到虛擬機(jī)中時(shí)的狀態(tài)。也就是當(dāng)虛擬機(jī)執(zhí)行的時(shí)候再編譯),編譯(把字節(jié)碼編譯成本地代碼。虛擬機(jī)執(zhí)行的時(shí)候已經(jīng)編譯好了,不要再編譯了),編譯并優(yōu)化(不但把字節(jié)碼編譯成本地代碼,而且還進(jìn)行了優(yōu)化)。
至于那些程序那些不編譯,那些編譯,那些優(yōu)化,則是由監(jiān)視器(Profile Monitor)決定。
4.為什么不靜態(tài)編譯那?
為什么字節(jié)碼在裝載到虛擬機(jī)之前就編譯成本地代碼那?
動(dòng)態(tài)編譯器也在許多方面比靜態(tài)編譯器優(yōu)越。靜態(tài)編譯器通常很難準(zhǔn)確預(yù)知程序運(yùn)行過程中究竟什么部分最需要優(yōu)化。
函數(shù)調(diào)用都是很浪費(fèi)系統(tǒng)時(shí)間的,因?yàn)橛性S多進(jìn)棧出棧操作。因此有一種優(yōu)化辦法,就是把原來的函數(shù)調(diào)用,通過編譯器的編譯,改成非函數(shù)調(diào)用,把函數(shù)代碼直接嵌到調(diào)用出,變成順序執(zhí)行。
面向?qū)ο蟮恼Z(yǔ)言支持多態(tài),靜態(tài)編譯無效確定程序調(diào)用哪個(gè)方法,因?yàn)槎鄳B(tài)是在程序運(yùn)行中確定調(diào)用哪個(gè)方法。
jdk 1.9 等價(jià)JDK9 J2SE9 JAVA9
jdk 1.8 等價(jià)JDK8 J2SE8 JAVA8
jdk 1.7 等價(jià)JDK7 J2SE7 JAVA7
jdk 1.6 等價(jià)JDK6 J2SE6 JAVA6
jdk 1.5 等價(jià)JDK5 J2SE5 JAVA5
jdk 1.4 等價(jià)J2SE1.4
jdk 1.3 等價(jià)J2SE1.3
jdk 1.2 等價(jià)J2SE1.2
jdk 1.1
openjdk源碼下載:
Oracle JDK只發(fā)布二進(jìn)制安裝包,而OpenJDK只發(fā)布源碼復(fù)制代碼
獲取OpenJDK源碼有兩種方式:
第一種方式:
下載OpenJDK7u的源代碼:
hg clone jdk7u-dev
chmod 755 get_source.sh
./get_source.sh
下載OpenJDK8u的源代碼:
hg clone jdk8u-dev
./get_source.sh
注意:這是最直接的方式,從版本管理中看變更軌跡比看Release Note效果更好。但不足之處是速度太慢,雖然代碼總?cè)萘恐挥?00 MB左右,但是文件數(shù)量太多,在筆者的網(wǎng)絡(luò)下全部復(fù)制到本地需要數(shù)小時(shí)。
第二種方式,即直接下載官方打包好的源碼包
讀者可以從Source Bundle Releases頁(yè)面(地址:)取得打包好的源碼,到本地直接解壓即可。
一般來說,源碼包大概一至兩個(gè)月左右會(huì)更新一次,雖然不夠及時(shí),但比起從Mercurial復(fù)制代碼的確方便和快捷許多。
筆者下載的是OpenJDK 7 Update 6 Build b21版源碼包,2012年8月28日發(fā)布,大概99MB,解壓后約為339MB。
備注:推薦在linux平臺(tái)或者mac平臺(tái)上面編譯jdk
當(dāng)前標(biāo)題:oracle的jdk如何,oracle jdk是什么意思
地址分享:http://jinyejixie.com/article10/hopddo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、關(guān)鍵詞優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、域名注冊(cè)、網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)