JVM一共有五大区域,程序计数器、虚拟机栈、本地方法栈、Java堆、方法区。

程序计数器

程序技术器是一块很小的内存空间,由于Java是支持多线程的。当线程数大于CPU数量时,CPU会按照时间片轮寻执行每一个线程,当切换执行线程的时候程序计数器标记着当前线程的下一个指令。

各个线程之间的程序计数器互不影响,独立工作,是一块私有空间。如果当前线程执行的是Java方法则计数器存放着正在执行的Java字节码地址。如果当前线程执行的是Native方法则计数器为空。

Java虚拟机栈

Java虚拟机栈是一块线程私有空间,Java线程创建的时候而创建。

Java函数的调用需要使用栈,当调用层数很深的时候(递归)。栈的内存不够就会抛出StackOverFlow。动态扩展就是防止StackOverFlowError异常,当虚拟机空间不足以扩展时会抛OutOfMemoryError。

每调用一个方法,Java虚拟机栈中会生成一个栈帧,栈帧中一块最重要的区域是局部变量表。局部变量表中存着方法的参数和方法的局部变量,参数和局部变量越多栈帧所占空间越大。

修改Java虚拟机栈的大小可以设置-Xss参数。

存放:局部变量表,操作数栈,动态链接,即8种基本数据类型和对象的引用。

本地方法栈

本地方法栈和Java虚拟机栈功能很相似,Java栈用来管理Java方法的运行,而本地方法栈是用来管理本地方法的运行。本地方法并不是Java实现的,而是用C实现的。

也会有 StackOverflowError 和 OutOfMemoryError 异常。

Java堆

堆是一块共享的区域,Java运行过程中所有的对象和数组都存在堆中,Java堆内存分3块 新生代、年老代和永久代。新生代有分3块区域,Eden、Survivor space1、Survivor space2。三块区域的默认空间大小比例是8:1:1。新产生的对象放在Eden区,Survivor2块区域译为幸存区,也就是说Eden至少经历了一次GC到Survivor区,如果经历多次GC依然没有被回收掉的会有机会进入老年区。

方法区

方法区与堆区域类似,都是一块线程共享区域,存放着类的元信息 方法类型、常量池等,Java7之前方法区位于永久代(PermGen space),与堆相互隔离,JVM启动之前设置大小,启动之后大小不能再改变。当永久代的空间被占满之后,会抛异常OutOfMemoryError。Java8之后永久代被舍弃。取而代之的是元空间(Metaspace)。元空间位于本地内存,这样就不会被JVM的大小所限制。而且大小可以动态调配,减少OOM。Java8以后常量池被放到了堆空间中。

动态类加载会导致永久代的OOM。

在JDK1.7及以后,JVM已经将运行时常量池从方法区中移了出来,在JVM堆开辟了一块区域存放常量池。

方法区是JVM规范概念,而永久代则是Hotspot虚拟机对方法区的一个实现。

注:除了程序计数器之外都有可能发生内存溢出。

最新文章

  1. 邻接矩阵有向图(二)之 C++详解
  2. 转:Oracle表分区
  3. Android使用SurfaceView实现墨迹天气的风车效果
  4. QQ截图取色方法
  5. Scala学习笔记--特质trait
  6. file_get_contents()的另一种使用方法
  7. Python远程视频监控
  8. Unity 绘图性能优化 - Draw Call Batching
  9. 批量删除的PHP
  10. 一个通用的makefile(一)
  11. [51nod1206]Picture
  12. mssql sqlserver text数据类型专题说明
  13. 第一章· Redis入门部署及持久化介绍
  14. Kibana中的Coordinate Map地图报索引错误的问题
  15. 转:如何捕获winform程序全局异常?
  16. 学习JS的心路历程-参数传递方式(上)
  17. Winsock API TCP/IP网络通信
  18. jQuery为多个元素绑定同一个事件
  19. HDU - 6116:路径计数 (组合数&NTT)
  20. JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC

热门文章

  1. AVFoundation Programming Guide(官方文档翻译4)Editing - 编辑
  2. 阿里巴巴-德鲁伊druid连接池配置
  3. 吴裕雄--天生自然KITTEN编程:逃离漩涡
  4. Starting php-fpm [18-Jun-2019 12:56:59] NOTICE: PHP message: PHP Warning: Version warning提示报错解决
  5. SpringMVC之参数绑定
  6. Android编程权威指南第三版 第32章
  7. centos7开启ntp并同步时间到指定时区
  8. 码海拾遗:strcpy()、strncpy()和strcpy_s()区别
  9. 芮勇博士荣获2016年IEEE 计算机学会技术成就奖
  10. 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)