How can I create a memory leak in Java?

后端 未结 30 1741
没有蜡笔的小新
没有蜡笔的小新 2020-11-21 22:26

I just had an interview, and I was asked to create a memory leak with Java.

Needless to say, I felt pretty dumb having no clue on how to eve

30条回答
  •  孤街浪徒
    2020-11-21 22:53

    Here's a simple/sinister one via http://wiki.eclipse.org/Performance_Bloopers#String.substring.28.29.

    public class StringLeaker
    {
        private final String muchSmallerString;
    
        public StringLeaker()
        {
            // Imagine the whole Declaration of Independence here
            String veryLongString = "We hold these truths to be self-evident...";
    
            // The substring here maintains a reference to the internal char[]
            // representation of the original string.
            this.muchSmallerString = veryLongString.substring(0, 1);
        }
    }
    

    Because the substring refers to the internal representation of the original, much longer string, the original stays in memory. Thus, as long as you have a StringLeaker in play, you have the whole original string in memory, too, even though you might think you're just holding on to a single-character string.

    The way to avoid storing an unwanted reference to the original string is to do something like this:

    ...
    this.muchSmallerString = new String(veryLongString.substring(0, 1));
    ...
    

    For added badness, you might also .intern() the substring:

    ...
    this.muchSmallerString = veryLongString.substring(0, 1).intern();
    ...
    

    Doing so will keep both the original long string and the derived substring in memory even after the StringLeaker instance has been discarded.

提交回复
热议问题