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