When String instances in Constant Pool will be GC'ed?

Hi all,
I'm involved in an application development; where we are storing numerous string objects into multiple HashMaps. Since the string objects created/placed in HashMap may have duplicate values; we're calling String::intern() method to make use of String Constant Pool feature in Java. But, my concern is - When the Constant String instance will be removed from Pool? Is it follow the same behaviour that if no references are presentm it is eligible for GC; i.e., removal of an instance from all HashMaps?
Please help.
Thanks & regards,
R Kaja Mohideen

EJP wrote:
How do you figure?Doesn't say so in the Javadoc. It talks about another pool ...You're taking "A pool of strings, initially empty, is maintained privately by the class String." as meaning it's not "the constant pool"? I wouldn't interpret it that way. And based on the JVM spec, I don't see anything saying the intern()ed Strings go to a different pool than "the constant pool". And if it is a separate pool, then what does go into "the constant pool"?
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22972
"A runtime constant pool is a per-class or per-interface runtime representation of the constant_pool table in a class file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile time to method and field references that must be resolved at run time. "
"Each runtime constant pool is allocated from the Java virtual machine's method area (§3.5.4)."
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6656
"The Java virtual machine has a method area that is shared among all Java virtual machine threads. [...] It stores per-class structures such as the runtime constant pool, field and method data, and the code for methods and constructors [...]"
http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html#73272
"The Java virtual machine maintains a per-type constant pool (§3.5.5),"
"A string literal (§2.3) is derived from a CONSTANT_String_info structure (§4.4.3) in the binary representation of a class or interface. The CONSTANT_String_info structure gives the sequence of Unicode characters constituting the string literal.
The Java programming language requires that identical string literals (that is, literals that contain the same sequence of characters) must refer to the same instance of class String. In addition, if the method String.intern is called on any string, the result is a reference to the same class instance that would be returned if that string appeared as a literal. Thus,
("a" + "b" + "c").intern() == "abc"
must have the value true.
To derive a string literal, the Java virtual machine examines the sequence of characters given by the CONSTANT_String_info structure.
If the method String.intern has previously been called on an instance of class String containing a sequence of Unicode characters identical to that given by the CONSTANT_String_info structure, then the result of string literal derivation is a reference to that same instance of class String.
Otherwise, a new instance of class String is created containing the sequence of Unicode characters given by the CONSTANT_String_info structure; that class instance is the result of string literal derivation. Finally, the intern method of the new String instance is invoked."
Edited by: jverd on Jan 23, 2012 8:09 AM

Similar Messages

  • Allow edit strings in constant pool + show index of constant pool items

    Please allow us to edit strings in constant pool and show the numeric index of constant pool items.

    Editing the strings in the constant pool takes some work since you have to re-adjust several length values throughout the SWF. However, SWF Investigator does show the index of the constant pool items in the disassembler tab.  Any time a constant is used, you will see " //nameIndex = #" at the end of the line. This number will represent the index of that constant in the constant pool.

  • Resolving constant-pool of clazz Luicc/access/fileadministration/AdminFileV

    Hi,
    can anyone help? I have this problem whenever I import the uicc.access.fileadministration into the Eclispe 3.1 (with JCOP plugin) and building my project.
    The full error string is "resolving constant-pool of clazz Luicc/access/fileadministration/AdminFileView; failed: no such clazz Luicc/access/UICCException;"
    It's weird because the uicc.access.UICCException is right there & it can be build successfully (without the fileadminstration package). But when I import the uicc.access.fileadministration package & build the project, the build errors appear.
    Many Thanks!!!
    Eric

    Hi,
    Thanks for your reply.
    I have tried to put the export file structure in the build path, but I am still getting the same error:
    resolving constant-pool of clazz Luicc/access/fileadministration/AdminFileView; failed: no such clazz Luicc/access/UICCException;
    Can you pls be specific on the steps to include the export file into the build path? I could be getting the steps wrong. Otherwise, do you have any suggestions?
    Thanks again.
    Eric

  • Whats a String constant pool?

    I was reading an article about weak references and came across a peice of code
       Map<String,String> map = new WeakHashMap<String, String>();
          map.put(new String("Scott"), "McNealey");They also said
    if you don't call new String(), the reference for the map key will be to the system's string constant pool. This never goes away, so the weak reference will never be released. To get around this, new String("Scott") creates a reference to the reference in the string constant pool. The string contents are never duplicated. They stay in the constant pool. This simply creates a separate pointer to the string constant in the pool.
    I never heard of String constant pool could any one enlighten me. I didnt get the point of what above paragraph says also.
    Jubs

    No it won't: it will only be removed when the garbage collector rears
    its ugly head. Until then the reference will be present in the map.Okay it was unprecise. The item MAY be removed immediately after it
    has been inserted because the key object is only referenced from the
    Map itself.Yes, that is true, but mind though: any object that still has a strong
    reference to it will not be removed from that map. I use such weak maps
    for localization reasons a lot. When a localization changes (while the
    application is running), a whole lot of visual components must have
    their text part changed. They are all stored in such a weak reference map.
    Of course quite some visual components can be garbage collected
    at some time (think of labels etc. in JDialogs after the dialog has been
    disposed).
    These maps are ideal for those purposes.
    kind regards,
    Jos

  • "Illegal UTF8 string in constant pool"

    I'm running a jsp application on JRun 3.1 with an Appache web server. Every once in while I get this error when trying to access a jsp. "Illegal UTF8 string in constant pool". If I hit refresh or reload the page loads fine. It appears to be random and not very often. Does anybody know what is causing this or what I might do to eliminate this problem? Thanks

    Thanks for your reply. However the answer to that question does not appear to apply here. I'm not using the URLConnection.getInputStream().read() method. on my jsp page. The entire error is below:
    javax.servlet.ServletException: jrun__sub_topic2ejspe (Illegal UTF8 string in constant pool)
    java.lang.ClassFormatError: jrun__sub_topic2ejspe (Illegal UTF8 string in constant pool)
    at java.lang.ClassLoader.defineClass0(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:438)
    at allaire.jrun.servlet.JSPClassLoader.loadClass(JSPClassLoader.java:82)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
    at allaire.jrun.servlet.JRunServletLoader.loadServletInstance(JRunServletLoader.java:221)
    at allaire.jrun.servlet.JRunServletLoader.loadServletInstance(JRunServletLoader.java:190)
    at allaire.jrun.servlet.JRunServletLoader.loadServlet(JRunServletLoader.java:177)
    at allaire.jrun.servlet.JRunServletLoader.reloadServlet(JRunServletLoader.java:161)
    at allaire.jrun.servlet.JRunSE.reloadServlet(JRunSE.java:1377)
    at allaire.jrun.jsp.JSPServlet.loadPage(JSPServlet.java:205)
    at allaire.jrun.jsp.JSPServlet.service(JSPServlet.java:169)
    at allaire.jrun.servlet.JRunSE.service(JRunSE.java:1013)
    at allaire.jrun.servlet.JRunSE.runServlet(JRunSE.java:925)
    at allaire.jrun.servlet.JRunRequestDispatcher.forward(JRunRequestDispatcher.java:88)
    at allaire.jrun.servlet.JRunSE.service(JRunSE.java:1131)
    at allaire.jrun.servlet.JvmContext.dispatch(JvmContext.java:330)
    at allaire.jrun.jrpp.ProxyEndpoint.run(ProxyEndpoint.java:382)
    at allaire.jrun.ThreadPool.run(ThreadPool.java:272)
    at allaire.jrun.WorkerThread.run(WorkerThread.java:75)
    As mentioned before the error occurs infrequently,and randomly. If you refresh or reload the page everything works fine. Does anybody know what might cause this error and/or what I can do to prevent it. Thanks

  • Lifetime and behavior of the String Constant Pool

    If you 'inline' a String constant in Java, I'm aware in the VM spec that it says this String is put in the constant pool.
    What is the lifetime of the constant pool and what is it tied to? Is there one constant pool per Class, per Class instance, or per VM?
    If an instance is GC'd, do it's constants previously moved to the constant pool get destroyed, or do they live on until I create another instance of that Class?
    Thanks, Kevin

    Is the constant pool created at compile time and written into the Class file?Yes.
    Each class has it's own constant pool which contains constant values and references to other classes and fields.
    It is created a compile time.
    A class (definition) is loaded by a classloader at runtime.
    In theory you could have the same class loaded twice by different classloaders and each would have a copy of the class definition.
    As far as I know, a class definition can only be removed from memory by nulling/garbage collecting the classloader that loaded it.
    regards,
    Owen

  • Question about String constant pool

    Is there is any function available to find how many Sring literal in String Constant pool

    Well, there's stuff like BCEL.
    But it may not do what you want.
    Why do you want to find out what's in the constant pool?

  • Jvm runtime constant pool

    Hi there,
    this is my query:
    As we know java builds a constant pool for all the symbols if a class in a class file. This class file when loaded by VM, the constant pool is translated into the runtime constant pool in the method area of the Heap.
    Does any one know if there is only 1 runtime constant pool per class or is it 1 per class instance(Object). The JVM spec did not clarify on this. Also if its 1 per class then how does the JVM know where all the instances of a class are while resolving references and also when garbage collecting???
    thank a lot.
    Rishabh.

    rishabhchandra wrote:
    As we know java builds a constant pool for all the symbols if a class in a class file. This class file when loaded by VM, the constant pool is translated into the runtime constant pool in the method area of the Heap.
    Symbols?
    It builds it for literals.
    Does any one know if there is only 1 runtime constant pool per class or is it 1 per class instance(Object). Certainly not by instance.
    And more likely it is per class loader. A class can't be unloaded unless its class loader is unloader so there would be no point in managing a pool per class when it could be managed via the class loader.
    The JVM spec did not clarify on this. Nor should it. That is an implementation detail of how the VM is implemented.
    Also if its 1 per class then how does the JVM know where all the instances of a class are while resolving references and also when garbage collecting???Not sure that question is sensical. The only reason it would need to know is because it is using the class. And the class might not own the pool, but it certainly references it.
    As for garbage collection that only occurs in the context of this question if the class loader is collected.

  • Char. strings w/o text elements will not be translated:

    Hi ,
    I have a few constants in my program.
    But when i declare them as
    text(12) type c value ' hello world',
    In the code inspector i encounter "Char. strings w/o text elements will not be translated:" error.
    Can somebody h

    Hi,
    Text elements are required for Translating purpose. You have declared a free string but haven't declared the corresponding text element for that string. Thus the error. Please double click on the string and create the text element to get rid of the error in code inspector. This is not a mandatory thing but should be done.
    Hope it helps.
    Regards,
    R

  • How to construct the constant pool?

    Greetings,
    I seems to have a little bit of a problem.
    I have a text file, generated by the javap -c <class_name> command,
    i.e.:
    javap -c myClass > myClass.txt
    This myClass.txt is the input I've got. I do not have the myClass.class, from which it was generated.
    What I wish to do, is to generate, from this text file, a leagal, runnable, class file (i.e., myClass.class).
    But, I have problems understanding how to construct the constant pool array.
    I have read the VM spec (java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html).
    The thing is, that it does not explain how to extract the needed information from the text file.
    Can someone assist?
    Would appreciate,
    Ohad.

    Compiled from Hello.java
    public class Hello extends java.lang.Object {
        public Hello();
        public static void main(java.lang.String[]);
    Method Hello()
       0 aload_0
       1 invokespecial #6 <Method java.lang.Object()>
       4 return
    Method void main(java.lang.String[])
       0 new #4 <Class java.util.Timer>
       3 dup
       4 invokespecial #7 <Method java.util.Timer()>
       7 new #2 <Class Hello$1>
      10 dup
      11 invokespecial #5 <Method Hello$1()>
      14 lconst_0
      15 lconst_1
      16 invokevirtual #8 <Method void schedule(java.util.TimerTask, long, long)>
      19 returnWell in this example, you have opcodes with arguments which are expressed as (for example) "#7 <Method java.util.Timer()>". This describes a constant pool element. I assume #7 refers to the location within the constant pool, and the text description tells you that it's an item of type method, and gives you the method name. So for all arguments expressed in this form, you'll need to reconstruct a constant pool item.

  • Is there any change in the constant pool entires with JDK1.4?

    Hi,
    Here is my simple java class,
    class Base
    String manuf = "MRF";
    class Derived extends Base
    Derived() {
    manuf = "ABC";
    After compiling this class with JDK 1.3 and JDK1.4, i could see the difference in constant pool entries
    so please let me know more about these cahnges.
    P.S. : written a java program TClass.java to browse the constant pool entries.
    i.e if compiled with JDK1.3 , constant pool entries looks as follows,
    E:\bugs\jdk1.4\pramila>java TClass E:\bugs\jdk1.4\pramila\Derived.class
    There are 21 + 1 entries in the Constant Pool:
    Index Tag Reference(s)/Value(s)
    1 10 5 15
    2 8 16
    3 9 5 17
    4 7 18
    5 7 19
    6 1 <init>
    7 1 ()V
    8 1 Code
    9 1 LineNumberTable
    10 1 LocalVariableTable
    11 1 this
    12 1 LDerived;
    13 1 SourceFile
    14 1 Test.java
    15 12 6 7
    16 1 ABC
    17 12 20 21
    18 1 Derived
    19 1 Base
    20 1 manuf
    21 1 Ljava/lang/String;
    There are 1 methods:
    Code array in method <init> of length 11 starting at byte 231.
    If compiled with JDK1.4 constant pool entries looks as follows,
    E:\bugs\jdk1.4\pramila>java TClass E:\bugs\jdk1.4\pramila\Derived.class
    There are 21 + 1 entries in the Constant Pool:
    Index Tag Reference(s)/Value(s)
    1 10 5 15
    2 8 16
    3 9 4 17
    4 7 18
    5 7 19
    6 1 <init>
    7 1 ()V
    8 1 Code
    9 1 LineNumberTable
    10 1 LocalVariableTable
    11 1 this
    12 1 LDerived;
    13 1 SourceFile
    14 1 Test.java
    15 12 6 7
    16 1 ABC
    17 12 20 21
    18 1 Derived
    19 1 Base
    20 1 manuf
    21 1 Ljava/lang/String;
    There are 1 methods:
    Code array in method <init> of length 11 starting at byte 231.
    There is a change in the index 3 can be noticed.
    i.e
    with JDK1.3 it is "3 9 5 17"
    with JDK1.4 it is "3 9 4 17"
    Thanks in advance.
    Pramila

    javac v1.4 emits by default Java 1.2 compatible .class files while all javac implementations since between 1.1.0 and 1.3.1 emit byte default Java 1.1 .class files.
    Check to see what effect using the -target option in javac to get the two versions to produce Java 1.1, 1.2, or 1.3 .class files.
    Chuck

  • Exception with newFixedThreadPool -  Illegal constant pool index

    Hi,
    I got the following exception :
    Exception in thread "main" java.lang.ClassFormatError: Illegal constant pool index 1536 for method signature in class file java/util/concurrent/LinkedBlockingQueue
         at java.util.concurrent.Executors.newFixedThreadPool(Unknown Source)
    When executing the following line:
    ExecutorService es = Executors.newFixedThreadPool(10);
    What this error mean ?
    Thanks

    From the javadoc for java.lang.ClassFormatError:
    'Thrown when the Java Virtual Machine attempts to read a class file and determines that the file is malformed or otherwise cannot be interpreted as a class file.'
    Reinstall.

  • Class format error: Invalid constant pool tag found

    I am simply attempting to create an instance of an object and I get Class format error: Invalid constant pool tag found. Does anyone know what this means and how to fix it?
    Thanks.

    If you're compiling with J2SDK 1.4 or higher, you need to use "-target 1.1" on the javac command line.
    Also make sure you're not using any float constants such as 1.0 in your code.

  • What does "Illegal Constant Pool Type" error signify ?

    Hello,
    I have developed an application on a windows system that connects to a database, places values onto an object, and displays on a screen. When I run on a windows environment everything works fine. When I export to my external server, which is linux system, I get an "Illegal Constant Pool Type" error.
    What does this mean and how can I rectify?
    The error message can be found at:
    http://www.blazingvibes.com/blazinvibes/indexhome.jsp
    Thank you all for your help.

    No idea since I can't see the error or code.
    And I don't know about anyone else but I don't click on links unless I know the source, so its current location isn't going to help in that matter.
    Presumably you are doing printStackTrace() so the location of the error is obvious.

  • Reflection error (Illegal constant pool index)

    Heya,
    I use reflection to invoke Java classes and I get Error:
    java.lang.ClassFormatError: AppendToElement (Illegal constant pool index)
         at java.lang.ClassLoader.defineClass0(Native Method)
         at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
         at java.lang.ClassLoader.defineClass(ClassLoader.java:431)
         at XCOClassLoader.loadClass(XCOClassLoader.java:74)
    // AppendToElement is name of class I want to invoke
    I have bunch of classes from someone else, which I need to invoke and I get this error for all of them. When I invoke classes written (and compiled) by me, everything is OK.
    It seems that the problem is that, these external classes were compiled with different version of Java. As they were written by someone else and I don't have source code, I can't recompile them.
    Is cause of that problem, different JVM versions ? Is there a way how to correct it on runtime ?
    Thanks,
    Michal

    The problem isn't one of versions. The files have become corrupted somehow. I suggest you ask for another copy.

Maybe you are looking for