20171031 java内存模型与gc

来源:互联网 发布:网络取代电视 编辑:程序博客网 时间:2024/06/15 03:37

 1、程序计数器:当前线程所执行的字节码的行号指示器。一个处理器只会执行一条线程中的指令,为了线程切换后能回复到正确的执行位置,所以每条线程都需要一个独立的计数器。各条线程之间互不影响,独立存储,属于‘线程私有’内存。

     2、java虚拟机栈:描述的是JAVA方法执行的内存模型:每个方法执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的被调用直至执行完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。所以也是线程私有的。

     3、本地方法栈:和java虚拟机栈发挥的作用类似,只不过Java虚拟机栈是为JAVA方法服务的,而本地方法栈是为Native方法服务。所以也是线程私有的。

     4、JAVA堆:JAVA堆是被所有线程共享的区域。所有的对象实例及数组都要在堆上分配。

     5、方法区:是各个线程共享的内存区域。主要存储被虚拟机加载的类信息,常量、静态变量、编译后的字节码数据等。有一个别名:非堆。

     6、(次)运行时常量池:方法区的一部分,当然也是线程共享的咯。除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放各种字面量和符合引用。

     7、(次)直接内存:并不是虚拟机运行时的数据区的一部分。是在NIO中基于通道和缓冲区的I/O方式,使用Native函数库直接分配堆外内存。避免了JAVA堆和Native堆中来回复制数据。和(操作系统中内存页的用户空间和系统空间的虚拟映象类似)

java  GC用 根搜索算法:GC Roots

搜索对象是否有被引用。没有引用就可以回收。

(注)内部类互相引用。



原创粉丝点击