Created
March 29, 2010 19:33
-
-
Save headius/348302 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/org/jruby/RubyBasicObject.java b/src/org/jruby/RubyBasicObject.java | |
index 86a0123..6a36d33 100644 | |
--- a/src/org/jruby/RubyBasicObject.java | |
+++ b/src/org/jruby/RubyBasicObject.java | |
@@ -29,8 +29,12 @@ package org.jruby; | |
import java.io.Serializable; | |
import java.util.ArrayList; | |
+import java.util.Collections; | |
+import java.util.Comparator; | |
+import java.util.Hashtable; | |
import java.util.List; | |
import java.util.Map; | |
+import java.util.Map.Entry; | |
import java.util.concurrent.atomic.AtomicBoolean; | |
import org.jruby.anno.JRubyMethod; | |
@@ -59,6 +63,33 @@ import org.jruby.util.TypeConverter; | |
*/ | |
public class RubyBasicObject implements Cloneable, IRubyObject, Serializable, Comparable<IRubyObject>, CoreObjectType, InstanceVariables, InternalVariables { | |
private static final boolean DEBUG = false; | |
+ | |
+ private static Map<RubyClass, Long> OBJECT_COUNTS = new Hashtable(); | |
+ | |
+ static { | |
+ Runtime.getRuntime().addShutdownHook(new Thread() { | |
+ public void run() { | |
+ List<Entry<RubyClass, Long>> entries = new ArrayList(OBJECT_COUNTS.entrySet()); | |
+ Collections.sort(entries, new Comparator<Entry<RubyClass, Long>>() { | |
+ public int compare(Entry<RubyClass, Long> o1, Entry<RubyClass, Long> o2) { | |
+ return o2.getValue().compareTo(o1.getValue()); | |
+ } | |
+ }); | |
+ for (Map.Entry<RubyClass, Long> e : entries) { | |
+ System.out.println(e.getKey() + ": " + e.getValue() + " instances"); | |
+ } | |
+ } | |
+ }); | |
+ } | |
+ | |
+ private static synchronized void updateObjectCounts(RubyClass cls) { | |
+ if (cls == null) return; | |
+ Long value = OBJECT_COUNTS.get(cls); | |
+ if (value == null) { | |
+ value = 0L; | |
+ } | |
+ OBJECT_COUNTS.put(cls, value + 1); | |
+ } | |
// The class of this object | |
protected transient RubyClass metaClass; | |
@@ -177,6 +208,8 @@ public class RubyBasicObject implements Cloneable, IRubyObject, Serializable, Co | |
if (runtime.isObjectSpaceEnabled()) addToObjectSpace(runtime); | |
if (runtime.getSafeLevel() >= 3) taint(runtime); | |
+ | |
+ updateObjectCounts(metaClass); | |
} | |
/** | |
@@ -184,6 +217,7 @@ public class RubyBasicObject implements Cloneable, IRubyObject, Serializable, Co | |
*/ | |
public RubyBasicObject(RubyClass metaClass) { | |
this.metaClass = metaClass; | |
+ updateObjectCounts(metaClass); | |
} | |
/** | |
@@ -196,6 +230,7 @@ public class RubyBasicObject implements Cloneable, IRubyObject, Serializable, Co | |
if (useObjectSpace) addToObjectSpace(runtime); | |
if (canBeTainted && runtime.getSafeLevel() >= 3) taint(runtime); | |
+ updateObjectCounts(metaClass); | |
} | |
protected RubyBasicObject(Ruby runtime, RubyClass metaClass, boolean useObjectSpace) { | |
@@ -203,6 +238,7 @@ public class RubyBasicObject implements Cloneable, IRubyObject, Serializable, Co | |
if (useObjectSpace) addToObjectSpace(runtime); | |
if (runtime.getSafeLevel() >= 3) taint(runtime); | |
+ updateObjectCounts(metaClass); | |
} | |
private void addToObjectSpace(Ruby runtime) { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
~/projects/jruby ➔ gem install rails | |
Successfully installed rails-2.3.5 | |
1 gem installed | |
Installing ri documentation for rails-2.3.5... | |
Installing RDoc documentation for rails-2.3.5... | |
String: 6839607 instances | |
Array: 5951777 instances | |
Hash: 1085075 instances | |
Gem::Requirement: 1082279 instances | |
Gem::Dependency: 1080950 instances | |
Regexp: 1080804 instances | |
MatchData: 263612 instances | |
Gem::Version: 130155 instances | |
Fixnum: 52634 instances | |
Symbol: 2058 instances | |
Class: 1576 instances | |
File: 738 instances | |
File::Stat: 646 instances | |
FileUtils::Entry_: 641 instances | |
YAML::Yecht::Node: 577 instances | |
Proc: 456 instances | |
Time: 444 instances | |
Gem::Specification: 407 instances | |
Binding: 381 instances | |
Gem::Package::TarHeader: 326 instances | |
Gem::Package::TarReader::Entry: 323 instances | |
Errno::EEXIST: 321 instances | |
Module: 90 instances | |
Range: 87 instances | |
URI::HTTP: 85 instances | |
Gem::Platform: 69 instances | |
OptionParser::Switch::NoArgument: 36 instances | |
URI::Generic: 30 instances | |
Date::Format::Bag: 22 instances | |
Float: 19 instances | |
Rational: 11 instances | |
OptionParser::Switch::RequiredArgument: 8 instances | |
Net::HTTP::Get: 8 instances | |
Net::BufferedIO: 8 instances | |
TCPSocket: 8 instances | |
OptionParser::OptionMap: 6 instances | |
EOFError: 5 instances | |
Gem::Security::Policy: 5 instances | |
YAML::Yecht::Parser: 5 instances | |
RDoc::RDoc::Generator: 4 instances | |
Bignum: 4 instances | |
Net::HTTPNotModified: 4 instances | |
Net::HTTPFound: 4 instances | |
OptionParser::List: 3 instances | |
Gem::LoadError: 3 instances | |
RDoc::ParserFactory::Parsers: 3 instances | |
Date::Infinity: 3 instances | |
IRB::Notifier::LeveledNotifier: 3 instances | |
Net::HTTP: 3 instances | |
Continuation: 3 instances | |
IO: 3 instances | |
Gem::Package::TarReader: 2 instances | |
LoadError: 2 instances | |
RDoc::RDoc: 2 instances | |
RDoc::Stats: 2 instances | |
NameError: 2 instances | |
GetoptLong: 2 instances | |
YAML::Yecht::Resolver: 2 instances | |
Gem::ConfigFile: 2 instances | |
Gem::SourceIndex: 2 instances | |
Gem::DocManager: 2 instances | |
Thread: 3 instances | |
Object: 2 instances | |
OptionParser::CompletingHash: 1 instances | |
Gem::Package::TarInput: 1 instances | |
OptionParser::Switch::PlacedArgument: 1 instances | |
OptionParser::Switch::OptionalArgument: 1 instances | |
Mutex: 1 instances | |
OptionParser: 1 instances | |
Gem::FileOperations: 1 instances | |
OpenSSL::X509::Store: 1 instances | |
Zlib::Inflate: 1 instances | |
Zlib::GzipReader: 1 instances | |
SystemExit: 1 instances | |
NoMethodError: 1 instances | |
NameError::Message: 1 instances | |
IRB::Notifier::NoMsgNotifier: 1 instances | |
IRB::Notifier::CompositeNotifier: 1 instances | |
IOError: 1 instances | |
Gem::DependencyList: 1 instances | |
IRB::StdioOutputMethod: 1 instances | |
UnboundMethod: 1 instances | |
Gem::Commands::InstallCommand: 1 instances | |
Options: 1 instances | |
Gem::DependencyInstaller: 1 instances | |
Gem::SpecFetcher: 1 instances | |
StringIO: 1 instances | |
Gem::RemoteFetcher: 1 instances | |
Gem::GemRunner: 1 instances | |
Gem::ConsoleUI: 1 instances | |
RubyToken::TkNL: 1 instances | |
Gem::GemPathSearcher: 1 instances | |
Gem::SystemExitException: 1 instances | |
ThreadGroup: 1 instances | |
Gem::Installer: 1 instances | |
Gem::CommandManager: 1 instances | |
TrueClass: 1 instances | |
FalseClass: 1 instances | |
NilClass: 1 instances | |
Gem::Format: 1 instances |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment