390 likes | 781 Views
Stuttgart JUG 2001. 2. Overview. Review of Java's Memory ModelLoitering ObjectsEffective Memory ManagementDesignImplementationDocumentationConclusion and Further Reading. Stuttgart JUG 2001. 3. Memory Safety in Java. A key aspect in the design of...the Java Languageno pointer arithmeticthe
E N D
1. Java Memory Management Charles-Franois THUEUX
Sitraka Inc.
cft@sitraka.com
2. Stuttgart JUG 2001 2 Overview Review of Javas Memory Model
Loitering Objects
Effective Memory Management
Design
Implementation
Documentation
Conclusion and Further Reading
3. Stuttgart JUG 2001 3 Memory Safety in Java A key aspect in the design of...
the Java Language
no pointer arithmetic
the Java Virtual Machine (JVM)
bytecode instruction set
runtime checks (array bounds, ref casts)
garbage collection
4. Stuttgart JUG 2001 4 Memory Safety in Java Eliminated many memory-related problems
Buffer overruns
De-referencing stale pointers
Memory leaks
However Java programs can exhibit the macro-level symptoms of traditional memory leaks
Process size seemingly grows without bounds
5. Stuttgart JUG 2001 5 The intent of Garbage Collection is to remove objects that are no longer needed
Undecidable in general
Java uses an approximation
remove objects that are no longer reachable
The reachability test starts at the Heaps root set Javas Memory Model
6. Stuttgart JUG 2001 6 The Root Set Set of foundational object references
static reference fields within class definitions
local reference variables within the method frames of each Java thread stack
The contents of the Root Set change dynamically as your program runs
As threads enter and exit methods, local reference variables enter and leave the Root Set
7. Stuttgart JUG 2001 7 The Dynamic Root Set - 1 1 public
2 class MyApp
3 {
4 private static MyApp myApp = null;
5
6 public static
7 void
8 main( String[] args )
9 {
10 myApp = new MyApp( );
11 myApp.method1( );
12 myApp.method2( );
13 }
8. Stuttgart JUG 2001 8 The Dynamic Root Set - 2 14 private void
15 method1( )
16 {
17 BigObject bigObj = new BigObject( );
18 ...
19 }
20
21 private void
22 method2( )
23 {
24 BiggerObject biggerObj = new BiggerObject( );
25 ...
26 }
27 }
9. Stuttgart JUG 2001 9 The Dynamic Root Set - 3 1 public
2 class MyApp
3 {
4 private static MyApp myApp = null;
5
6 public static
7 void
8 main( String[] args )
9 {
10 myApp = new MyApp( );
11 myApp.method1( );
12 myApp.method2( );
13 }
10. Stuttgart JUG 2001 10 The Dynamic Root Set - 4 14 private void
15 method1( )
16 {
17 BigObject bigObj = new BigObject( );
18 ...
19 }
20
21 private void
22 method2( )
23 {
24 BiggerObject biggerObj = new BiggerObject( );
25 ...
26 }
27 }
11. Stuttgart JUG 2001 11 The Dynamic Root Set - 5 1 public
2 class MyApp
3 {
4 private static MyApp myApp = null;
5
6 public static
7 void
8 main( String[] args )
9 {
10 myApp = new MyApp( );
11 myApp.method1( );
12 myApp.method2( );
13 }
12. Stuttgart JUG 2001 12 Reachable Objects Elements within the Root Set refer to objects within the JVMs Heap
Reference variables within those objects refer to further objects within the Heap
13. Stuttgart JUG 2001 13 Object States Define three progressive object states
Allocated
Exists within the JVMs heap
Reachable
A path exists (directly or indirectly) from a member of the root set, through a sequence of references, to that object.
Live
From the intent of the applications design, the program will use the object (meaning at least one of its fields will be accessed and/or one of its methods will be invoked) along some future path of execution.
14. Stuttgart JUG 2001 14 The JVM Heap
15. Stuttgart JUG 2001 15 C/C++ vs. Java Memory leak in C/C++
Object was allocated, but its not reachable
malloc()/new, but forgot to free()/delete before destroying the memory pointer
Memory leak in Java
The object is reachable, but its not live
a reference was set, but it hasnt been eliminated
Object is reachable to the GC, but the source code to fix the leak may not be available to you
16. Stuttgart JUG 2001 16 Memory Leaks in Java Impact is often more severe than C/C++
Rarely a single object, but a whole sub-graph
A single lingering reference can have massive memory impact (and a significant performance impact)
17. Stuttgart JUG 2001 17 Loitering Objects The term Memory Leak has too much historical baggage from C/C++
and it doesnt accurately describe the formulation of the problem as it pertains to Java
A new term: Loitering Object
An object that remains within the Heap past its useful life
18. Stuttgart JUG 2001 18 Reference Management The key to effective memory management in Java is effective reference management
What undermines effective reference management ?
Awareness of the issue
Bad habits from C/C++ development
Class Libraries and Application Frameworks
Ill-defined reference management policies
Encapsulate flawed reference assignments
19. Stuttgart JUG 2001 19 Reference Management As a Java programmer, how can I effectively manage references within my software, and promote better reference management ?
1. Design
2. Implementation
3. Documentation
20. Stuttgart JUG 2001 20 1. Design for Ref. Mgmt. For each Use Case within your application, explicitly characterize:
a. The lifecycle of each object
b. The inter-relationships between various objects
21. Stuttgart JUG 2001 21 Lifecycle Relationships
Object B adopts As lifecycle and has no control over it
22. Stuttgart JUG 2001 22 1a. Object Lifecycles For each object within the Use Case you are implementing, you need to explicitly define:
its point of creation
the duration of its usefulness
the point at which it should be eliminated from the runtime environment
23. Stuttgart JUG 2001 23 1a. Object Lifecycles In Java, creating an object within the runtime environment is an explicit act, while its elimination is an implicit one
Defining - within your design - the point when your object should be eliminated will help you validate the correctness of your Java implementation
24. Stuttgart JUG 2001 24 1b. Inter-Object Relationships Objects establish relationships as they collaborate to accomplish their goals
Examples:
Composition (a has-a relationship)
Association (a uses-a relationship)
Relationship lifecycles
25. Stuttgart JUG 2001 25 1b. Inter-Object Relationships Think Symmetry
If you define a method that establishes a relationship, ensure you define a method that revokes it.
The Observer Pattern
subject.addObserver( Observer )
subject.removeObserver( Observer )
26. Stuttgart JUG 2001 26 2. Implementation Loitering objects often arise from simple coding oversights or omissions
forgot to null-ify a variable
didnt remove an object from a list
Use a Heap Analysis Tool to validate that your implementation adheres to your design
27. Stuttgart JUG 2001 27 Reference Variable Scope Three forms of reference variables:
Class-based:
Reference variables within a class definition that have a static attribute associated with them
Object-based:
Non static reference variables within a class definition
Method-based:
Reference variables defined within the scope of a method
28. Stuttgart JUG 2001 28 Reference Variable Scope Dont be concerned about assignments to method-based reference variables within methods of short execution time
Be attentive of assignments to class-based and object-based reference variables, and method-based reference variables within methods of long execution times
29. Stuttgart JUG 2001 29 Lingerer Reference used transiently by long-term object
Reference always reset on next use
e.g. associations with menu items
e.g. global action or service
30. Stuttgart JUG 2001 30 Lingerer Example Print action as singleton
class Printer
has data member Printable target;
calls target.doPrint();
target inside printer not set to null on completion
target is a lingering reference
target cannot be GCed until next print
31. Stuttgart JUG 2001 31 Lingerer Strategies Dont use a set of fields to maintain state
enclose in object
easier to maintain
one reference to clean up
Draw state diagram
quiescent state == no outgoing references
Early exit methods or multi-stage process
setup; process; cleanup
32. Stuttgart JUG 2001 32 3. Documentation For methods that establish a relationship to another object, identify (in your javadoc description) the symmetric method that revokes the relationship
33. Stuttgart JUG 2001 33 Dealing with Flaws of Others After determining you have a loitering object, your investigation reveals that the object holding the reference to your loiterer is one which you do not have the source code to.
How do you handle this ?
34. Stuttgart JUG 2001 34 Using Their Code Properly ? Are you using their framework properly ?
Understand their notion of object life cycles
Think symmetry (again)
An add() operation implies a remove()
A register() implies an unregister()
Does the symmetric operation (to the one that established the reference) remove it ?
35. Stuttgart JUG 2001 35 Notify the Author Youve established that they are erroneously holding an object reference
Create a simple test case
Make it easy for the vendor to clearly identify the issue.
Ask for
Work arounds (if possible)
Resolution to the fundamental problem
36. Stuttgart JUG 2001 36 Eliminate Subgraph Elements If you can not fix the root cause, free up as much of the loitering subgraph as you can.
37. Stuttgart JUG 2001 37 Conclusion The key to effective memory management in Java is effective reference management
Incorporate reference management in your design
Validate your Java implementation
Document your reference management policies so others will know what to do
38. Stuttgart JUG 2001 38 Further Reading Loitering Objects and Java Framework Design by Leonard Slipp, JavaReport, Volume 6, Number 1 (January 2001)
http://www.javareport.com/html/from_pages/article.asp?id=249&mon=1&yr=2001
How Do You Plug Java Memory Leaks ? by Ethan Henry and Ed Lycklama, Dr. Dobbs Journal, Java Q&A Column,Volume 25, Number 2 (February 2000)
www.ddj.com/articles/2000/0002/0002l/0002l.htm
Memory Leaks in Java Programs by Joel Nylund, JavaReport, Volume 4, Number 11 (November 1999).
www.javareport.com/archive/9911/html/from_pages/ftp_feature.shtml