Groovy內存機制詳解


groovy每執行一次腳本,都會生成一個腳本的class對象,並new一個InnerLoader去加載這個對象。

所有的腳本都是由GroovyClassLoader加載的,每次加載腳本都會生成一個新的InnerLoader去加載腳本。

Groovy會把腳本編譯為一個名為Scriptxx的類,這個腳本類運行時用反射生成一個實例並調用它的MAIN函數執行。

每次groovy編譯腳本后,都會緩存該腳本的Class對象,下次編譯該腳本時,會優先從緩存中讀取。

緩存的Map由GroovyClassLoader持有,key是腳本的類名,而腳本的類名在不同的編譯場景下(從文件讀取腳本/從流讀取腳本/從字符串讀取腳本)其命名規則不同。比如:

"script" + System.currentTimeMillis() + Math.abs(text.hashCode()) + ".groovy"。

ClassLoader對於同一個名字的類只能加載一次,如果都由GroovyClassLoader加載,那么當一個腳本里定義了C這個類之后,另外一個腳本再定義一個C類的話,GroovyClassLoader就無法加載了。

Java的classpath中只包含了Groovy的jar包,而不包含Groovy依賴的第三方jar包,而Groovy的classpath則包含了Groovy以及其依賴的所有第三方jar包。

RootLoader:管理了Groovy的classpath,負責加載Groovy及其依賴的第三方庫中的類,它不是使用雙親委派模型。

GroovyClassLoader主要負責在運行時編譯groovy源代碼為Class的工作,從而使Groovy實現了將groovy源代碼動態加載為Class的功能。 

GroovyClassLoader.InnerLoader:Groovy腳本類的直接ClassLoader,它將加載工作委派給GroovyClassLoader,它的存在是為了支持不同源碼里使用相同的類名,以及加載的類能順利被GC。

GroovyShell.parse()內部其實也就是調用GroovyClassLoader.parseClass()去解析Groovy腳本並生成Class實例(會是groovy.lang.Script的子類),然后調用Class.newInstance()構造出一個新的實例以Script類型的引用返回出來。

 

自己的學習總結,謝謝觀看!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM