java - 我们是否在堆的 PermGen 区域中为所有原始类型提供了池?

标签 java heap-memory permgen

我知道堆的 PermGen 区域中的字符串池的概念。所以当我们做类似的事情时

String firstString = "Stack";
String secondString = "Stack";

两个引用 firstStringsecondString 都指向池中的同一个对象。但我对类型为 int 的变量进行了同样的尝试。

    int firstInt = 5;
    int secondInt = 5;

    if(firstInt == secondInt) {
        System.out.println("Both point to same allocated memory");
    } else {
        System.out.println("Both point to different allocated memory");
    }

结果是都指向同一个对象当我尝试

Integer firstInteger = new Integer(2);
Integer secondInteger = new Integer(2);

    if(firstInteger == secondInteger) {
        System.out.println("Both point to same object");
    } else {
        System.out.println("Both point to different object");
    }

输出是都指向不同的对象

我对 char 进行了同样的尝试,结果是相似的。所以我的问题是我们是否为所有原始类型(如 intchar)提供池?当我们实际使用 new () 创建具有相同内容的对象时,如上面提到的第二种情况,是克隆并存储在同一池区域中的对象还是在池外?

最佳答案

您的帖子中存在太多误解,甚至很难开始解释。得到一些像样的书。现在,一些可能对您有帮助的事实:

  • String 不是原始类型,
  • 没有原始类型池,因为不能引用原始类型(说它们只保存在堆栈中的答案是完全错误的!)
  • 如果您使用new,您无论如何都会绕过池;所以执行 new String("ala") 总是会创建一个新的 String 对象;你不能改变 new 的语义;
  • 如果你想使用可用的池,在对象上使用工厂方法(如 Integer.valueOf),它们将在某种程度上 - 池实例(将所有可能的池化是不可行或有益的IntegersFloats 等的值)。

关于java - 我们是否在堆的 PermGen 区域中为所有原始类型提供了池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737078/

相关文章:

c - 如何在 C 中对 malloc() 数组进行一行赋值?

tomcat - 在 Tomcat 中使用 JRuby on Rails 追踪 PermGen 问题

java - 增加永久空间

java序列化导致utfdataformaexception

java - 如果路径值为空,则设置默认值

java - Hibernate 搜索日期

java - java中Mongodb之间的查询

memory - HTOP 中的 VIRT 列是什么?内存开销?

java - java中字符串是如何传入方法的(就内存而言)

Java8 已完全从其内存区域中删除了永久代空间。它会完全阻止内存泄漏问题吗? ...