一. 基本数据类型和包装类型的区别
1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是
2、包装类型是引用的传递,基本类型是值的传递
3、声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间
4、存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们
5、初始值不同,eg: int的初始值为 0 、 boolean的初始值为false 而包装类型的初始值为null
6、使用方式不同,基本数据类型直接赋值使用就好 ,而包装类型是在集合如 coolection Map时会使用
二. 栈(stack)
Java栈的区域很小 , 大概2m左右 , 特点是存取的速度特别快
栈存储的特点是:先进后出
存储速度快的原因:
栈内存, 通过 ‘栈指针’ 来创建空间与释放空间 !
指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 !
这种方式速度特别快 , 仅次于PC寄存器 !
但是这种移动的方式, 必须要明确移动的大小与范围 ,明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序 的灵活性
堆存储的是:
基本数据类型的数据以及引用数据类型的引用!
三.堆(heap)
存放的是类的对象 ;
Java是一个纯面向对象语言, 限制了对象的创建方式 :
所有类的对象都是通过new关键字创建
new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用时长 !
堆内存中内存的释放是由GC(垃圾回收器)完成的。
垃圾回收器回收堆内存的规则 :
当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 !
堆在逻辑上分为三部分:
新生代(Young Generation,常称为YoungGen)
老年代(Old Generation,常称为OldGen、TenuringGen)
永久代(Permanent Generation,常称为PermGen)
新生区(New/Young Generation):
新生代(Young Generation),常称为YoungGen,位于堆空间。
新生区又分为Eden区和Survior(幸存区)。
四. Eden:新创建的对象
Survior 0、1:经过垃圾回收,但是垃圾回收次数小于15次的对象。
养老区(Old Generation):
老年代常称为OldGen,位于堆空间
Old:垃圾回收次数超过15次,依然存活的对象。
永久区(Permanent Generation):
永久代常称为PermGen,位于非堆空间。
永久区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的空间。