Keterangan:
Jika kita menggunakan objek Java jruby, dapatkan permgen juga:
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;
naskah:
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
Seperti yang Anda lihat, kami menggunakan semua objek Java tetapi Perm mengatasi kebocoran memori masih terjadi
Jika kita membuat objek di aplikasi pegas dan meneruskan Konteks Aplikasi ke Ruby untuk mendapatkan kacang di masa mendatang, ini tidak menyelesaikan masalah ini
Dalam wadah skrip, atur konteks ApplicationContext = Konteks aplikasi pegas
container.put("$context", context);
kode rubi
bean = $context.getBean("some_name")
bean.myMethod()