java语言 百分网手机站

Java虚拟机垃圾收集算法

时间:2020-11-01 14:30:22 java语言 我要投稿

Java虚拟机垃圾收集算法

  Java虚拟机的内存区域中,程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭;栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性。垃圾回收重点关注的是堆和方法区部分的内存。以下是小编为大家搜索整理的Java虚拟机垃圾收集算法,希望能给大家带来帮助,更多精彩内容请及时关注我们应届毕业生考试网!

Java虚拟机垃圾收集算法

  一 标记-清除算法(Mark-Sweep)

  首先标记出所有需要回收的对象,标记完成后统一回收。

  主要缺点: 1. 标记和清除效率都很低 2. 产生大量不连续的内存碎片,导致后面分配大内存空间失败

  二 复制算法

  将可用内存划分为大小相等的两块, 每次只使用其中一块。 当这块用完后,就将还存活对象复制到另外一块上面,再把已经使用的内存空间一次清理掉。

  主要缺点: 代价太高,至少一半的内存不能使用。

  三 标记-整理算法

  标记过程和标记-清除算法一致,但是后续步骤是让所有存活的对象都向一端移动,然后清理掉边界以外的内存。

  四 分代收集算法

  当前商业虚拟机都采用此算法,分为不同对象代,去进行不同管理。

  【相关阅读】

  什么是java位运算

  位运算允许对整数中的单个比特进行操作。位运算会对连个操作数中对应的比特执行布尔代数运算,并产生一个结果。

  java中有3种位运算符:&(与) |(或) ^(异或) ~(非)

  看例子说明位运算的过程:

  public class test{

  public static void main(String[] args){

  int a=12|2; //1100|0010

  System.out.println(a);

  }

  }

  结果是14(1110)

  位移运算操作的目标也是数字的二进制的位。用来操作位数的向左向右移动。

  java种有3种基本的位移操作:

  >>(右移) <<(左移) >>>(无符号右移)

  <<:将操作符左边的整数按位向左边移动运算符右边整数指定的位数,在右边添加0;

  看例子:

  public class test{

  public static void main(String[] args){

  int a=8<<1;

  System.out.println(a);

  }

  }

  8的二进制表示:00000000 00000000 00000000 00001000

  左移1位后二进制:00000000 00000000 00000000 00010000 -> 14

  结果为14

  tip:左移相当于num*(2^n) 其中num为被移数,n为移动的位数

  >>:右移的道理也是一样的,注意的是:若最高位为1,移动后最高位用1来填充,否则用0来填充。

  例子:

  int a=-8>>1;

  System.out.println(a);

  -8的二进制:11111111 11111111 11111111 11111000

  右移后的二进制:11111111 11111111 11111111 11111100 -> -4

  结果为-4

  tip:右移相当于num/(2^n) 其中num为被移数,n为移动的位数

  >>>:无符号右移跟右移原理是一样的,只是覆盖位的覆盖规则不同:不管最高位是0还是1,全部用0来填充。

  例子:

  int a=-8>>>1;

  System.out.println(a);

  -8的二进制:11111111 11111111 11111111 11111000

  无符号右移后的二进制:01111111 11111111 11111111 11111100 -> 2147483644

  tip:用无符号右移的时候要注意,绝对值很小的'负数移动后都可能成为绝对值很大的正数,这在大多数情况下没意义。

  奇葩的例外:

  那代码:

  int a=11>>32;

  long b=12<<64;

  System.out.println(a);

  System.out.println(b);

  int类型占32位,long类型占64位,这样子的话,上面的例子输出应该都是0才对,因为刚好将有效位都移走了,但结果并不是这样的。

  输出的结果是:11 12

  这跟java对位移的底层操作机制有关:

  从结果可以看出两个数都没有变化,这是因为,在进行移位前,java首先将要移动的位数跟被移数的位数求余,然后去移动余数个位数。上面例子中,32对32求余,64对64求余,结果都是0,java系统对被移数进行0个位的移动,也就是没移动啦。

  这样子的话,看下下面的代码:

  int c=8>>33;

  System.out.println(c);

  因为int有32位,那么8实际上被移动的位数是:332=1;

  就相当于:int c=8>>1;

  结果自然是:4

【Java虚拟机垃圾收集算法】相关文章:

1.Java虚拟机垃圾收集算法简介

2.java虚拟机的故障处理摘要

3.Java虚拟机(JVM)和跨平台原理

4.权重随机算法的java实现

5.Java中shuffle算法的使用

6.java常见的排序算法的代码

7.Java数据结构和算法笔记

8.JAVA简单选择排序算法及实现

9.java堆排序的算法思想的分析