`

(转)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内存分配详解

    和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会 被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据...

    Java程序设计基础:创建String字符串.pptx

    创建String对象 String类型 直接赋值方式,例如:String s1= "Welcome to Java"; 含义:字符串常量直接初始化一个String对 象,赋值给引用变量,s1指向字符串对象。 字符串变量中存储的是对象的地址。 例 1: String...

    java内存监控工具jvisualvm

    监控工具VisualVM VisualVM 是Netbeans的profile子项目,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。...

    Java的内存机制(堆和栈)简单理解

    偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?  public class A{  public int i=1;  public static A a1 = new A();  public static void mian(String args[]){  int c = ...

    [java]读书笔记整理:一切都是对象

    然而,s指向的String对象仍然继续占据内存空间。在这一小段代码中,我们似乎无法再访问这个对象,因为对它唯一的引用已超过了作用域的范围。[后续在说,在程序执行过程中,怎样传递和赋值对象引用]。 事实证明,由...

    String a="hello" String b="hello" a==b 返回true的问题分析

    //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...

    Java面向对象程序设计笔记

    2.对String对象操作的类 24 3. 对时间处理的类 25 4. 对系统处理的类: 26 5. 数据运算的类 27 6. 正则表达式 27 第七章 异常处理 32 第八章Oracle数据库基础 32 第九章JDBC编 32 第十章GUI编程 ...

    Java中String类和IO流——学习小结

    String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象。String类对象创建后是一个常量,有final修饰,不能被修改。字符串重新赋值不是修改,而是生成了一个新的字符串,原先的字符串...

    java期末复习第讲面向对象程序设计.pptx

    2023年5月29日 jdk中常用的包 java.lang----包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。 java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,...

    Java内存分配分析/栈内存、堆内存

    首先学习JVM相关需要需要内存的组成。  基本内容  · 堆  java动态创建对象,即对于new的一个实例对象。但是需要注意的是该实例对象的...  即JVM为每个已加载的类型开辟一块区域,包括基本类型和String类型(其

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Java核心基础+Java中的数据在内存中的存储

    1、内存中的堆(stack)与栈(heap) 2、Java中数据在内存中的存储 基本数据类型的存储 ...3、Java内存分配中的栈 Java内存分配中的堆 4、String.intern() 5、关于equasl()与== 6、关于String是不可变的

    class转成java源码-compilib:在运行时和内存中将Java源代码编译为Class对象

    类转成java源码相容 一个小的实用程序库,用于在运行时将Java源代码编译为* .class对象。 主要针对编写单元测试: Set< String > sources = new HashSet<> (); sources . put( " package a.b; \n " + " public...

    Java开发技术大全(500个源代码).

    useString.java 使用String示例 YanghuiTri.java 构造和显示杨辉三角 第6章 示例描述:本章学习Java的异常处理。 demoException_1.java 异常示例1 demoException_2.java 异常示例2 demoException_3.java 异常...

    Java中堆和栈的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存...

    evergreen:Java进程间持久性内存映射对象

    ====== Java进程间持久性内存映射对象 实现的功能 使用内存映射文件(MMF); 线程安全的Evergreen 对象; 当跨多个JVM(通过使用目标MMF上的锁定位)进行访问时,可以安全地读取/写入文件中的已保存实例。 低...

    java面试常见问题

    String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用...

    java源码包4

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

Global site tag (gtag.js) - Google Analytics