Garbage collects objects after lazy values ​​have been calculated

In my current project, I process a fairly large amount of data, and the data processing should be both efficient and computational. Each element has some metadata that can be read very quickly and is almost always interesting. In addition, each element has factual data that is relatively rarely read, but reading and especially parsing is very time-consuming. Therefore, it seems natural that data analysis should only be performed if it is really requested.

For this purpose, I thought of lazy meanings:

class Item(metaData: MetaData, dataString: String) {
    lazy val data = parse(dataString)
}

Now data is processed only if it is really requested. The problem is that the dataString and parsed data are stored in memory. As far as I see, "dataString" can no longer be accessed as soon as the "data" has been called (or is it?), And therefore it can be garbage collected. Unfortunately, this seam did not happen.

Is there a way to solve the problem differently or give the garbage collector a hint of garbage collection for data collection here?

+5
source share
2 answers

You just need a little more tools:

class Item(dataString: String) {
  private var storedData = dataString
  lazy val data = {
    val temp = parse(storedData)
    storedData = null
    temp
  }
}

dataString , ( storedData), , storedData, , GCed.

+7

, , , Scala dataString , , dataString. , , , dataString , .

, .

class Item(dataString: String) {
    lazy val data = parse(dataString)


    def parse(s: String) = s.reverse

}

, dataString, . data$lzycompute, dataString, data. dataString .

bitmap$0, , , --, data, , , data.

.version 50 0
.class super public Item
.super java/lang/Object
.runtimevisible annotation Lscala/reflect/ScalaSignature;
    bytes =  string [_7]
.end annotation
.attribute ScalaSig '\x05\x00\x00'

.field final private dataString Ljava/lang/String;
.field private data Ljava/lang/String;
.field volatile private bitmap$0 Z

.method private data$lzycompute : ()Ljava/lang/String;
    .limit stack 3
    .limit locals 2
    .catch [0] from L4 to L34 using L46
    aload_0
    dup
    astore_1
    monitorenter
L4:
    aload_0
    getfield Item bitmap$0 Z
    ifne L28
    aload_0
    aload_0
    aload_0
    getfield Item dataString Ljava/lang/String;
    invokevirtual Item parse (Ljava/lang/String;)Ljava/lang/String;
    putfield Item data Ljava/lang/String;
    aload_0
    iconst_1
    putfield Item bitmap$0 Z
L28:
.stack append
    locals Object Item
.end stack
    getstatic scala/runtime/BoxedUnit UNIT Lscala/runtime/BoxedUnit;
    pop
    aload_1
    monitorexit
L34:
    aload_0
    aconst_null
    pop
    aconst_null
    putfield Item dataString Ljava/lang/String;
    aload_0
    getfield Item data Ljava/lang/String;
    areturn
L46:
.stack same_locals_1_stack_item
    stack Object java/lang/Throwable
.end stack
    aload_1
    monitorexit
    athrow
.end method

.method public data : ()Ljava/lang/String;
    .limit stack 1
    .limit locals 1
    aload_0
    getfield Item bitmap$0 Z
    ifeq L14
    aload_0
    getfield Item data Ljava/lang/String;
    goto L18
L14:
.stack same
    aload_0
    invokespecial Item data$lzycompute ()Ljava/lang/String;
L18:
.stack same_locals_1_stack_item
    stack Object java/lang/String
.end stack
    areturn
.end method

.method public parse : (Ljava/lang/String;)Ljava/lang/String;
    .limit stack 4
    .limit locals 2
    new scala/collection/immutable/StringOps
    dup
    getstatic scala/Predef$ MODULE$ Lscala/Predef$;
    aload_1
    invokevirtual scala/Predef$ augmentString (Ljava/lang/String;)Ljava/lang/String;
    invokespecial scala/collection/immutable/StringOps <init> (Ljava/lang/String;)V
    invokeinterface scala/collection/IndexedSeqOptimized reverse ()Ljava/lang/Object; 1
    checkcast java/lang/String
    areturn
.end method

.method public <init> : (Ljava/lang/String;)V
    .limit stack 2
    .limit locals 2
    aload_0
    aload_1
    putfield Item dataString Ljava/lang/String;
    aload_0
    invokespecial java/lang/Object <init> ()V
    return
.end method

.const [_7] = Utf8 '\x06\x01)2A!\x01\x02\x01\x0b\t!\x11\n^3n\x15\x05\x19\x11a\x02\x1ff[B$\x18PP\x02\x01\'\t\x01a\x01\x05\x02\x08\x195\t\x01B\x03\x02\n\x15\x05!A.\x198h\x15\x05Y\x11\x01\x026bm\x06L!!\x04\x05\x03\r=\x13\'.Z2u\x11!y\x01A!A!\x02\x13\x01\x12A\x033bi\x06\x1cFO]5oOB\x11\x11c\x06\x08\x03%Ui\x11a\x05\x06\x02)\x05)1oY1mC&\x11acE\x01\x07!J,G-\x1a4\n\x05aI"AB*ue&twM\x03\x02\x17\'!)1\x04\x01C\x019\x051A(\x1b8jiz""!H\x10\x11\x05y\x01Q"\x01\x02\t\x0b=Q\x02\x19\x01\t\t\x11\x05\x02\x01R1A\x05\x02\t\nA\x01Z1uCV\t\x01\x03\x03\x05%\x01!\x05\t\x15)\x03\x11\x03\x15!\x17\r^1!\x11\x151\x03\x01"\x01(\x03\x15\x01\x18M]:f)\t\x01\x02\x06C\x03*K\x01\x07\x01#A\x01t\x01'
+5

All Articles