2012-06-22 60 views
0

說明:的JRuby的PermGen的空間不足,即使在Ruby代碼使用Java對象

如果我們使用Java對象的JRuby得到的PermGen太:

System.out.println("Initialazing.."); 
//Spring applicaton context 
WebApplicationContext wac = (WebApplicationContext) AppContext.getApplicationContext(); 
// prepare path to internal ruby 
String scriptsPath = wac.getServletContext().getRealPath(RUBY_PATH); 
String jrubyHome = wac.getServletContext().getRealPath("WEB-INF" + File.separator +  "jruby"); 
// Initializing Scripting container 
ScriptingContainer container = new ScriptingContainer(isShared ?  LocalContextScope.SINGLETHREAD 
      : LocalContextScope.THREADSAFE, LocalVariableBehavior.PERSISTENT); 
// Configuring scriptingcontainer to avoid memory leaks 
container.setCompileMode(RubyInstanceConfig.CompileMode.OFF); 
System.setProperty("org.jruby.embed.compilemode", "OFF"); 
System.setProperty("jruby.compile.mode", "OFF"); 
// Setup ruby version 
container.setCompatVersion(CompatVersion.RUBY1_9); 
// Set jruby home 
container.getProvider().getRubyInstanceConfig().setJRubyHome(jrubyHome); 
List<String> loadPaths = new ArrayList<String>(); 
// load path 
loadPaths.add(scriptsPath); 
container.getProvider().setLoadPaths(loadPaths); 
// ruby dispatcher initializing and run in simple mood 
String fileName = scriptsPath + File.separator + "dispatcher_fake.rb"; 
// run scriplet 
container.runScriptlet(PathType.ABSOLUTE, fileName); 
// terminate container to cleanup memory without any effects 
container.terminate(); 
container=null; 

的Scriptlet:

ENV['GEM_PATH'] = File.expand_path('../../jruby/1.9', __FILE__) 
ENV['GEM_HOME'] = File.expand_path('../../jruby/1.9', __FILE__) 
ENV['BUNDLE_BIN_PATH'] = File.expand_path('../../jruby/1.9/gems/bundler-1.0.18/bin/bundle', __FILE__) 

require 'java' 

ROOT_DIR = File.dirname(__FILE__) 
require File.join(ROOT_DIR, "base", "xsi.rb") 

# require java classes 
import org.jsoup.Jsoup 
import org.jsoup.nodes.Document 
import org.jsoup.nodes.Element 


module JavaListing 
    include_package "com.util.listing" 
end 

class A 
    include JavaListing 
    def run 
    1000.times do |index| 
     puts "iterating #{index}" 
     # java class property 
     prop = JavaListing::Property.new 
     prop.proNo = 111 
     prop.remoteID = "1111" 
     prop.ownerID = "1111" 
     prop.advertiserID = "1111" 
     prop.title = "Atite" 
     prop.summary = "Asummury" 
     prop.description = "Adescription" 
     # prop.images << JavaListing::Image.new("111", "Acaption") 
     prop.lat = 12.23 
     prop.lng = 13.21 
     #prop.address = JavaListing::Address.new("Acity", "Acountry") 
     prop.location = "Alocation" 
     prop.policy = JavaListing::Policy.new("AcheckinAt", "AcheckoutAt") 
     prop.surfaceArea = "Asurfscearea" 
     # prop.notes[index] = JavaListing::Note.new("Atitle", "Atext") 
     prop.order = "Aorder" 
     prop.map = JavaListing::Map.new(true, 14) 
     # 
     doc = Jsoup.parse("<root><elements><element>Application Error #{index} </element></elements></root>") 
    end 
end 

,你可以看到我們正在使用所有的Java對象,但燙髮得到大量的內存泄漏仍然發生

如果我們在s中創建對象普林應用,並通過應用上下文紅寶石越來越豆未來這個didn`t ressolve這個問題

在腳本容器設置的ApplicationContext背景= Spring應用程序上下文

container.put("$context", context); 

Ruby代碼

bean = $context.getBean("some_name") 
bean.myMethod() 

回答