1. 程式人生 > >Groovy內存機制詳解

Groovy內存機制詳解

腳本類 roo ade shel ssp 對象 inner 使用 三方

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類型的引用返回出來。

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

Groovy內存機制詳解