大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 )。

  Method Area 和 Heap 是线程共享的  。

  VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。

  为什么分为 线程共享和非线程共享的呢?请继续往下看。

  首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

  概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈)和Native Method Stack  (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

最新文章

  1. ArrayIndexOutOfBoundsException
  2. thusc2016游记&&滚粗记&&酱油记
  3. ISCC2016 WriteUp
  4. MySQL存储过程与存储函数的区别
  5. MySQL学习(一)
  6. Hibernate中一对多和多对一关系
  7. 【sicily】卡片游戏
  8. 与成都的幸福行动家交流GTD
  9. 深入理解maven及应用--转
  10. <转>安卓软件测试的几个要点
  11. Unity3D 之连按移动加速
  12. c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组
  13. epoll的原理和使用方法
  14. ExcelHelper Excel,Export,Import
  15. asp.net mvc 上传下载文件的几种方式
  16. Python文件复制(txt文件)
  17. RAC日常管理
  18. Redis中的数据结构
  19. PAT甲级1080 Graduate Admission【模拟】
  20. 为什么 c = tf.matmul(a, b) 不立即执行矩阵乘法?

热门文章

  1. 剖析top命令显示的VIRT RES SHR值
  2. js 代码风格(2)
  3. 【Raspberry Pi】crontab 定时任务
  4. TypeScript 基本类型(一)
  5. Django实现组合搜索的方法示例
  6. ModelShowDialog缓存上次浏览的URL
  7. 第十三篇:multimap容器和multiset容器中的find操作
  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.2——使用Android Testing Support Library进行测试
  9. 分布式服务框架dubbo入门实例
  10. SDN开发过程中遇到的一些问题总结