大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的  ,VM StackNative 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上)的原因。

总体来说JVM运行时,数据区包含:虚拟机栈,堆,方法区,本地方法栈,程序计数器,其中,方法区是线程共享的,虚拟机栈程序计数器是线程私有的。

最新文章

  1. Clouda聊天室实践
  2. Servlet访问第一次500,刷新后404的解决办法
  3. 关于以DataTable形式批量写入数据的案例
  4. window scipy install
  5. sigaction函数的使用
  6. (读书笔记).NET大局观-.NET语言(1)
  7. Using Sphinx to index CNS database
  8. jre1.8使用ikvm.net8将jar转换为dll以供c#调用
  9. 我的flashfxp左右界面怎么变成这样了?
  10. 洛谷P1171 售货员的难题【状压DP】
  11. jmeter测试报告分析
  12. 前端js总结
  13. VIM编辑器用法
  14. sql存储过程中使用 output、nvarchar(max)
  15. P1916小书童--大战蚂蚁
  16. 12. myeclipse遇到Initializing java tooling(1%)终极解决办法
  17. 去掉DataTable列中的重复行
  18. 关于swift语言中导入OC三方类找不到头文件的解决方法
  19. Python学习笔记010——递归函数
  20. MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息

热门文章

  1. USB自定义HID设备实现-LPC1768
  2. 阿里开源Mysql分布式中间件:Cobar
  3. iOS开发——An App ID with identifier "*****" is not avaliable
  4. 我推荐的一些iOS开发书单
  5. ASIHTTPRequest异步请求 分类: ios技术 2015-03-01 09:33 48人阅读 评论(0) 收藏
  6. UVa 412 - Pi
  7. iOS 之 编外知识点
  8. 大数据全栈式开发语言 – Python
  9. zepto animate
  10. YII 1.0 分页类