概述
在讲Java的垃圾回收前先提一下Java的数据类型,内存(堆和栈)。Java和其他主流的编程语言类似,其数据类型可分为两种:基本数据类型和引用数据类型;Java把内存分成两种(堆内存和栈内存)
基本数据类型有四类和其占空间字节大小(字节-1byte-8个bit):
第一类整型:byte(1个字节),short(2个字节),int(4个字节),long(8个字节);
第二类浮点型:float(4),double(8);
第三类逻辑性:boolean(1/8个字节,1和0即可表示ture和false,所以一个位大小足够)(只有ture和false两个取值);
第四类字符型:char(2个字节,一个char字符可以存放一个字母,符号,中文汉字等)
Java的基本数据类型可以自动转换,不过在使用时要注意下精度问题,类型字节小的可以转大的而没有任何问题,如:byte->short->int->long,float->double,int->float,long->double。但如果大的转小的,会出现精度丢失,如:double->float,其double在float后面小数点的值会丢失。
Java的基本类型变量保存的是数值本身,存放在栈空间中。
引用数据类型
引用类型(对象类型)有类类型,数组,接口。其变量是引用变量,放在栈空间中,引用变量存放的是对象的地址,而对象数据本身是放在堆空间中。
这里就会引出一个问题:为什么对象数据不放在栈空间而放在堆,基本数据类型要放在栈中?
那是因为对象数据本身大小是不可预知的,而且其大小是动态变化的(例如集合),一般对象所需空间很大,而堆空间大小远远要比栈要多,所以对象本身存放在堆中,放一个对象引用变量(一般大小为4个字节)在栈中,这样程序通过栈中的引用变量访问到堆中的对象。基本数据大小很小(1/8Byte-8Byte)而且不会变化(长度固定),所以存放在栈中。
对象类型某种程度上可以说是由基本类型组成,如果把对象看成一颗树,那么基本数据属性就是一个叶子结点,而对象属性是一颗子树。
栈内存
栈里面存放基本数据和对象的引用(指向堆中的对象),栈的存取速度要堆更快,栈是程序运行的根本,解决程序的运行问题(即程序如何执行),Java的每一个线程都有其对应的线程栈(因为不同线程执行逻辑不同,所以需要一个独立的线程栈),所以栈里面还放着当前线程(程序)相关的局部变量,程序运行状态,方法返回值等。栈是线程独占的(不共享)。栈是运行时的单位。
堆内存
堆是负责存储对象信息,而且其空间远远要大于栈内存空间。堆是共享的,其内容可以给多个栈使用(可以理解多个线程访问同一个对象),所以如果两个线程同时使用堆中的同一个对象,一个线程修改了对象的内部状态会影响到另一个线程(这种情况引发Java的线程安全问题)。
从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的
从软件设计角度来看栈代表了处理逻辑,而堆代表数据;这样分开,使得处理逻辑更为清晰.分而治之的思想.这种隔离,模块化的思想在软件设计的方方面面均有体现;
栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分.由于栈只能向上增长,因此就会限制住栈存储内容的能力.而堆不同,堆中的对象是可以根据需要动态增加的,因此堆和栈的区分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可.
程序运行永远都是栈中进行的,所以进行参数传值时,只存在基本类型和对象引用的问题,不会直接传对象本身(对象在堆中)。
最后
以上就是拼搏网络为你收集整理的java回收类_Java-垃圾回收(一)的全部内容,希望文章能够帮你解决java回收类_Java-垃圾回收(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复