常量池技术

转载 2015年07月07日 14:15:33

 

 

2.1 程序计数器寄存器(The pc Register)

2.2 栈

JVM为每个新创建的线程都分配一个栈.也就是说,对于一个Java程序来说,它的运行就是通过对栈的操作来完成的。它用来保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。3.用来保存加载方法时的帧,当嵌套方法调用时,嵌套越深,stack的内存就越晚才能释放,因此,在实际开发过程中,不推荐大家使用递归来进行方法的调用,递归很容易导致stack flow。

2.3 堆

每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

2.4 堆和栈的区别

2.5 方法区

JVM有一个被所有线程共享的方法区。方法区类似于传统语言的编译后代码的存储区,或者UNIX进程中的text段。它存储每个类结构例如常量池(constant pool),成员字段域和方法和构造函数,包含类和实例初始化和接口类型类型中用到的特殊方法的代码。

方法区在虚拟机启动时创建。尽管方法区在逻辑上是heap的一部分,简单的实现仍然可以选择对它既不回收也不压缩。

 

 

Byte  Character Boolean Short Integer Long实现了常量池技术,FloatDouble 没有实现常量池技术

 

·          Integer i1 = 40;  

·          Integer i2 = 40;

因为Integer实现了常量池技术,所以在池中i1i2指向同一个地址,故 i1 == i2 true

 

·          Double d1=1.0;  

·          Double d2=1.0; 

因为Double 没有实现常量池技术,所以Doubled1=1.0;相当于Double d1=new Double(1.0);

d2类同,各自new了一个对象,所以d1d2存放的指针不同,指向的对象不同,所以不相等

 

·  Integer i4 = new Integer(40);  

·  Integer i5 = new Integer(40); 

虽然Integer实现了常量池技术,但是他们各自new了一个对象。i4i5 均是引用类型,在栈中存储指针,因为Integer是包装类。但是由于他们各自都是new出来的,因此不再从常量池寻找数据,而是从堆中各自new一个对象,然后各自保存指向对象的指针,所以i4i5不相等,因为他们所存指针不同,所指向对象不同,故i4==i5为false。

 

但是需要注意的是:以上提到的几种基本类型包装类均实现了常量池技术,但他们维护的常量仅仅是【-128127】这个范围内的常量,如果常量值超过这个范围,就会从堆中创建对象,不再从常量池中取。比如,把上边例子改成Integer i1 = 400; Integer i2 = 400;,很明显超过了127,无法从常量池获取常量,就要从堆中new新的Integer对象,这时i1i2就不相等了。

 

对于i1==i2+i3i4==i5+i6结果为True,是因为,Java的数学计算是在内存栈里操作的,Java会对i5i6进行拆箱操作,其实比较的是基本类型(40=40+0),他们的值相同,因此结果为True

由常量池 运行时常量池 String intern方法想到的(二)之class文件及字节码指令

上一篇博文由常量池 运行时常量池 String intern方法想到的(一)引入了问题,看到了java源代码对应的字节码,本文对java字节码及java指令进行一些说明,并逐句分析上一篇博文的字节码指...
  • fan2012huan
  • fan2012huan
  • 2016年03月16日 17:25
  • 1205

Java常量池理解与总结

一.相关概念 什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 Cla...
  • a616413086
  • a616413086
  • 2016年08月19日 14:29
  • 3474

java常量池概念,String,Integer等包装类对常量池的应用

在class文件中,“常量池”是最复杂也最值得关注的内容。   Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(...
  • chen1280436393
  • chen1280436393
  • 2016年06月27日 15:47
  • 1809

Java常量池的大概理解

触摸java常量池      java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,小菜早就对常量池有所耳闻,这次好好总结一下。   理论         ...
  • qq_27093465
  • qq_27093465
  • 2016年07月26日 10:29
  • 6168

java基础(八)-----java中的常量池技术(底层)

http://baike.baidu.com/link?url=8uhrTcfbIVjtMkHaZC_8ltAceGEI1kWD9CnQixYI2TG0ZuGaJx4eglGsIeJJnDC2TuZi...
  • yuan514168845
  • yuan514168845
  • 2013年12月26日 13:08
  • 877

Java中的字符串常量池详解--转载自技术小黑屋

Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = ...
  • u014143369
  • u014143369
  • 2016年10月23日 09:53
  • 171

常量池技术2(编译篇)

水电费
  • zzuchenyb
  • zzuchenyb
  • 2016年11月25日 08:39
  • 16812

Java 常量池技术和==比较

Java 形成的class文件中,包含有所谓的“常量池”,其类似于C/C++形成的可执行文件(或者目标文件)中的符号表和数据段。   但是有所区别的是,C/C++的符号表,是符号(比如函数)和地址的...
  • IterZebra
  • IterZebra
  • 2011年09月07日 12:49
  • 1252

Integer关于equals与==的比较(自动拆装箱技术和常量池技术)

首先介绍下 equals方法遵循的规则:自反性,一致性,传递性,对称性,与null相比,返回false;       1.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中...
  • qq_39305860
  • qq_39305860
  • 2017年12月18日 22:30
  • 21

Java堆、栈和常量池——内存剖析

  • 2013年04月26日 17:02
  • 25KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常量池技术
举报原因:
原因补充:

(最多只允许输入30个字)