JVM调优总结(二)-一些概念

Java对象的大小

    基本数据的类型的大小是固定的,这里就很少说了。对于非基本类型的Java对象,其大小就值得商榷。缓存

    在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:优化

Object ob = new Object();spa

    这样在程序中完成了一个Java对象的生命,可是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所须要的空间。而那8byte则是Java堆中对象的信息。由于全部的Java非基本类型的对象都须要默认继承Object对象,所以不论什么样的Java对象,其大小都必须是大于8byte。对象

   有了Object对象的大小,咱们就能够计算其余对象的大小了。继承

Class NewObject {生命周期

    int count;内存

    boolean flag;虚拟机

    Object ob;垃圾回收

}引用

    其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。可是由于Java在对对象内存分配时都是以8的整数倍来分,所以大于17byte的最接近8的整数倍的是24,所以此对象的大小为24byte。

    这里须要注意一下基本类型的包装类型的大小。由于这种包装类型已经成为对象了,所以须要把他们做为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少须要的空间),并且12byte没有包含任何有效信息,同时,由于Java对象大小是8的整数倍,所以一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。所以,可能的话应尽可能少使用包装类。在JDK5.0之后,由于加入了自动类型装换,所以,Java虚拟机会在存储方面进行相应的优化。

引用类型

    对象引用类型分为强引用、软引用、弱引用和虚引用

 

强引用:就是咱们通常声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时须要严格判断当前对象是否被强引用,若是被强引用,则不会被垃圾回收

 

软引用:软引用通常被作为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。若是剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;若是剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,确定是没有软引用存在的。

 

弱引用:弱引用与软引用相似,都是做为缓存来使用。但与软引用不一样,弱引用在进行垃圾回收时,是必定会被回收掉的,所以其生命周期只存在于一个垃圾回收周期内。

 

    强引用不用说,咱们系统通常在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们通常被做为缓存使用,并且通常是在内存大小比较受限的状况下作为缓存。由于若是内存足够大的话,能够直接使用强引用做为缓存便可,同时可控性更高。于是,他们常见的是被使用在桌面应用系统的缓存。

相关文章
相关标签/搜索