Skip to main content

New series - reference types in Java

Starting this week, I will post a series of blogs on "Reference Types In Java". So here goes...




Since version 1.2, Java supports references other than the commonly used strong reference. An object is said to be strongly referenced, when at least one path to the object from the root set of references contains a strong reference. A strong reference is the traditional type of reference which is created by the = operator. The garbage collector considers a strongly referenced object to be in use and will not reclaim it.




This statement creates a strong reference.


String s = new String("abc"); 








The String object holding the value “abc” is strongly referenced because the variable 's' directly refers to it. Java 1.2 supports three more types of references; SoftReference, WeakReference, and PhantomReference. Whenever we want an object to be softly, weakly, or phantomly referenced, we do not directly reference the object using an '=' operator. We instead reference the object through another object. This object is a reference object and encapsulates a reference.




SoftReference sf = new SoftReference(new String(“abc”));








he String object “abc” is not strongly referenced because the only path to it is through a Reference object. The String object “abc” will remain live as long as there is sufficient memory in the JVM. But if the garbage collector has finished reclaiming all unused objects, and the program demands more memory, then “abc” will be reclaimed. What happens if we change the code to add a strong reference to the object as well?



String s = new String(“abc”);

SoftReference sf = new SoftReference(s);






Now, is the String object “abc” softly referenced, or is it strongly referenced? It is strongly referenced because there is a path from the root set of references to the String object, which has a strong reference. The variable s has a strong reference to the String object. The garbage collector will not reclaim the object because there is a strong reference to it.





The Reference object shown in the above diagram, is really an abstract superclass for different types of reference objects in Java; soft references, weak references, and phantom references. Each type denotes the strength of reachability to an object. Before we proceed, remember, the reference type of an object is the weakest type in the strongest link.





The next few posts will discuss different reference types in more detail.







  • Discuss this post in the learning forum.


  • Check out my learning journal. I am learning JSF at the moment. Do you want to join an experiment in forming an ad hoc virtual study group?




Note: This text was originally posted on my earlier blog at http://www.adaptivelearningonline.net
Here are the comments from the original post

-----
COMMENT:
AUTHOR: Sanket Daru
URL: http://sankdadevildaru.blogspot.com
DATE: 07/16/2007 05:02:18 AM
Dear Sir,
In this series, you are taking us through the references, weak, strong, etc... But I have a question...

Why will I explicitly want my references to be weak or soft??? Can you please guide us through one real life scenario where these references come into use???

I remember one which you discussed in class about loading registry entries in memory which might end up taking a lot of space and hence it is wiser to make it weak referenced... But still, in day-to-day usage, can you provide some good examples???

Also, I will like to ask, will it not be beautiful if Java (JVM) will do this work of assigning weak-soft-strong references for us??? The garbage collection series pointed out when and how JVM reclaims the memory, but wouldn't it be nice if JVM also assigned specific reference types on its own during compile or run time as needed??? Just a random thought... Please guide...

Thank You.

Regards,
Sanket Daru.
-----
COMMENT:
AUTHOR: Parag
DATE: 07/16/2007 09:09:10 AM
Hi Sanket,

I have answered your question on the newsgroup.

Comments

Popular posts from this blog

Running your own one person company

Recently there was a post on PuneTech on mom's re-entering the IT work force after a break. Two of the biggest concerns mentioned were : Coping with vast advances (changes) in the IT landscape Balancing work and family responsibilities Since I have been running a one person company for a good amount of time, I suggested that as an option. In this post I will discuss various aspects of running a one person company. Advantages: You have full control of your time. You can choose to spend as much or as little time as you would like. There is also a good chance that you will be able to decide when you want to spend that time. You get to work on something that you enjoy doing. Tremendous work satisfaction. You have the option of working from home. Disadvantages: It can take a little while for the work to get set, so you may not be able to see revenues for some time. It takes a huge amount of discipline to work without a boss, and without deadlines. You will not get the benefits (insuran

Some thoughts on redesigning education

Some time back I read a blog post on redesigning education. It asked some very good questions. Stuff which I had been thinking of myself. I left my thoughts on the blog, but I would also like to start a conversation around these ideas with those who read this blog as well. I would like to know what other people think of the issue of redesigning (college) education. I have often thought about how college education can be improved. To answer this question, we first have to ask a very basic question. What is the purpose of education? To me, we need education for 3 things: To learn more about the world around us To lead positive constructive lives To earn a good living / fulfill our ambitions I think education has to a large extent evolved to fulfill #3 (with a bias towards earning a comfortable living). The semester system, along with multiple choice tests, and grading, has made our education system into an assembly line. Students are pushed into the assembly line, given classes, admini

Testing Groovy domain classes

If you are trying to test Grails domain class constraints by putting your unit test cases in the 'test/unit' directory, then your tests will fail because the domain objects will not have the 'valdate' method. This can be resolved in two ways: Place the test cases inside test/integration (which will slow things down) Use the method 'mockForConstraintsTests(Trail)' to create mock method in your domain class and continue writing your test cases in 'test/unit' What follows is some example code around this finding. I am working on a Groovy on Grails project for a website to help programmers keep up and refresh their skills. I started with some domain classes and then moved on to write some unit tests. When we create a Grails project using grails create-app , it creates several directories, one of which is a directory called 'test' for holding unit tests. This directory contains two directories, 'unit', and 'integration' for uni