Java之内存分析和String对象

http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html

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对象,布布扣,bubuko.com

时间: 2024-10-14 08:18:30

Java之内存分析和String对象的相关文章

Java程序内存分析:使用mat工具分析内存占用

在工作中可能会遇到内存溢出这种灾难性的问题,那么程序肯定是存在问题,找出问题至关重要,上一篇文章讲了jmap命令的使用方法,当然用jmap导出的文件我们也看不懂啊,那就交给memory analyzer(mat)这个工具,让他帮助我们来观察程序的内存分布情况吧. 1. 用jmap生成堆信息 2. 将堆信息导入到mat中分析 3. 生成分析报告 Histogram Dominator Tree Top consumers Leak Suspects MAT 不是一个万能工具,它并不能处理所有类型的

java基础复习之对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

String类型是实际工作中经常用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象可以用new创建,例如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其他类有些特殊,可以使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string"

JVM内存模型及String对象内存分配

昨天看了一篇关于<Java后端程序员1年工作经验总结>的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型. 1.JVM运行时数据区域 关于JVM内存模型之前也了解过一些,也是看过就忘,好记性比如烂笔头,记下来吧.参考此文章http://chenzhou123520.iteye.com/blog/1585224 图1 JVM运行时数据区域 (1).程序计数器(Program Counter Register): 程序计数

Java 程序内存分析

转自:http://www.iteye.com/topic/528230 java程序内存主要分为了2个部分,包括stack segment(栈内存区).heap segment(堆内存区). 在分析Java程序内存分配情况时,我们从下面这个经常被使用的例子开始吧. 下面程序将打印什么呢? String s1 = new String("abc"); String s2 = new String("abc"); System.out.print(s1.equals(

如何在JAVA中比较两个String对象

问题 最近写程序的时候,遇到了需要比较两个 String 对象是否相等的情况,我习惯性的写了形如if(a == "a"){}的语句,IDEA 跳出警告,内容如下: String values are compared using '==', not 'equals()'. 也就是说我刚刚那句话应该写成if(a.equals("a")){}才对,果然不再标红了. 说明 那么,为什么会这样呢?==和equals()分别是什么效果呢? 对于基本数据类型byte(字节型).

java 堆栈内存分析详解

计算机术语里面堆和栈代表不同的存储结构:stack-栈:heap-堆 所以java虚拟机(JVM)中堆和栈是两种内存 堆.栈对比 对比点 堆 栈 JVM中的功能 内存数据区 内存指令区 动静态 运行时数据区,动态地分配内存大小   存储数据 对象实例(保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中).对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的

java虚拟机内存分析

1.大致来说java虚拟机分为:堆  栈 栈在数据结构就是那个先进后出的栈.堆...这名字我一听就觉得大..毕竟我们形容东西多又没什么大多的组织的时候就是一堆一堆的....(原谅我发散性的思维,我是妹子...这样能理解我的思维么?) 栈是跟着线程走的.一个线程一个栈.一个方法一个栈帧(搞个这么专业的名字,其实就是一个方法的元数据包,比如记录了这个方法的名字,哪一行,参数,返回..等等等,你就想象下,你是虚拟机,你要执行个方法你要写什么信息...).栈的特点就是先进后出,正好跟方法的执行是匹配的,

java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?

String类型是实际工作中经经常使用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象能够用new创建,比如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其它类有些特殊,能够使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string&quo

Java中内存分析

//内存分为堆内存和栈内存,Test test=new Test()在内存中显示,前部分在栈内存中分配一个地址new Test()在堆内存分配分配相当于地址房间编号 package study1; public class test { public static void main(String args[]){ test test1=new test(); int date=9; Birthday B1=new Birthday(7,7,1970); Birthday B2=new Birt