Philip mentioned that Java GC reclaims weakly referenced objects too fast, often times before the cached object could be reused. According to the IBM article listed below, it seems that it's just a matter of replacing WeakReference with SoftReference in Hackystat code. I am quite interested in knowing why there need to be more than one type of non-strong reference in Java. Do we have any Java GC expert on this list that can probably shed light on this topic?

Thanks.

Cedric



Philip Johnson (JIRA) wrote:
[ http://hackydev.ics.hawaii.edu:8080/browse/HACK-796?page=comments#action_11837 ]
Philip Johnson commented on HACK-796:
-------------------------------------

I found a couple more links that might of use when doing further research on 
this issue:

Shows a soft reference based hashmap:
http://www.javaspecialists.co.za/archive/newsletter.do?issue=098&locale=en_US

An article about soft references:
http://www-128.ibm.com/developerworks/java/library/j-jtp01246.html

A bug report indicating that maybe soft references don't get GC'd so fast in 
JDK 1.5:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6349930


NullPointerException in DailyProjectFileMetrics
-----------------------------------------------

         Key: HACK-796
         URL: http://hackydev.ics.hawaii.edu:8080/browse/HACK-796
     Project: Hackystat
        Type: Bug

    Reporter: Qin Zhang
    Assignee: Philip Johnson
    Priority: Critical
     Fix For: 7.5

To reproduce: use telemetry wall to hit the server hard.  It seems that 
DailyProjectFileMetric is not written in a thread-safe way.
09/17 13:13:18 DailyProjectFileMetric failed to initialize!
Hackystat-7 09-Sep-2006
java.lang.NullPointerException
        at java.util.LinkedList.remove(LinkedList.java:647)
        at java.util.LinkedList.removeLast(LinkedList.java:144)
        at 
org.hackystat.core.kernel.cache.ThreeKeyCache.put(ThreeKeyCache.java:252)
        at 
org.hackystat.core.kernel.sensordata.SensorDataCache.getSensorData(SensorDataCache.java:48)
        at 
org.hackystat.sdt.filemetric.dailyproject.FileMetricRawDataMap.<init>(FileMetricRawDataMap.java:91)
        at 
org.hackystat.sdt.filemetric.dailyproject.DailyProjectFileMetric.initialize(DailyProjectFileMetric.java:117)
        at 
org.hackystat.sdt.filemetric.dailyproject.DailyProjectFileMetric.getAllFileTypes(DailyProjectFileMetric.java:152)
        at 
org.hackystat.sdt.filemetric.reducer.LanguageFileMetricReducer.getAllFileTypes(LanguageFileMetricReducer.java:101)
        at 
org.hackystat.sdt.filemetric.reducer.LanguageFileMetricReducer.compute(LanguageFileMetricReducer.java:72)
        at 
org.hackystat.core.telemetry.reducer.TelemetryReducerManager.compute(TelemetryReducerManager.java:141)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.resolveReducerCall(TelemetryEvaluator.java:380)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.resolveFunctionCall(TelemetryEvaluator.java:322)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.resolveExpression(TelemetryEvaluator.java:285)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.evaluate(TelemetryEvaluator.java:56)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.evaluate(TelemetryEvaluator.java:140)
        at 
org.hackystat.core.telemetry.evaluator.TelemetryEvaluator.evaluate(TelemetryEvaluator.java:259)
        at 
org.hackystat.core.telemetry.analysis.TelemetryReportAnalysis.prepareReportForJspRendering(TelemetryReportAnalysis.java:133)
        at 
org.hackystat.core.telemetry.analysis.TelemetryExpertAnalysis.process(TelemetryExpertAnalysis.java:146)
        at org.hackystat.core.kernel.mvc.Controller.doPost(Controller.java:271)
        at org.hackystat.core.kernel.mvc.Controller.doGet(Controller.java:300)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

Reply via email to