droid-fu icon indicating copy to clipboard operation
droid-fu copied to clipboard

Google MapMaker classloader issue [was: Image Cache Problem]

Open hwrdprkns opened this issue 14 years ago • 6 comments

"Could not load Finalizer in its own class loader. Loading Finalizer in the current class loader instead. As a result, you will not be able to garbage collect this class loader. To support reclaiming this class loader, either resolve the underlying issue, or move Google Collections to your system class path."

Getting this error for a reason I don't know. I've also pastebin'd the text for an easier view.

http://pastebin.com/VwkTSw6X

hwrdprkns avatar Aug 21 '10 00:08 hwrdprkns

yes, that exception bubbles up from the Google MapMaker library. Not sure how to fix it, but I haven't observed any memory leaks so I assume it's safe to ignore.

mttkay avatar Sep 08 '10 14:09 mttkay

Looking at the acutal code a bit further -- I found this snippet in the comments:

` * If this library is loaded in an application class loader, it's important

  • that Finalizer not have a strong reference back to the class loader.
  • Otherwise, you could have a graph like this: *
  • Finalizer Thread
  • runs instance of -> Finalizer.class
  • loaded by -> Application class loader
    
  •   which loaded -> ReferenceMap.class
    
  •     which has a static -> FinalizableReferenceQueue instance
    
  • Even if no other references to classes from the application class loader
  • remain, the Finalizer thread keeps an indirect strong reference to the
  • queue in ReferenceMap, which keeps the Finalizer running, and as a result,
  • the application class loader can never be reclaimed. `

Since you can't get away from this in Android(your app is compiled into an APK -- I just commented out the line that spits out the error), I submitted a pull request.

hwrdprkns avatar May 20 '11 15:05 hwrdprkns

This appears to be related to a fatal exception I am encountering. I'm building with sbt-android, which includes a final proguard step. This code builds and executes correctly with Eclipse's builder, but not with sbt-android/proguard. Note that there are two consecutive problems, first the warning, then the error:

First the warning:

11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471): Could not load Finalizer in its own class loader. Loading Finalizer in the current class loader instead. As a result, you will not be able to garbage collect this class loader. To support reclaiming this class loader, either resolve the underlying issue, or move Google Collections to your system class path.
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471): java.io.FileNotFoundException: com/google/inject/internal/Finalizer.class
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FinalizableReferenceQueue$DecoupledLoader.getBaseUrl(FinalizableReferenceQueue.java:269)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:253)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:175)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FinalizableReferenceQueue.<clinit>(FinalizableReferenceQueue.java:100)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$QueueHolder.<clinit>(MapMaker.java:787)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$WeakEntry.<init>(MapMaker.java:946)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$Strength$1.newEntry(MapMaker.java:312)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.newEntry(MapMaker.java:498)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.newEntry(MapMaker.java:419)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2029)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.BytecodeGen.getClassLoader(BytecodeGen.java:149)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.BytecodeGen.getClassLoader(BytecodeGen.java:132)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:162)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.DefaultConstructionProxyFactory$1.<init>(DefaultConstructionProxyFactory.java:54)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:52)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ProxyFactory.create(ProxyFactory.java:152)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:84)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:31)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:39)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:35)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:35)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.compute(MapMaker.java:549)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.compute(MapMaker.java:419)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.internal.FailableCache.get(FailableCache.java:46)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorInjectorStore.get(ConstructorInjectorStore.java:52)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:57)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.initializeBinding(InjectorImpl.java:377)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:645)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:581)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:172)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.getBindingOrThrow(InjectorImpl.java:132)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorImpl.getInternalFactory(InjectorImpl.java:651)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.BoundProviderFactory.notify(BoundProviderFactory.java:47)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.BindingProcessor.runCreationListeners(BindingProcessor.java:230)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:131)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com.google.inject.Guice.createInjector(Guice.java:92)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at roboguice.application.RoboApplication.createInjector(RoboApplication.java:143)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at roboguice.application.RoboApplication.getInjector(RoboApplication.java:84)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at roboguice.activity.RoboActivity.getInjector(RoboActivity.java:176)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at roboguice.activity.RoboActivity.onCreate(RoboActivity.java:70)
11-15 08:32:30.875: WARN/nalizableReferenceQueue(1471):     at com...MainMenuActivity.onCreate(MainMenuActivity.
11-15 08:32:30.895: WARN/dalvikvm(1471): Exception Ljava/lang/AssertionError; thrown while initializing Lcom/google/inject/internal/FinalizableReferenceQueue;
11-15 08:32:30.895: WARN/dalvikvm(1471): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Lcom/google/inject/internal/MapMaker$QueueHolder;
11-15 08:32:30.905: WARN/dalvikvm(1471): threadid=1: thread exiting with uncaught exception (group=0x40015560)

Now the error:

11-15 08:32:31.005: ERROR/AndroidRuntime(1471): FATAL EXCEPTION: main
11-15 08:32:31.005: ERROR/AndroidRuntime(1471): java.lang.RuntimeException: Unable to start activity ComponentInfo{com...MainMenuActivity}: com.google.inject.internal.ComputationException: java.lang.ExceptionInInitializerError
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.os.Looper.loop(Looper.java:123)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread.main(ActivityThread.java:3647)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at java.lang.reflect.Method.invokeNative(Native Method)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at java.lang.reflect.Method.invoke(Method.java:507)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at dalvik.system.NativeStart.main(Native Method)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471): Caused by: com.google.inject.internal.ComputationException: java.lang.ExceptionInInitializerError
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.compute(MapMaker.java:553)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.compute(MapMaker.java:419)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.FailableCache.get(FailableCache.java:46)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.ConstructorInjectorStore.get(ConstructorInjectorStore.java:52)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:57)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.initializeBinding(InjectorImpl.java:377)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:645)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:581)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:172)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.getBindingOrThrow(InjectorImpl.java:132)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorImpl.getInternalFactory(InjectorImpl.java:651)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.BoundProviderFactory.notify(BoundProviderFactory.java:47)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.BindingProcessor.runCreationListeners(BindingProcessor.java:230)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:131)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.Guice.createInjector(Guice.java:92)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at roboguice.application.RoboApplication.createInjector(RoboApplication.java:143)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at roboguice.application.RoboApplication.getInjector(RoboApplication.java:84)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at roboguice.activity.RoboActivity.getInjector(RoboActivity.java:176)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at roboguice.activity.RoboActivity.onCreate(RoboActivity.java:70)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com...MainMenuActivity.onCreate(MainMenuActivity.java:59)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     ... 11 more
11-15 08:32:31.005: ERROR/AndroidRuntime(1471): Caused by: java.lang.ExceptionInInitializerError
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$WeakEntry.<init>(MapMaker.java:946)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$Strength$1.newEntry(MapMaker.java:312)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.newEntry(MapMaker.java:498)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.MapMaker$StrategyImpl.newEntry(MapMaker.java:419)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2029)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.BytecodeGen.getClassLoader(BytecodeGen.java:149)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.BytecodeGen.getClassLoader(BytecodeGen.java:132)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:162)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.DefaultConstructionProxyFactory$1.<init>(DefaultConstructionProxyFactory.java:54)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:52)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google.inject.ProxyFactory.create(ProxyFactory.java:152)
11-15 08:32:31.005: ERROR/AndroidRuntime(1471):     at com.google

glenviewjeff avatar Nov 15 '11 14:11 glenviewjeff

Try adding this to your ProGuard config:

-keep class com.google.common.base.Finalizable* {
  <fields>;
  <methods>;
}

-keep class com.google.common.base.internal.Finalizer {
  <fields>;
  <methods>;
}

mttkay avatar Nov 15 '11 15:11 mttkay

Thanks very much, I'll give it a shot as soon as I can figure out how to specify the proguard.cfg file in sbt android!

Jeff

-----Original Message----- From: Matthias Käppler [mailto:reply+i-285043- [email protected]] Sent: Tuesday, November 15, 2011 9:07 AM To: glenviewjeff Subject: Re: [droid-fu] Google MapMaker classloader issue was: Image Cache Problem

Try adding this to your ProGuard config:

-keep class com.google.common.base.Finalizable* {
  <fields>;
  <methods>;
}

-keep class com.google.common.base.internal.Finalizer {
  <fields>;
  <methods>;
}

Reply to this email directly or view it on GitHub: https://github.com/kaeppler/droid-fu/issues/9#issuecomment-2745979

glenviewjeff avatar Nov 15 '11 15:11 glenviewjeff

Thanks very much for the help. It did get me past the errors posted, but now I get a Guice binding runtime error. Since this isn't the appropriate place to ask for help like that, I posted the problem to the Scala Android group. If you think you might be able to help, I'd be really grateful. Thanks!

glenviewjeff avatar Nov 18 '11 18:11 glenviewjeff