码迷,mamicode.com
首页 > 编程语言 > 详细

Jvm学习笔记-Java内存管理(一)

时间:2016-04-01 20:40:42      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

                            运行时数据区

    java程序员吧内存控制的权利交给了虚拟机完成,一旦出现内存溢出或泄露,如果不了解虚拟机是怎样使用内存的,那么排查错误将非常艰难。

    JVM在执行Java程序时会把所管理的内存分为若干个不同的数据区,粗略可以分为两类,线程隔离和非线程隔离。具体细分可见下图

                       技术分享                

        (1)程序计数器

      是一块较小的内存空间,可看做当前线程所执行的字节码的行号指示器。Java的多线程通过线程的轮流切换来实现,为了线程切换后能恢复到正确的执行位置,每条线               程都需要一个独立的程序计数器。

    唯一一个没有任何OutOfMemoryError的区域

    (2)Java虚拟机栈

      线程私有

      虚拟机栈描述Java方法执行的内存模型:每个方法在执行时会创建一个栈帧,其中存储着局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到完             成的过程,就是一个栈帧从入栈到出栈的过程。

      局部变量表存放编译器可知的基本数据类型,对象引用。局部变量表的内存空间在编译期完成分配,并在运行时不会改变。

      会出现的错误:1.StackOverFlow,表示请求栈深过界。2.OutOfMemoryError,表示扩展时无法申请到足够的内存。

    (3)本地方法栈

      和虚拟机栈的区别为:虚拟机栈为虚拟机执行Java方法服务,本地方法栈为使用到的Native方法服务。

    (4)Java堆

      应该是JVM所管理内存中最大的一块,线程共享。几乎所有的对象实例都在堆上分配内存。

      Java堆是垃圾收集器管理的主要区域,Java堆可分为新生代和老年代,再细致一点可分为EDEN,FROM SURVIOR,TO SURVIOR

      为了实现线程安全,Java堆可分为多个线程私有的分配缓冲区(TLAB),把内存分配的动作按线程分在不同的空间之中(TLAB),哪个线程需要分配内存,就在哪个                   TLAB上分配

    (5)方法区

      线程共享

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

      方法区的重要部分:运行时常量池。Class文件中除了有类的版本,字段,方法,接口等信息描述外,还有常量池。常量池用于存放编译期生成的各种字面量和符号引                 用。这部分内容在类加载后进入方法区的运行时常量池中存放。运行时常量池相对Class文件常量池具备动态性,运行时也可将新的常量放入池中。

Jvm学习笔记-Java内存管理(一)

标签:

原文地址:http://www.cnblogs.com/tick-yy/p/5346142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!