Skip to content

Instantly share code, notes, and snippets.

@headius
Created March 29, 2010 19:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save headius/348302 to your computer and use it in GitHub Desktop.
Save headius/348302 to your computer and use it in GitHub Desktop.
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) {
~/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