关于java的运行时数据区域划分(下)

luoyjx · 2014-08-06 22:10 · 1726次阅读

    上集回顾:

    上集我们讲了程序计数器以及java虚拟机栈在java的运行时内存中所处区域以及相应的作用。

    本集要点:

    1.本地方法栈

    2.java堆

    3.方法区

    4.运行常量池

    1.本地方法栈

    其实本地方法栈和虚拟机栈作用是非常相似的,区别是什么呢:

        1)虚拟机栈是为虚拟机执行java方法服务的,而本地方法栈是为虚拟机执行的Native方法服务的。

            java虚拟机本来就是C++的实现,有许多本地操作还是需要使用到Native的方法的。

            有的虚拟机实现中,将本地方法栈和虚拟机栈合二为一。

         出现异常:

            StackOverflowError

             OutOfMemoryError

    2.Java堆

    堆内存,最先开始,在脑子里对内存管理的认识只停留在 栈  和  堆 的时候,只知道堆中的内存是程序猿来控制的。

    Java堆有什么特点:

        1)Java堆是被所有线程共享的一块内存区域

        2)在虚拟机启动时创建

        3)此内存区域的唯一目的就是存放对象实例

        几乎所有对象实例都在这里分配内存。请注意,只是几乎,不是绝对。

    Java堆是垃圾收集器管理的主要区域,很多时候被成为“GC堆”。

     由于现在的垃圾收集器大都是分代收集算法,所以Java堆中还可以细分为:

        新生代

        老年代

    关于垃圾收集算法在这里就不多说了,所有的划分都是为了更好的进行垃圾回收,更快分配内存。

    3.方法区

    方法区和Java堆一样,是哥哥线程共享的内存区域,功能:

        用于存储已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码等数据。

    很多人愿意把方法区成为“永久代”,但本质上是不等价的,它有个别名叫Non-Heap(非堆),所以应该还是跟Java堆区分开来的。

    

    垃圾收集器对于它,很少出现在这一块区域,但也不是没有:

        1)常量池的回收

        2)类型的卸载(类型的加载卸载会在其他文章中讲,首先要知道类是由类加载器来加载的)

    4.运行常量池

    这个其实是方法区的一部分。

    在Class文件中,除了有类的版本、字段、方法、借口等描述信息外,还有一项是常量池,

    功能:

        用于存放编译期生成的各种字面量和符号引用,在类加载后存放到方法区的运行常量池中。

    本期节目到这里就要和大家说再见了。

    

收藏

暂无评论

登录后可以进行评论。没有账号?马上注册