ryoakg
3/10/2017 - 5:28 PM

object-memory-size.clj

(require '[clojure.string :as str])


;;; Twitter Commons
(merge-env! :dependencies '[[com.twitter.common/objectsize "0.0.12"]])

(->> (range 10)
     (map (juxt identity #(com.twitter.common.objectsize.ObjectSizeCalculator/getObjectSize (int-array (range %))))))
;; => ([0 16] [1 24] [2 24] [3 32] [4 32] [5 40] [6 40] [7 48] [8 48] [9 56])

(->> (range 10)
     (map (juxt identity #(com.twitter.common.objectsize.ObjectSizeCalculator/getObjectSize (long-array (range %))))))
;; => ([0 16] [1 24] [2 32] [3 40] [4 48] [5 56] [6 64] [7 72] [8 80] [9 88])

(->> (range 10)
     (map #(let [s (-> % (repeat \a) str/join)]
             [(count s) (com.twitter.common.objectsize.ObjectSizeCalculator/getObjectSize s)])))
;; => ([0 40] [1 48] [2 48] [3 48] [4 48] [5 56] [6 56] [7 56] [8 56] [9 64])

(->> (range 10)
     (map #(let [s (-> % (repeat \a) str/join)]
             [(count s) (com.twitter.common.objectsize.ObjectSizeCalculator/getObjectSize (re-pattern s))])))
;; => ([0 168] [1 200] [2 224] [3 232] [4 800] [5 824] [6 824] [7 840] [8 840] [9 864])

(->> [(java.net.URL. "ftp://gnu.org:21")
      (java.net.URL. "http://example.com")
      (java.net.URL. "http://example.com/")
      (java.net.URL. "http://example.com:8888/")]
     (map #(com.twitter.common.objectsize.ObjectSizeCalculator/getObjectSize %)))
;; => (288 240 248 320)



;;; https://github.com/dweiss/java-sizeof
(merge-env! :dependencies '[[com.carrotsearch/java-sizeof "0.0.5"]])

(->> (range 10)
     (map (juxt identity #(com.carrotsearch.sizeof.RamUsageEstimator/sizeOf (int-array (range %))))))
;; => ([0 16] [1 24] [2 24] [3 32] [4 32] [5 40] [6 40] [7 48] [8 48] [9 56])



;;; Java Object Layout
(merge-env! :dependencies '[[org.openjdk.jol/jol-core "0.7.1"]])

(.toPrintable (org.openjdk.jol.info.GraphLayout/parseInstance (object-array [1 "aaa" 5 (java.net.URL. "http://example.com/")])))

;; java.lang.Long@21d03963d, java.lang.String@3f3049c4d, java.lang.Long@e8eb5f1d, java.net.URL@3ee4d4a7d object externals:
;;           ADDRESS       SIZE TYPE                              PATH                           VALUE
;;         649b384f8         24 java.lang.Long                    <r1>                           1
;;         649b38510    1568504 (something else)                  (somewhere else)               (something else)
;;         649cb7408         24 java.lang.Long                    <r3>                           5
;;         649cb7420 4203594488 (something else)                  (somewhere else)               (something else)
;;         744593718         24 java.lang.String                  <r2>                           (object)
;;         744593730         24 [C                                <r2>.value                     [a, a, a]
;;         744593748   87739632 (something else)                  (somewhere else)               (something else)
;;         749940438         24 sun.net.www.protocol.http.Handler <r4>.handler                   (object)
;;         749940450     473696 (something else)                  (somewhere else)               (something else)
;;         7499b3eb0         64 java.net.URL                      <r4>                           (object)
;;         7499b3ef0        664 (something else)                  (somewhere else)               (something else)
;;         7499b4188         24 java.lang.String                  <r4>.protocol                  (object)
;;         7499b41a0         24 [C                                <r4>.protocol.value            [h, t, t, p]
;;         7499b41b8         24 java.lang.String                  <r4>.host                      (object)
;;         7499b41d0         40 [C                                <r4>.host.value                [e, x, a, m, p, l, e, ., c, o, m]
;;         7499b41f8         24 java.lang.String                  <r4>.file                      (object)
;;         7499b4210         24 [C                                <r4>.file.value                [/]


;; more info: https://www.infoscoop.org/blogjp/2014/06/16/java-objects-memory-structure/