`

(转)Java之内存分析和String对象

 
阅读更多

Java之内存分析和String对象

  Java中内存分析:

  栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
  堆(heap):存放所有new出来的对象。
  常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float、int等)。另外,可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。
  静态存储:存放静态成员(static定义的)。

  

1)

  String a = "abc";①
  String b = "abc";②
  分析:
  ①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象,②执行时,因为常量池中存在"abc"所以就不再创建新的String对象了。
 
2)
  String   c   =   new   String("xyz");①
  String   d   =   new   String("xyz");②
  分析:①Class被加载时,"xyz"被作为常量读入,在常量池(constant pool)里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆(heap)里创建这个new   String("xyz")对象;②由于常量池(constant pool)中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
3)
  String   s1   =   new   String("xyz");     //创建二个对象(常量池和栈中),一个引用 
  String   s2   =   new   String("xyz");     //创建一个对象(栈中),并且以后每执行一次创建一个对象,一个引用 

  String   s3   =   "xyz";     //创建一个对象(常量池中),一个引用   
  String   s4   =   "xyz";     //不创建对象(共享上次常量池中的数据),只是创建一个新的引用
4)
复制代码
public class TestStr { 
  public static void main(String[] args) { 
    // 以下两条语句创建了1个对象。"凤山"存储在字符串常量池中 
    String str1 = "凤山"; 
    String str2 = "凤山"; 
    System.out.println(str1==str2);//true 
     
    //以下两条语句创建了3个对象。"天峨",存储在字符串常量池中,两个new String()对象存储在堆内存中 
    String str3 = new String("天峨"); 
    String str4 = new String("天峨"); 
    System.out.println(str3==str4);//false 
     
    //以下两条语句创建了1个对象。9是存储在栈内存中 
    int i = 9; 
    int j = 9; 
    System.out.println(i==j);//true 
     
    //由于没有了装箱,以下两条语句创建了2个对象。两个1对象存储在堆内存中 
    Integer l1 = new Integer(1); 
    Integer k1 = new Integer(1); 
    System.out.println(l1==k1);//false 
  //以下两条语句创建了1个对象。1对象存储在栈内存中。自动装箱时对于值从127之间的值,使用一个实例。
    Integer l = 20;//装箱 
    Integer k = 20;//装箱 
    System.out.println(l==k);//true 
//以下两条语句创建了2个对象。i1,i2变量存储在栈内存中,两个256对象存储在堆内存中 
    Integer i1 = 256; 
    Integer i2 = 256; 
    System.out.println(i1==i2);//false 
  } 
} 
复制代码
分享到:
评论

相关推荐

    java内存分配和String类型的深度解析Java开发J

    Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。栈用于存储基本类型变量和对象引用,每个线程都有自己的独立栈空间。当创建一个方法时,栈会为该方法分配一块内存,用于存储局部变量。...

    String对象的内存分析

    Java中的字符串对象`String`是编程中非常常见且重要的元素,它们在内存管理上有一些特殊之处,这在理解和优化程序性能时尤其关键。本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念...

    创建string对象过程的内存分配:

    #### 三、创建String对象的方式及内存分配分析 ##### 1. 使用字符串字面量 当使用字符串字面量创建 `String` 对象时,如 `String s = "abc";`,内存分配过程如下: - JVM 首先检查 **常量池** 中是否已经存在一个...

    (Java)json和String互转必备Jar包

    总的来说,这个"(Java)json和String互转必备Jar包"为Java开发者提供了一个便捷的工具,使他们能够在项目中方便地处理JSON数据,无论是从网络获取,还是在本地存储和处理。掌握好这些库的使用,对于提升开发效率和...

    Java String对象的经典问题

    ### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...

    Java的内存管理机制分析

    通过对Java内存管理机制的深入分析,我们可以了解到Java如何高效地管理和利用内存资源。理解这些机制对于优化Java应用程序的性能至关重要,特别是在处理大规模数据集或多线程环境时。此外,合理配置JVM参数和选择...

    我们一起学Java之String

    这一特性对于Java内存管理有着重要影响,因为String对象会存储在方法区的字符串常量池中,以避免重复创建相同的字符串,从而提高内存使用效率。 在JDK 8版本中,字符串常量池的位置发生了变化,从方法区移至Java堆...

    Java 之 String 类型

    - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如,`String str = "Hello"` 创建了一个字符串对象。 - 因为不可变性,每次对字符串进行修改(如使用`concat()`或`substring()`)...

    Java内存分析工具ji

    Java内存分析工具ji是Java程序员不可或缺的工具之一,它可以帮助开发者快速地排查和解决Java内存泄漏问题。在本文中,我们将详细介绍Java内存泄漏的定义、原因、排查方法、解决方案,并提供一个简单的Java代码示例来...

    java String 使用详解

    本文将详细介绍 Java String 的使用方法,包括 String 对象的初始化、字符串的常见操作等。 一、String 对象的初始化 String 对象的初始化是一种特殊的语法,Java 提供了简化的初始化方法,例如: String s = ...

    Java的内存分析

    ### Java的内存分析 在Java开发中,理解Java应用程序如何管理和使用内存是非常重要的。本文将通过对一个具体的Java实例——`QingWa`类的分析,深入探讨Java在底层执行过程中涉及的不同内存区域及其作用。 #### 1. ...

    JAVA对象所占内存大小计算例子

    总结起来,Java对象的内存大小计算涉及对象头、实例数据和对齐填充的综合考虑。通过`Unsafe`类或`Instrumentation`接口,我们可以获取这些组成部分的具体大小,进而了解一个Java对象在内存中的占用情况。这样的知识...

    Java中的String对象是不可变的吗Java开发Jav

    理解String对象的不可变性对于Java开发者来说至关重要,因为它影响着代码的编写、内存管理和多线程环境下的行为。 首先,不可变性意味着一旦一个String对象被创建,它的值就不能再被修改。例如: ```java String ...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...

    Android byte[] 和 String互相转换

    `getBytes()`和`new String()`操作可能会创建大量临时对象,对内存造成压力。可以考虑使用`ByteBuffer`或`CharBuffer`来提高效率。 4. **空值处理**:如果输入为`null`,确保在转换前进行检查,防止空指针异常。 5...

    String对象创建问题

    在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...

    小心String的陷阱——深入剖析Java中String的处理机制

    标题和描述均强调了在Java中处理`String`对象时可能遇到的陷阱,尤其是在理解和使用`String`的处理机制上。文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。...

    Java-Java String和StringBuilder

    首先,`String`类在Java中是不可变的,这意味着一旦创建了一个String对象,就不能改变它的值。String对象在内存中的表示方式是字符数组,其值在创建后就固定不变。这确保了String对象的线程安全,因为在多线程环境下...

    java对象转换String类型的三种方法共1页.pdf

    在Java编程语言中,将对象转换为String类型是常见的操作,尤其在日志记录、输出显示或与其他数据格式交互时。本文件“java对象转换String类型的三种方法共1页.pdf”可能涵盖了以下三种主要的转换方式: 1. **...

Global site tag (gtag.js) - Google Analytics