Java虚拟机把内存划分成几个区域,每个区域都有各自的职责.下面将逐一分析每个区域.

有助于我们了解,每个方法,变量,对象等都去哪儿了!

程序计数器:

它占用一块很小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.

字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令.分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成.

为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器.

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

如果正在执行的是Native方法,这个计数器值则为空Undefined.

Java虚拟机栈

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的.

每个方法在执行的同时都会创建一个栈桢(Stack Frame)用于存储局部变量,操作数栈,动态链接,方法出口等信息.

局部变量表存放了编译期间可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(Reference类型,它不等同于对象本身)和returnAddress类型(一条指向字节码指令的地址)

如果线程请求的栈深度大于最大深度,会抛出StackOverFlowError.

如果虚拟机栈可以动态扩展,扩展时无法申请到足够的内存,会抛出OutOfMemoryError.

本地方法栈

它与虚拟机栈所发挥得作用是非常类似.

虚拟机规范中对本地方法栈中方法使用的语言,使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它.

也会抛出StackOverFlowError和OutOfMemoryError.

Java堆

对于大多数应用来说,Java堆是虚拟机管理的内存中最大的一块.

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.

用来存放对象实例.但是,随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配,标量替换优化技术将会导致一些微妙的变化.所有的对象分配在堆上也渐渐变得不是那么绝对.

会抛出OutOfMemoryError

方法区

和Java堆一样,是各个线程共享的内存区域.它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器便后的代码等数据.

会抛出OutOfMemoryError

运行时常量池

也是方法区的一部分.

Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期间生成的各种字面量和符号引用.

这部分内容将在类加载后进入方法去的运行时常量池中存放.

具备动态性,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的是String类的intern()方法.

会抛出OutOfMemoryError

直接内存

并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域.

NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)de I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,为了避免在Java堆和Native堆中来回复制数据.

直接内存的分配不会受到Java堆大小的限制,但是会受到本机总内存大小以及处理器寻址空间的限制,因此也可能导致OutOfMemoryError.

最新文章

  1. 邻接表的广度优先遍历(java版)
  2. Android中的自定义视图控件
  3. 墙内无缝更新Android SDK
  4. MyEclipse中SVN的常见的使用方法
  5. JAVA发送邮件工具类
  6. GO语言中间的derfer
  7. JDK1.7-LinkedList循环链表优化
  8. Mysql报错:1172 - Result consisted of more than one row
  9. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
  10. Unity发送短信
  11. nginx启动过程分析
  12. Mobile Services 提交批量数据
  13. postman的使用大全
  14. TP3.2 URL传参及模板输出
  15. 集合(从本部分开始涉及API)
  16. centos7.5 修改网卡名称
  17. Codeforces.1045A.Last chance(最大流ISAP 线段树优化建图)
  18. 使用UWA GOT优化Unity性能和内存
  19. openshift node资源限制
  20. sass的加减乘除

热门文章

  1. 修改Tomcat控制台标题(转)
  2. XAMPP设置tomcat自启动时,报无效的Win32程序
  3. 【LG4294】[WC2008]游览计划
  4. Windows环境下php开启GD库的方法
  5. 抓包工具Charles学习总结
  6. 03-运行第一个docker容器
  7. Egret入门(二)--windows下环境搭建
  8. 【坚持】Selenium+Python学习之从读懂代码开始 DAY3
  9. 二维DCT变换
  10. openvpn部署