java 基础----变量,对象分析

java 基础中变量可以是 基本数据类型和引用数据类型。这里讨论类加载后变量在jvm中的过程。
变量分为实例变量,静态变量,局部变量。个人感受,对于变量需要注意俩点:1,作用域 2,生命周期。
实例变量-是类实例化的时候初始化,生命周期是和类的实例一致,即对象消逝,实例变量也会消逝;作用域扩展到对象本身,即对象在哪里,实例变量在哪里。所以这样看来,在jvm中的内存分布上,处于堆内存中。
静态变量-是在类加载过程中初始化,生命周期跟随程序一致,即程序关闭,静态变量才会消逝;作用域扩展到程序范围内。这样看来,在jvm中的内存分布上,处于方法区。
局部变量-是在方法被调用初始化,生命周期跟随方法一致,即方法失效,局部变量也会消逝;作用域扩展到方法范围内。这样看来,在jvm中的内存分布上,处于栈中,独享属性。
这时候谈论变量是基本数据类型和引用数据类型的区别:
当是基本数据类型时候,jvm会直接分配空间,对于这片空间可以被重复使用,jvm根据变量的作用域范围,在相应的内存中查找字面值,如果查找到直接返回,基本数据类型和这片内存空间有引用关系。
当是引用类型的时候,jvm会根据命令进行分配空间,这里是动态分配,空间大小,是否可以满足分配需求只有在运行阶段才会揭晓。这时候,引用类型的对象都存在堆内存当中,变量的作用域内只保留引用关系。这里讨论基本数据类型的包装类,除了浮点类型,其他都实现了常量池技术。故当遇到包装类的时候,大小小于127时候,分配的空间在方法区的常量池中。

接下来讨论一下gc。不断的分配空间,也需要回收空间,不然会有内存泄露问题,或者内存不够用。
内存泄露问题:注意:1,内存中的空间是否被引用,2,这片空间是否有用。如果一片空间无用,但是仍然被引用,jvm会认为这片空间不可以被回收。这样就是内存泄露。
同样,如果内存中不断分配新空间,老空间不能被回收,这样会出现内存不够现象。
基于对以上分析,谈论一下gc计算回收对象的算法:
1,引用计数算法,统计被引用的次数,当被引用次数为0时候,这样的对象即可被回收。
2,可达性分析算法,分析当前对象到一个定义root点的可达路径,如果不存在,这样的对象可被回收。
对于引用,需要细谈一下java的划分,
分为4种,1,强引用,即有明确声明的引用,永远不会被gc回收,2,软引用,有用,但不是必须的对象,会在jvm发生内存空间不足是进行二次gc,3,弱引用,生命周期在下次gc之前,4,虚引用,无法被引用获取实例,不会对生命周期影响。
gc回收主要针对堆内存,方法区中的常量池。
可以直接通过jdk原生的命令查看当前jvm相关信息。

猜你喜欢

转载自www.cnblogs.com/yueyueLi/p/8962197.html