相关疑难解决方法(0)

239
推荐指数
9
解决办法
27万
查看次数

String Literal Pool是String对象或对象集合的引用的集合

看完SCJP Tip Line的作者Corey McGlone撰写关于javaranch网站的文章后,我感到很困惑.命名为Strings,Literally和SCJP Java 6程序员指南,由Kathy Sierra(javaranch的联合创始人)和Bert Bates撰写.

我将尝试引用Corey先生和Kathy Sierra女士引用的关于String Literal Pool的内容.

1.据Corey McGlone先生说:

  • String Literal Pool是指向String对象的引用的集合.

  • String s = "Hello"; (假设Heap上没有名为"Hello"的对象),将"Hello"在堆上创建一个String对象,并在String Literal Pool(Constant Table)中放置对该对象的引用

  • String a = new String("Bye");(假设Heap上没有名为"Bye" new的对象,操作符将强制JVM在堆上创建一个对象.

现在,"new"对于创建String及其引用的运算符的解释 在本文中有点令人困惑,所以我将文章本身的代码和解释放在下面.

public class ImmutableStrings
{
    public static void main(String[] args)
    {
        String one = "someString";
        String two = new String("someString");

        System.out.println(one.equals(two));
        System.out.println(one == two);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new." 在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.

这是解释它的图表..

在此输入图像描述

那么它是否意味着,String Literal Pool也有对这个Object的引用?

以下是Corey McGlone撰写文章的链接

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

2. …

java string memory-management

69
推荐指数
1
解决办法
2万
查看次数

Java堆栈和堆内存管理

我想知道如何在以下程序中分配内存:

public class MemoryClass {

    public static void main(final String[] args) {
        int i = 0;
        MemoryClass memoryClass = new MemoryClass();
        memoryClass.myMethod(memoryClass);
    }

    private void myMethod(final Object obj) {
        int i = 1;
        String s = "HelloWorld!";

    }

}
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,下图描述了内存分配的发生方式:
基本运行时内存分配


在上图中,堆栈存储器中的内存,objs实际上是对它们放置在堆内存中的" 实际对象 " 的引用.
以下是我想到的一系列问题:

  1. 哪里的方法小号存储?
  2. 如果我创建了另一个MemoryClass内部对象myMethod,JVM会在堆栈内存中再次为相同的方法分配内存吗?
  3. JVM myMethod是否会在执行完成后立即释放分配的内存,如果是,它将如何管理问题2中提到的情况(仅当JVM多次为同一方法分配内存时才适用).
  4. 如果我只声明了s并且没有初始化它,那么JVM是否仍会为所有java.lang.String类的方法分配内存,如果是这样,为什么呢?

java memory memory-management heap-memory stack-memory

19
推荐指数
2
解决办法
1万
查看次数

字符串和字符数组之间的差异

这些声明如何彼此不同?

String s="MY PROFESSION";
char c[]="MY PROFESSION";
Run Code Online (Sandbox Code Playgroud)

在每种情况下内存分配怎么样?

java

8
推荐指数
1
解决办法
2万
查看次数

字符串池是在PermGen区域或Heap的Object区域中创建的

是作者说的

3)字符串池是在Heap的PermGen区域中创建的,垃圾收集可以在perm空间中进行,但依赖于JVM到JVM.顺便提一下,从JDK 1.7更新,String池被移动到创建对象的堆区域.

它有什么具体的原因吗?我无法在网上找到任何内容.有什么影响?

java string jvm java-memory-model

5
推荐指数
2
解决办法
9736
查看次数

访问哪个字符串对象?

我们知道当我们用new关键字创建新的String对象时,如下所示:

String str = new String("New String Will Have Two Objects");
Run Code Online (Sandbox Code Playgroud)

它将创建两个对象,一个在java堆内存上,另一个在String池上.

那么当我们调用访问"str"哪个字符串对象被访问时(堆对象或字符串池对象)?

根据我的理解,可以访问字符串池对象,如果是,那么堆对象会发生什么?

java string

2
推荐指数
1
解决办法
85
查看次数

以前分配的对象的垃圾收集

请考虑以下情形:

String dude = "Harold";

//some stuff

dude = "Kumar";
Run Code Online (Sandbox Code Playgroud)

一旦dude被赋予其第二个"Kumar"值,就会出现一个与"Harold"分开的全新对象.我想知道的是,因为"哈罗德"显然没有用,它是立即收集垃圾还是在JVM认为合适的时候收集?

更新:

仅仅因为dude已经设置为新值(对象)并不一定意味着已经消除了对旧对象的所有引用.如果另一个引用dude在"Harold"之后和"Kumar"之前调用,它显然会保留"Harold"对象:

String dude = "Harold";

//some stuff

String interim = dude;

dude = "Kumar";

System.out.println("dude = " + dude);
System.out.println("interim = " + interim);
Run Code Online (Sandbox Code Playgroud)

版画

dude = Kumar
interim = Harold
Run Code Online (Sandbox Code Playgroud)

因此,有比我最初想象的更多的考虑因素,因此初始值不一定必须在更改后超出范围.

java garbage-collection

0
推荐指数
1
解决办法
709
查看次数