Java内存管理和垃圾回收

来源:互联网 发布:怎么开淘宝福利群 编辑:程序博客网 时间:2024/06/05 23:53

Java内存管理和垃圾回收

内存管理

Java代码编译和执行的真个过程包含了一下三个重要即机制

1、  Java源码编译机制

2、  类加载机制

3、  类执行机制

 

Java源码编译机制

1、  分析和输入到符号表

2、  注解处理

3、  语义分析和生成class文件

 

类加载机制

JVM的类加载是通过classLoader及其子类来完成的

 

类执行机制

JVM是基于栈的体系结构来执行class字节码的,线程创建后都会产生程序计数器(PC)和栈(Stack)

程序计数器存放吓一跳要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是由局部变量和操作数栈两部分组成,局部变量用于存放方法中的局部变量和参数,操作数栈用于存放方法执行过程中产生的中间结果。

 

JVM内存组成结构

JVM栈由:堆、栈、本地方法栈、方法区等部分组成。

1、  堆:所有通过new创建的对象都在堆中分配内存,其中为新生代和旧生代

a)        新生代:新建的对昂都是用新生代分配内存。

b)        旧生代:用于存放新生代中多次垃圾回收依然存活的对象。

2、  栈:每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个战神包括局部变量和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

3、  本地方法栈:用于支持native方法的执行,存储了每个native方法调用的状态。

4、  方法区:存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息,JVM用持久代来存放方法区。

 

垃圾回收机制

JVM分别从新生代和旧生代采取不同的垃圾回收机制

 

新生代的GC:童超存货的时间叫短,因此时记忆Copying算法来进行回收,就是先用Copying算法扫描存活对象,并赋值到一块新的完全未使用的空间对应的新生代。新生代采用空指针的防治来控制GC触发指针保持最后一个分配对象在新生代区间的位置。当有新的对象要分配内存是,用于检查孔家是否足够,不够就触发GC。

 

旧生代的GC:对象存活的时间较长,比较稳定,因此采用表级(Mark)算法来进行回收。标记算法就是扫描出存活的对象,然后再进行会后未被表级的对象,回收后利用空出的空间要么进行合并,要么标出来便于下次进行分配。总之就是减少内存碎片带来的效率损耗。

原创粉丝点击