类加载以及变量生命周期分析

本文详细解析了Java中类的初始化过程、变量生命周期及内存分配原则,包括类成员、实例成员及局部变量的生命周期,并介绍了类加载机制及变量在不同内存区域的存储方式。

类加载以及变量生命周期分析

明确初始化过程以及变量生命周期对于内存优化以及高并发有重要意义,比如哪些变量需要声明成为类变量,哪些可以是局部变量,有效避免向前引用及线程安全等。

一、类初始化过程(即开辟内存空间)分析:

在JVM中 ,对于同一个JVM 来说 每个类至对应一个Class(类)对象 也就是类只加载一次,(开辟一段内存空间),但是每次创建一次实例对象 就会创建一个实例对象,也就是实例化多次。并且每次实例化过程中都不会 再实例化类成员。 类成员(也就是static修饰的)总是初始化在实例(也就是对象)成员之前( 这一点很重要以下均按照这个规律进行的初始化)。 1.一个类中包含: 变量:类变量, 成员变量,方法内局部变量。 方法:静态方法(类方法),普通方法。 构造方法。静态初始化块 ,初始化块。 2.当类加载时以下内容会优先被创建: 类变量 ,静态初始化块 ,类方法。 以及其他方法信息。加载顺序按照书写顺序。 3.类创建对象时以下内容按照顺序被初始化 首先初始化成员变量和初始化块,这两者是平等关系,初始化按照书写顺序。 再初始化 构造方法。 4.对于含有继承关系的类来说调用子类的属性或者方法的时候, 都会对其父类进行初始化,初始化过程是找到最高父类,从最高父类开始 依次进行初始化。

二、类中变量生命周期:

类成员:类加载之后存在,程序结束之后消失。 成员变量:实例创建开始 到实例 回收。 方法(静态块,非静态块)内变量:跟随方法(静态块,非静态块)调用开始 到方法结束消亡。

三、关于变量在内存中存储位置分析:

内存分区:在JVM虚拟机中,内存可以粗糙的划分为 方法区  堆区  栈区 。

若考虑详细内存分配可以参考文章:http://www.cnblogs.com/dingyingsi/p/3760447.html(深入理解JVM—JVM内存模型)。 对于栈区:每个方法开始执行时 ,在栈上开辟栈帧 ,栈是线程私有的,存储方法的局部变量等方法信息,方法执行结束则栈帧出栈即销毁。因此许多文章提到 局部变量储存在栈。 对于堆:Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。堆上存放着所有的引用类型实例,包括对象实例和数组。当实例对象失去引用时,则会被垃圾回收,也就意味着生命周期结束,这里存在一种特殊情况,Java 内存泄漏,当某个对象被两个或多个引用指向时,只销毁其中一个引用,则容易引发内存泄漏。 对于方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。即时编译后的代码我理解为常量池,和字面量。常量池存放了最典型的是字符串,比如声明字符串 String a = “a”; “a” 会被存储在常量池中,再次声明String b = “a”;则是直接从常量池中抓取。

转载于:https://my.oschina.net/dou2016/blog/704858

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值