如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Java虚拟机垃圾收集算法简介Java虚拟机垃圾收集算法简介一标记-清除算法(Mark-Sweep)首先标记出所有需要回收的对象,标记完成后统一回收。主要缺点:1.标记和清除效率都很低2.产生大量不连续的内存碎片,导致后面分配大内存空间失败二复制算法将可用内存划分为大小相等的两块,每次只使用其中一块。当这块用完后,就将还存活对象复制到另外一块上面,再把已经使用的内存空间一次清理掉。主要缺点:代价太高,至少一半的内存不能使用。三标记-整理算法标记过程和标记-清除算法一致,但是后续步骤是让所有存活的对象都向一端移动,然后清理掉边界以外的内存。四分代收集算法当前商业虚拟机都采用此算法,分为不同对象代,去进行不同管理。【相关阅读】什么是java位运算位运算允许对整数中的单个比特进行操作。位运算会对连个操作数中对应的比特执行布尔代数运算,并产生一个结果。java中有3种位运算符:&(与)|(或)^(异或)~(非)看例子说明位运算的过程:publicclasstest{publicstaticvoidmain(String[]args){inta=12|2;//1100|0010System.out.println(a);}}结果是14(1110)位移运算操作的目标也是数字的二进制的位。用来操作位数的向左向右移动。java种有3种基本的位移操作:>>(右移)<<(左移)>>>(无符号右移)<<:将操作符左边的整数按位向左边移动运算符右边整数指定的位数,在右边添加0;看例子:publicclasstest{publicstaticvoidmain(String[]args){inta=8<<1;System.out.println(a);}}8的二进制表示:00000000000000000000000000001000左移1位后二进制:00000000000000000000000000010000->14结果为14tip:左移相当于num*(2^n)其中num为被移数,n为移动的位数>>:右移的道理也是一样的,注意的是:若最高位为1,移动后最高位用1来填充,否则用0来填充。例子:inta=-8>>1;System.out.println(a);-8的二进制:11111111111111111111111111111000右移后的二进制:11111111111111111111111111111100->-4结果为-4tip:右移相当于num/(2^n)其中num为被移数,n为移动的位数>>>:无符号右移跟右移原理是一样的,只是覆盖位的覆盖规则不同:不管最高位是0还是1,全部用0来填充。例子:inta=-8>>>1;System.out.println(a);-8的二进制:11111111111111111111111111111000无符号右移后的二进制:01111111111111111111111111111100->2147483644tip:用无符号右移的时候要注意,绝对值很小的负数移动后都可能成为绝对值很大的正数,这在大多数情况下没意义。奇葩的.例外:那代码:inta=11>>32;longb=12<<64;System.out.println(a);System.out.println(b);int类型占32位,long类型占64位,这样子的话,上面的例子输出应该都是0才对,因为刚好将有效位都移走了,但结果并不是这样的。输出的结果是:1112这跟java对位移的底层操作机制有关:从结果可以看出两个数都没有变化,这是因为,在进行移位前,java首先将要移动的位数跟被移数的位数求余,然后去移动余数个位数。上面例子中,32对32求余,64对64求余,结果都是0,java系统对被移数进行0个位的移动,也就是没移动啦。这样子的话,看下下面的代码:intc=8>>33;System.out.println(c);因为int有32位,那么8实际上被移动的位数是:332=1;就相当于:intc=8>>1;结果自然是:4