简单理解 栈、堆、静态存储区(方法区)

来源:互联网 发布:网络零售平台有哪些 编辑:程序博客网 时间:2024/05/16 03:51
  1. 静态存储区(方法区):
    主要存放静态数据(全局唯一的)如:static、常量、class;
    jvm只有一个方法区,被所有线程共享;
    运行时jvm会在方法区开辟一个常量池空间。

  2. 栈(stack):
    存放基本数据类型和对象的引用。在方法(作用域)结束后会被释放;
    每个线程包含一个栈区,每个栈中数据私有,不共享。

  3. 堆(heap):
    存放程序运行时new出来的对象(实例)和数组对象;
    内存的分配由程序完成,当对象不在被引用指向时,可以被gc回收掉;
    jvm只有一个堆区被所有线程共享。

拓展:

String s = "s";String s1 = "s";String s2 =new String("s");s==s1;//trues==s2;//false

s为栈中的引用,”s”为常量池中的对象,s的引用指向常量池中的常量对象“s”;s在创建时会先查找常量池中是否存在常量对象“s”,存在则指向,不存在则创建在指向。
s1直接指向常量对象“s”;
s2在堆中创建对象“s”,然后查找常量池中是否有常量对象“s”,有建立连接(s2.intern() 获取常量池中的地址)(此时创建一个对象),没有则创建在建立连接(此时创建两个对象)。

包装类
int i = 1;int i1 = 1;Integer i2 = 1;Integer i3 = 1;Integer i4 =128;Integer i5 =128;i == i1;//truei == i2;//truei2 == i3;//truei4 == i5;//false

i = 1 为基本类型 存放在栈中;
java 中基本类型的包装类除了float、double两个浮点类型都实现了常量池技术,另外Byte,Short,Integer,Long,Character这5个基本类型只在对应值小于等于127时才可以使用常量池,所以i4==i5时值为false;

第一次写博客,哪里写的不对,望大佬们指点一下。

阅读全文
0 0
原创粉丝点击