Jvm学习笔记-Java内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jvm学习笔记-Java内存管理相关的知识,希望对你有一定的参考价值。

                            运行时数据区

    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内存管理的主要内容,如果未能解决你的问题,请参考以下文章

JVM学习2.Java虚拟机运行时数据区

JVM学习2.Java虚拟机运行时数据区

Jvm学习笔记-Java内存管理

用于管理运行时环境的 MobileFirst REST 服务 API 未按预期工作

JVM:Java内存区域

在 Maven 反应器项目中管理运行时依赖项