jvm--从java类的编译到垃圾回收

1.javac编译的四个阶段
词法分析,语法分析,语义分析到字节码的生成。

--将.java转化成.class的字节码文件

2.类加载过程

加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载 

将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。

3.堆分区

新生代、老年代、永久代  --经过多少次GC回收后的新生代会进入老年代

4.jvm内存模型

栈区: 

    java虚拟机栈:线程私有的,生命周期与线程相同,存放局部变量表,操作栈,动态链接,方法出口

    本地方法栈:为虚拟机使用到本地方法服务(native)

堆区:被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例 (GC主要光顾区域)

方法区:所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据(永久代)

程序计数器当前线程所执行的行号指示器,比如循环,分支,跳转,异常处理,线程恢复等

5.GC垃圾回收

GC触发条件:

    可达性分析法:这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。

垃圾回收主要针对Java堆内存中的新生代和老年代,针对新生代,主要采用复制算法,而针对老年代,通常采用标记-清除算法或者标记-整理算法来进行回收。

复制算法:将内存分成大小相等的两块区域,每次使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块区域上,然后对该块进行内存回收。

标记-清除算法:标记阶段将标记出需要回收的对象空间,然后在下一个阶段清除阶段里面,将这些标记出来的对象空间回收掉。这种算法有两个主要问题:一个是标记和清除的效率不高,另一个问题是在清理之后会产生大量不连续的内存碎片,这样会导致在分配大对象时候无法找到足够的连续内存而触发另一次垃圾收集动作。

标记-整理算法:在标记需要回收的对象以后,它会将所有存活的对象空间挪到一起,然后再执行清理。标记-整理(Mark-Compact)算法有效预防了标记-清除算法中可能产生过多内存碎片的问题。

垃圾收集器:
    新生代收集器:主要有Serial收集器、ParNew收集器和Parallel Scavenge收集器。
    老年代收集器:主要有Serial Old收集器、Parallel Old收集器和CMS收集器



猜你喜欢

转载自blog.csdn.net/xxyuchen/article/details/80346618