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)