[tor-bugs] #13574 [Onionoo]: Tweak memory usage of hourly cronjob

Tor Bug Tracker & Wiki blackhole at torproject.org
Sat Oct 25 19:32:15 UTC 2014


#13574: Tweak memory usage of hourly cronjob
-------------------------+---------------------
 Reporter:  karsten      |          Owner:
     Type:  enhancement  |         Status:  new
 Priority:  normal       |      Milestone:
Component:  Onionoo      |        Version:
 Keywords:               |  Actual Points:
Parent ID:               |         Points:
-------------------------+---------------------
 While attempting to set up an Onionoo mirror I ran into memory problems
 with the hourly updater.

 {{{
 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
         at java.util.Arrays.copyOf(Arrays.java:2367)
         at
 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
         at
 java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
         at
 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:480)
         at java.lang.StringBuffer.append(StringBuffer.java:309)
         at java.lang.StringBuffer.append(StringBuffer.java:300)
         at java.util.regex.Matcher.appendReplacement(Matcher.java:841)
         at java.util.regex.Matcher.replaceAll(Matcher.java:906)
         at java.lang.String.replaceAll(String.java:2162)
         at
 org.torproject.onionoo.docs.DocumentStore.storeDocumentFile(DocumentStore.java:278)
         at
 org.torproject.onionoo.docs.DocumentStore.store(DocumentStore.java:228)
         at
 org.torproject.onionoo.writer.DetailsDocumentWriter.updateRelayDetailsFiles(DetailsDocumentWriter.java:184)
         at
 org.torproject.onionoo.writer.DetailsDocumentWriter.writeDocuments(DetailsDocumentWriter.java:72)
         at
 org.torproject.onionoo.writer.DocumentWriterRunner.writeDocuments(DocumentWriterRunner.java:29)
         at org.torproject.onionoo.cron.Main.main(Main.java:55)
 }}}

 {{{
 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
         at java.util.Arrays.copyOf(Arrays.java:2367)
         at
 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
         at
 java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
         at
 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
         at java.lang.StringBuffer.append(StringBuffer.java:237)
         at java.io.StringWriter.write(StringWriter.java:101)
         at
 org.apache.commons.lang.StringEscapeUtils.escapeJavaStyleString(StringEscapeUtils.java:196)
         at
 org.apache.commons.lang.StringEscapeUtils.escapeJavaStyleString(StringEscapeUtils.java:164)
         at
 org.apache.commons.lang.StringEscapeUtils.escapeJavaScript(StringEscapeUtils.java:131)
         at
 org.torproject.onionoo.docs.DetailsDocument.escapeJSON(DetailsDocument.java:21)
         at
 org.torproject.onionoo.docs.DetailsDocument.setContact(DetailsDocument.java:267)
         at
 org.torproject.onionoo.writer.DetailsDocumentWriter.updateRelayDetailsFiles(DetailsDocumentWriter.java:158)
         at
 org.torproject.onionoo.writer.DetailsDocumentWriter.writeDocuments(DetailsDocumentWriter.java:72)
         at
 org.torproject.onionoo.writer.DocumentWriterRunner.writeDocuments(DocumentWriterRunner.java:29)
         at org.torproject.onionoo.cron.Main.main(Main.java:55)
 }}}

 Neither stack trace looks like those operations would be using crazy
 amounts of memory, so I set up a cronjob that runs `jcmd $pid
 GC.class_histogram` once every minute.  Here's the top 10 right before the
 JVM exited with that second stack trace:

 {{{
  num     #instances         #bytes  class name
 ----------------------------------------------
    1:       8533341      463113472  [C
    2:       8533040      204792960  java.lang.String
    3:       3705980      148239200  java.util.TreeMap$Entry
    4:       2995129      143766192  java.util.TreeMap
    5:        593855      114020160  org.torproject.onionoo.docs.NodeStatus
    6:        604450       48686880  [Ljava.util.HashMap$Entry;
    7:       2390562       38248992  java.util.TreeSet
    8:        931813       29818016  java.util.HashMap$Entry
    9:        604451       29013648  java.util.HashMap
   10:        611484       14675616  java.lang.Long
 }}}

 From this profile it seems that `NodeStatus` would be a good candidate to
 save some memory.  I'm attaching a branch with some memory tweaks to it as
 soon as I have a ticket number.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/13574>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list