浅析Java内存和创建对象时成员的初始化过程

Java虚拟机在运行需要在内存中开辟空间,在空间中进一步分区,每个分区都有其对数据的处理特点,
内存的划分:
1、寄存器: CPU在处理,存储速度非常快,程序不可控制
2、本地方法区:和所在系统相关

3、方法区:

存放程序中所需类的字节码信息和static定义的静态成员
4、栈内存:
存储的都是局部变量,栈中变量没有默认初始化,变量所属区域一旦结束,该变量就立即自动释放(内存释放),生命周期
都比较短,速度快。
栈中的数据可以共享(和堆中的常量池中的共享效果是一样的)。
5、堆内存(堆内存中含有一个常量池): 
存放动态产生的数据,比如是对象,凡是new建立的都在堆中。 没有引用则视为垃圾,并不一定会立即释放内存,java有垃圾
处理机制。
特点: 1、每一个实体都有首地址值。
2、堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。char默认初始化'\u0000'
3、释放方式是垃圾回收机制。
-->常量池:jvm为每一个已经加载的类维护一个常量池,常量池就是这个类型用到的常量的一个有序集合,包括直接常量和
对其他类型、方法、字段的符号引用。此类型实现了常量池技术才可以在常量池中存放数据,八种基本数据类型中除去doubel
类型和float类型没有实现常量池技术,其余的全部实现,但是针对六种基本类型,常量池可提供其共享的范围是[-128,127],
常量如果超过了这个范围,就要在堆中创建对象,不进入常量池。
注意:1)、类的成员变量在不同对象中各不相同,都有自己的存储空间(所属对象)(成员变量在堆中的对象中)。而类的方法却是该类的
所有对象共享的,只有一套,对象使用方法时方法才被压入栈,方法不使用不占用内存。

     2)、引用数据类型存储的是引用,实例是在堆内存中;基本数据类型存放的是数据值本身。Java中是“值传递”,只不过这个值可能是数
据值也可能是引用值。


当创建一个对象的时候,内存都做了什么操作:
    1、在程序进行编译时期,是将程序代码编译成字节码信息
    2、首先通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区,类的各种信息都在方法区中保存着。
    3、加载类信息的时候,若所在类有静态代码块static{},则会随着类的加载而被执行,在程序启动到结束这个过程
        中,类只被加载以此,静态代码块也只执行一次。(当存在继承时,会先执行父类操作)
    4、当使用关键字new创建一个类的实例时,jvm就会在堆内存中开辟一个空间。
    5、创建对象时,对象的成员首先是进行默认初始化。
    6、而后成员进行显示初始化。
    7,成员进行构造代码块的初始化。
    8,最后成员是构造函数的初始化。new的作用是创建对象,而构造函数的作用是初始化对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值