JVM系列文章(五): Java:String字符串内存分析

1.Java中内存分析:

栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。例如,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动 释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。 
   
堆(heap):存放所有new出来的对象。堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为 数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。(即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。) 
   
常量池(constant pool):指的是在编译期被确定,在堆中分配出来的一块存储区域,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也String常量和基本类型常量(float、int等),可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。

2.了解了Java内存结构后,我们开始解析 Java 中的 String 数据类型。

2.1.首先我们需要知道String不属于8种基本数据类型,是一种引用数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

2.2.new String()和new String(””)都是申明一个新的空字符串,是空串不是null。

3.我们通过一些事例分析String数据类型。 
String的定义方法我们一般使用以下三种方式:

1.使用new,如:String s1 = new String(“myString”); 
2.直接定义,如:String s1 = “myString”; 
3.串联生成,如:String s1 = “my” + “String”;

3.1.使用new,如:String s1 = new String(“myString”) 
在程序编译期,编译程序先去字符串常量池检查,是否在z字符串“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果存在的话,则不用重新开辟空间,保证常量池中只有一个“myString”常量,节省内存空间。然后在内存堆中开辟一块空间存放new出来的String实例,在栈中开辟一块空间,命名为“s1”,存放的值为堆中String实例的内存地址,这个过程就是将引用s1指向new出来的String实例。 
3.2.直接定义,如:String s1 = “myString” 
在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果存在的话,则不用重新开辟空间。然后在栈中开辟一块空间,命名为“s1”,存放的值为常量池中“myString”的内存地址。 
3.3.串联生成,如:String s1 = “my” + “String” 
我们都知道String是不可变的,”my” + “String”程序运行时来动态分配并将连接后的新地址赋给s1

4.提供一些博客,关于Java内存管理和String数据类型。 
http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html 
http://my.oschina.net/xiaohui249/blog/170013 
http://blog.csdn.net/sureyonder/article/details/5569366 
http://blog.csdn.net/gaopeng0071/article/details/11741027 
http://fanyo.iteye.com/blog/427097
--------------------- 
作者:BAOLIANG196 
来源:CSDN 
原文:https://blog.csdn.net/wangyanguiyiyang/article/details/48582501 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_21517413/article/details/85269135