2012-06-22 2 views
0

설명 :JRuby를 PermGen 공간이 부족 루비 코드에서 자바 객체를 사용하는 경우에도

우리가 자바는 JRuby를이 permgen도 얻을 개체를 사용하는 경우 : 당신이 할 수

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 

:

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; 

스크립트 릿을 우리는 모든 자바 객체를 사용하고 있지만 Perm는 메모리 누수를 계속 발생하지 않는다.

프링 응용 프로그램과 미래에이 돌아가신`t의 ressolve을 콩을 얻기를위한 루비 응용 프로그램 컨텍스트를 전달이 스크립트 컨테이너 설정 ApplicationContext의 컨텍스트 = Spring 애플리케이션 컨텍스트에서

를 발행

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

루비 코드

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

답변

0

해결책은 현재 JVM에서 시작된 별도의 JVM을 사용하는 것입니다.

Start new JVM

관련 문제