funkcionálně.cz

Přední český blog o funkcionálním programování, kde se o funkcionálním programování nepíše
««« »»»

Rekurzivní sizeOf pro JVM

6. 5. 2013 (před 6 lety) — k47

Při svém tažení za po­ro­zu­mě­ním jak JVM pra­cuje s pamětí jsem si napsal jed­no­du­chý pro­gram, který re­kur­zivně spo­čítá ve­li­kost ob­jektu a všech jeho kom­po­nent.

Když chci zjis­tit ve­li­kost in­stance Vec­toru ob­sa­hu­jí­cího 500 ele­mentů, udělám to jed­no­duše:

val vect = scala.collection.immutable.Vector(1 to 500: _*)
SizeOf.sizeOfStats(vect)

Vý­stu­pem pak bude něco ve smyslu:

total 10504

java.lang.Integer
12 java.lang.Integer.value: int
16

scala.collection.immutable.Vector
12 scala.collection.immutable.Vector.startIndex: int
16 scala.collection.immutable.Vector.endIndex: int
20 scala.collection.immutable.Vector.focus: int
24 scala.collection.immutable.Vector.depth: int
28 scala.collection.immutable.Vector.dirty: boolean
32 scala.collection.immutable.Vector.display0: [Ljava.lang.Object;
36 scala.collection.immutable.Vector.display1: [Ljava.lang.Object;
40 scala.collection.immutable.Vector.display2: [Ljava.lang.Object;
44 scala.collection.immutable.Vector.display3: [Ljava.lang.Object;
48 scala.collection.immutable.Vector.display4: [Ljava.lang.Object;
52 scala.collection.immutable.Vector.display5: [Ljava.lang.Object;
56

  count      one         sum
----------------------------
     17     144B       2448B [Ljava.lang.Object;
    500      16B       8000B java.lang.Integer
      1      56B         56B scala.collection.immutable.Vector
----------------------------
    518      72B      10504B

Z vý­stupu je patrné ně­ko­lik věcí:

Ne­do­stanu tedy jenom jedno číslo, ale i pohled pod kapotu, z čeho je objekt složen uvnitř. Pro­gram si poradí s cyk­lic­kým ob­jek­to­vým grafem. Jed­not­livé ob­jekty od sebe roz­li­šuje pomocí jejich identityHashCode. To sice není uni­kátní, ale pro ro­zumně malé ob­jekty se dá po­čí­tat s tím, že vý­sle­dek bude přesný.

Příště s tímhle udě­lát­kem pro­vedu ně­ko­lik měření, jak jsou na tom ko­lekce s hladem po paměti.


Zdro­jové kódy jsou do­stupné na gi­thubu.

@kaja47, kaja47@k47.cz, deadbeef.k47.cz, starší články