概述
主要讲述java虚拟机内存的各个区域,这些区域的作用,服务的对象和可能产生的问题。运行时区域数据
放一张经典的图

1.程序计数器
一块很小的内存空间,指的是当前线程执行的字节码的行号指示器。
字节码指示器就是改变计数器的值来选下一条需要执行的字节码指令。
这是线程私有的。各个线程之间的互不影响。
2.java虚拟机栈
描述的是java方法的内存模型,每个方法执行的时候都有一个栈帧。
存储方法中的局部变量表,操作数栈,方法出口等信息。
其中局部变量表中存储了各种基本的数据类型,对象引用
(指向对象的起始地址的引用指针,也可能是一个句柄)。
当程序请求的栈的深度超过虚拟机允许的最大的深度StackOverflow异常。
java虚拟机动态扩展的过程中无法申请到足够的内存就会出现OutOfMemoeryError异常。
线程私有。
3.本地方法栈
和java虚拟机栈提供的服务基本相同。服务的对象主要是Native方法。
4.java堆
java堆是管理的最大的一块内存,几乎存放全部的对象实例+数组。
垃圾管理的主要区域。GC堆。
内存回收的角度看基本分为:新生代和老年代。
具体的看之后的内容。
5.方法区
线程共享的。
主要存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码的数据等。
6.运行时常量池
方法区的一部分。存放编译生成的各种字面量和符号引用。
同时不一定是编译期间的常量,运行期间的常量也可以放到里面。
7.直接内存
基于通道和缓冲区的NIO。它可以直接使用Native函数使用堆外内存。减少java堆
和Native堆中来回复制数据。 2017/12/3 13:53:21