Index: lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java	(revision 1552395)
+++ lucene/core/src/java/org/apache/lucene/codecs/lucene42/Lucene42DocValuesProducer.java	(working copy)
@@ -73,8 +73,10 @@
       new HashMap<Integer,FST<Long>>();
   
   private final int maxDoc;
+  // volatile to make sure ramBytesUsed() always sees the latest version
+  // but increments must always be performed under a lock
+  private volatile long ramBytesUsed;
   
-  
   static final byte NUMBER = 0;
   static final byte BYTES = 1;
   static final byte FST = 2;
@@ -96,6 +98,7 @@
     // read in the entries from the metadata file.
     IndexInput in = state.directory.openInput(metaName, state.context);
     boolean success = false;
+    ramBytesUsed = RamUsageEstimator.shallowSizeOfInstance(getClass());
     final int version;
     try {
       version = CodecUtil.checkHeader(in, metaCodec, 
@@ -189,8 +192,8 @@
   }
   
   @Override
-  public long ramBytesUsed() {
-    return RamUsageEstimator.sizeOf(this);
+  public long ramBytesUsed() {System.out.println(ramBytesUsed);
+    return ramBytesUsed;
   }
   
   private NumericDocValues loadNumeric(FieldInfo field) throws IOException {
@@ -209,6 +212,7 @@
         final int formatID = data.readVInt();
         final int bitsPerValue = data.readVInt();
         final PackedInts.Reader ordsReader = PackedInts.getReaderNoHeader(data, PackedInts.Format.byId(formatID), entry.packedIntsVersion, maxDoc, bitsPerValue);
+        ramBytesUsed += RamUsageEstimator.sizeOf(decode) + ordsReader.ramBytesUsed();
         return new NumericDocValues() {
           @Override
           public long get(int docID) {
@@ -218,15 +222,12 @@
       case DELTA_COMPRESSED:
         final int blockSize = data.readVInt();
         final BlockPackedReader reader = new BlockPackedReader(data, entry.packedIntsVersion, blockSize, maxDoc, false);
-        return new NumericDocValues() {
-          @Override
-          public long get(int docID) {
-            return reader.get(docID);
-          }
-        };
+        ramBytesUsed += reader.ramBytesUsed();
+        return reader;
       case UNCOMPRESSED:
         final byte bytes[] = new byte[maxDoc];
         data.readBytes(bytes, 0, bytes.length);
+        ramBytesUsed += RamUsageEstimator.sizeOf(bytes);
         return new NumericDocValues() {
           @Override
           public long get(int docID) {
@@ -238,6 +239,7 @@
         final long mult = data.readLong();
         final int quotientBlockSize = data.readVInt();
         final BlockPackedReader quotientReader = new BlockPackedReader(data, entry.packedIntsVersion, quotientBlockSize, maxDoc, false);
+        ramBytesUsed += quotientReader.ramBytesUsed();
         return new NumericDocValues() {
           @Override
           public long get(int docID) {
@@ -267,6 +269,7 @@
     final PagedBytes.Reader bytesReader = bytes.freeze(true);
     if (entry.minLength == entry.maxLength) {
       final int fixedLength = entry.minLength;
+      ramBytesUsed += bytes.ramBytesUsed();
       return new BinaryDocValues() {
         @Override
         public void get(int docID, BytesRef result) {
@@ -275,6 +278,7 @@
       };
     } else {
       final MonotonicBlockPackedReader addresses = new MonotonicBlockPackedReader(data, entry.packedIntsVersion, entry.blockSize, maxDoc, false);
+      ramBytesUsed += bytes.ramBytesUsed() + addresses.ramBytesUsed();
       return new BinaryDocValues() {
         @Override
         public void get(int docID, BytesRef result) {
@@ -295,6 +299,7 @@
       if (instance == null) {
         data.seek(entry.offset);
         instance = new FST<Long>(data, PositiveIntOutputs.getSingleton());
+        ramBytesUsed += instance.sizeInBytes();
         fstInstances.put(field.number, instance);
       }
     }
@@ -369,6 +374,7 @@
       if (instance == null) {
         data.seek(entry.offset);
         instance = new FST<Long>(data, PositiveIntOutputs.getSingleton());
+        ramBytesUsed += instance.sizeInBytes();
         fstInstances.put(field.number, instance);
       }
     }
