javajvm,java jvm參數配置

本文目錄一覽:

java堆內存滿了jvm

可以適當調整-Xms和-Xmx兩個jvm參數。java堆內存滿了jvm可以適當調整-Xms和-Xmx兩個jvm參數,Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念。

jvm java jee是什麼呢?

1)jvm有很多種,其實jvm是一個標準,sun做的那個叫hotspot,作者就是後來v8的作者lars bak,其他公司也做過jvm,其中做得比較好的有bea的jrockit,其他的包括ibm的r9,apple的jvm等在內,都做得不行,所以jvm主要是整合淘汰掉這些做得不好的jvm(s),整合成一個統一的openjdk。

2)java是典型的oop語言,其執行效率的優化,最早就是lars bak等人從smalltalk等長期優化的經驗中總結出來並apply到hotspot上去滴,而smalltalk在早期apple機上搞出了那種拖拖拽拽就開發出app的做法,後來vc,delphi之類的其實都是抄襲或者說借鑒apple的smalltalk的做法,jobs說微軟從頭到尾都在抄襲apple是空穴來風,這裡空穴來風跟王垠使用的空穴來風是一個意思,有趣的是,java的gui並沒有繼承這種搞法,反而對這種拖拖拽拽就作出app的做法批判有加,到今天,其實java的gui都還不能真正做到拖拖拽拽就作出來,問題很多,個人建議對於純java的gui開發,還是以寫代碼為主。

3)jee也是一個或者說是一堆標準,知乎上有些人把maven,jenkins都算做jee是不對滴,jee的標準核心是ejb,其實就是一個xml配置化的java文件,這個標準在4的時候,達到了頂峰狀態,幾乎所有的挨踢大廠都主動支持該標準,之後開始走下坡路,支持的廠越來越少。

4)java和javascript的關係比很多人認為的要密切,javascript裡面的java這四個字母可不是白叫的,比如js的版權和商標都控制在oracle手裡,oracle對於js的支持甚至超過其對java的支持,並且喜歡捆綁銷售,比如jvm裡面就有一個js引擎。

5)jvm裡面除了js engine以外還有一個瀏覽器排版引擎webkit,就是apple safari和google chrome用的那個那個。

6)java支持絕大多數腳本語言,你能叫得上名字的腳本語言,幾乎都可以在jvm上執行,比如常見的js,ruby,python,甚至php,lua,只不過除了js以外你需要找到相關的腳本引擎。

7)spring的版權被控制在vmware手裡,其實spring的那一大堆東西,本質上是一個非標準的jee實現,比如在jee裡面用的inject,在spring裡面就是autowire,當然spring曾經深刻滴影響了jee,所以有些東西比如di標準,是spring影響下制定出來的,所以spring的做法會比較特例一點。

8)maven上的jars數量前兩天突破800萬,其他語言的類庫,排名第二的是npm,大概數量是maven的十分之一,也就是幾十萬,不知道現在突破100萬沒有,然後是gem,也就是ruby那個,大概是十幾萬,下來是python的module,大概數量級是幾萬,沒突破十萬。

9)java的標準是由一個叫做jcp的組織制定的,所有標準需要經過jcp的執行委員會通過方可執行,jcp幾乎包括了你所知道的絕大多數知名挨踢公司和組織,比如google,apple,ibm,intel,arm,red hat,twitter等,還有一些教育機構,比如我國的北京大學,阿里最近一次申請jcp執行委員會成員資格,似乎投票不通過,最近一次執行委員會新增兩個成員是arm和jetbrains。

10)微軟也曾經是jcp甚至是java的主要貢獻者,但是利益驅使下,想擴展java,從而破壞java跨平台的特性,所以跟sun鬧翻,其本質原因就是想讓客戶寫的java代碼跟windows綁定,sun堅決不同意,鬧翻,今天回頭看這個結果,只能說:雙輸,sun掛了,微軟的ria也離掛不太遠了,silverlight已經放棄了,比起當年ie自帶有jvm的支持來說,那完全就是兩回事。

11)除了微軟以外,jcp還缺少一個重要組織apache,因為apache跟oracle也鬧翻了,oracle似乎並不在乎開源組織,而更在意商業公司的支持。

12)java曾經有一個內置的數據庫,9之後被剝離。

13)j2me是j2se的子集。

14)vert.x作者tim fox最早在vmware做spring時候看到了node.js,萌生出了製作支持多核的node.x的想法,並在離開vmware後加入red hat將其實現,vmware看到後開始耍無賴,claim node.x後來改叫vert.x的版權,不惜跟red hat打官司,後來各方妥協,將其交給eclipse foundation。

15)oracle在收購bea之前,一開始的目標並不是bea和bea的weblogic,而是jboss,但是jboss表現出了極為有種的一面,在oracle收購成功之前,投入了red hat的懷抱,因為都是開源組織,從此jboss成了red hat的一個子部門,oracle收購jboss失敗之後,轉向bea,庄思浩氣死了,但是沒用,最後還是被惡意收購。

16)sun在玩不下去之前最早嘗試接觸的目標是ibm,ibm嫌太貴,放棄之後,被轉手給了oracle。(Java學習交流QQ群:589809992 我們一起學Java!)

17)vert.x的作者tim fox在離開red hat之前曾經發過twitter抱怨,外人比如我們,猜測是因為red hat內部已經有了一個jboss,所以跟vert.x在應用上有了重疊,所以導致tim fox的出走,但是出走之後,red hat答應對vert.x做持續性的戰略投入,所以vert.x core的幾個developers,其實拿的是red hat的工資,但是vert.x的版權並不在red hat手裡,而在eclipse foundation手裡。

18)vert.x的幾個核心開發人員都是google summer of code的導師,每年年初時候會招收在校大學生搞項目。

19)教育機構相關:scala的作者馬丁是德國人,eth的博導,groovy的主要領導人是法國人,jruby背後是東京大學,jboss的作者是法國大學校x的校友,x就是伽羅瓦考不進去的那所大學,伽羅瓦進不了x,所以改讀巴黎高師,tim fox畢業於帝國理工,主席去的那個,netty作者trustin lee是acm銀牌,現在line工作,畢業於sky裡面的延世大學,kotlin是毛子公司jetbrains的作品,看linkedin,很多人畢業自聖彼得堡大學,spring作者rod johnson是悉尼大學的音樂博士,hibernate作者gavin king是澳洲莫那什大學的數學本科畢業生,james gosling這種cmu和calgory的估計爛大街了,sun是斯坦福大學網絡的意思,夾帶兩個私貨,aspectj有一個維護小組在mcgill,hbase跟waterloo關係密切。

20)java早期被人認為慢,跟java堅持不用硬件加速渲染有關,死活就是不肯接入directx和opengl,7之後總算開竅,搞了一個圖形引擎接入了directx/opengl。

21)casssandra是facebook做失敗的項目,被貢獻給了apache之後老樹開花。

22)groovy被貢獻給了apache,現在叫做apache groovy,ceylon被貢獻給了eclipse,現在叫做eclipse ceylon。

23)netflix現在是java shop,之前是用.net的。

先想到這麼多,有空再寫。

java中jvm在哪?是包含在jdk裡面嗎?

簡單來說Sun

java提供的JDK中包含有JVM,是其中的一個組成部分,更詳細的看下面:

———————————-

操作系統裝入jvm是通過jdk中java.exe來完成,通過下面4步來完成jvm環境.

1.創建jvm裝載環境和配置

2.裝載jvm.dll

3.初始化jvm.dll並掛界到JNIENV(JNI調用接口)實例

4.調用JNIEnv實例裝載並處理class類。

在我們運行和調試java程序的時候,經常會提到一個jvm的概念.jvm是java程序運行的環境,但是他同時一個操作系統的一個應用程序一個進程,因此他也有他自己的運行的生命周期,也有自己的代碼和數據空間.

首先來說一下jdk這個東西,不管你是初學者還是高手,是j2ee程序員還是j2se程序員,jdk總是在幫我們做一些事情.我們在了解java之前首先大師們會給我們提供說jdk這個東西.它在java整個體系中充當著什麼角色呢?我很驚嘆sun大師們設計天才,能把一個如此完整的體系結構化的如此完美.jdk在這個體系中充當一個生產加工中心,產生所有的數據輸出,是所有指令和戰略的執行中心.本身它提供了java的完整方案,可以開發目前java能支持的所有應用和系統程序.這裡說一個問題,大家會問,那為什麼還有j2me,j2ee這些東西,這兩個東西目的很簡單,分別用來簡化各自領域內的開發和構建過程.jdk除了jvm之外,還有一些核心的API,集成API,用戶工具,開發技術,開發工具和API等組成

好了,廢話說了那麼多,來點於主題相關的東西吧.jvm在整個jdk中處於最底層,負責於操作系統的交互,用來屏蔽操作系統環境,提供一個完整的java運行環境,因此也就虛擬計算機.

操作系統裝入jvm是通過jdk中java.exe來完成,通過下面4步來完成jvm環境.

1.創建jvm裝載環境和配置

2.裝載jvm.dll

3.初始化jvm.dll並掛界到JNIENV(JNI調用接口)實例

4.調用JNIEnv實例裝載並處理class類。

一.jvm裝入環境,jvm提供的方式是操作系統的動態連接文件.既然是文件那就一個裝入路徑的問題,java是怎麼找這個路徑的呢?當你在調用java

test的時候,操作系統會在path下在你的java.exe程序,java.exe就通過下面一個過程來確定jvm的路徑和相關的參數配置了.下面基於windows的實現的分析.

首先查找jre路徑,java是通過GetApplicationHome

api來獲得當前的java.exe絕對路徑,c:\j2sdk1.4.2_09\bin\java.exe,那麼它會截取到絕對路徑c:\j2sdk1.4.2_09\,判斷c:\j2sdk1.4.2_09\bin\java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作為jre路徑,如果不存在則判斷c:\j2sdk1.4.2_09\jre\bin\java.dll是否存在,如果存在這c:\j2sdk1.4.2_09\jre作為jre路徑.如果不存在調用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java

Runtime

Environment\“當前JRE版本號”\JavaHome的路徑為jre路徑。

然後裝載jvm.cfg文件JRE路徑+\lib+\ARCH(CPU構架)+\jvm.cfgARCH(CPU構架)的判斷是通過java_md.c中GetArch函數判斷的,該函數中windows平台只有兩種情況:WIN64的‘ia64’,其他情況都為‘i386’。以我的為例:C:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg.主要的內容如下:

-client

KNOWN

-server

KNOWN

-hotspot

ALIASED_TO

-client

-classic

WARN

-native

ERROR

-green

ERROR

在我們的jdk目錄中jre\bin\server和jre\bin\client都有jvm.dll文件存在,而java正是通過jvm.cfg配置文件來管理這些不同版本的jvm.dll的.通過文件我們可以定義目前jdk中支持那些jvm,前面部分(client)是jvm名稱,後面是參數,KNOWN表示jvm存在,ALIASED_TO表示給別的jvm取一個別名,WARN表示不存在時找一個jvm替代,ERROR表示不存在拋出異常.在運行java

XXX是,java.exe會通過CheckJvmType來檢查當前的jvm類型,java可以通過兩種參數的方式來指定具體的jvm類型,一種按照jvm.cfg文件中的jvm名稱指定,第二種方法是直接指定,它們執行的方法分別是“java

-J”、“java

-XXaltjvm=”或“java

-J-XXaltjvm=”。如果是第一種參數傳遞方式,CheckJvmType函數會取參數‘-J’後面的jvm名稱,然後從已知的jvm配置參數中查找如果找到同名的則去掉該jvm名稱前的‘-’直接返回該值;而第二種方法,會直接返回“-XXaltjvm=”或“-J-XXaltjvm=”後面的jvm類型名稱;如果在運行java時未指定上面兩種方法中的任一一種參數,CheckJvmType會取配置文件中第一個配置中的jvm名稱,去掉名稱前面的‘-’返回該值。CheckJvmType函數的這個返回值會在下面的函數中匯同jre路徑組合成jvm.dll的絕對路徑。如果沒有指定這會使用jvm.cfg中第一個定義的jvm.可以通過set

_JAVA_LAUNCHER_DEBUG=1在控制台上測試.

最後獲得jvm.dll的路徑,JRE路徑+\bin+\jvm類型字符串+\jvm.dll就是jvm的文件路徑了,但是如果在調用java程序時用-XXaltjvm=參數指定的路徑path,就直接用path+\jvm.dll文件做為jvm.dll的文件路徑.

二:裝載jvm.dll

通過第一步已經找到了jvm的路徑,java通過LoadJavaVM來裝入jvm.dll文件.裝入工作很簡單就是調用windows

API函數:

LoadLibrary裝載jvm.dll動態連接庫.然後把jvm.dll中的導出函數JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs掛接到InvocationFunctions變量的CreateJavaVM和GetDefaultJavaVMInitArgs函數指針變量上。jvm.dll的裝載工作宣告完成。

三:初始化jvm,獲得本地調用接口,這樣就可以在java中調用jvm的函數了.調用InvocationFunctions-CreateJavaVM也就是jvm中JNI_CreateJavaVM方法獲得JNIEnv結構的實例.

四:運行java程序.

java程序有兩種方式一種是jar包,一種是class.

運行jar,java

-jar

XXX.jar運行的時候,java.exe調用GetMainClassName函數,該函數先獲得JNIEnv實例然後調用java類java.util.jar.JarFileJNIEnv中方法getManifest()並從返回的Manifest對象中取getAttributes(“Main-Class”)的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主類名作為運行的主類。之後main函數會調用java.c中LoadClass方法裝載該主類(使用JNIEnv實例的FindClass)。main函數直接調用java.c中LoadClass方法裝載該類。如果是執行class方法。main函數直接調用java.c中LoadClass方法裝載該類。

然後main函數調用JNIEnv實例的GetStaticMethodID方法查找裝載的class主類中

“public

static

void

main(String[]

args)”方法,並判斷該方法是否為public方法,然後調用JNIEnv實例的

CallStaticVoidMethod方法調用該java類的main方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/191922.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 15:13
下一篇 2024-11-30 15:13

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • 三星內存條參數用法介紹

    本文將詳細解釋三星內存條上面的各種參數,讓你更好地了解內存條並選擇適合自己的一款。 一、容量大小 容量大小是內存條最基本的參數,一般以GB為單位表示,常見的有2GB、4GB、8GB…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論