jvm内存大致可以分为六大块:

堆,虚拟机主要内存,可以形象的说,堆是对象的存储库,几乎所有的对象实例和数组都在此分配内存,当然也死于此,jvm垃圾回收机制(简称GC)主要处理的就是这个地方。它被所有线程共享,没错,这可能造成一些问题,此处留到讨论对象时再说。堆的存储空间在物理上不要求一定连续,实际上它只要让我们看起来是连续的就可以了(虚拟化内存),一般情况下,堆的大小是可以扩展的,当然如果计算机内存满了,导致堆无可申请的话,对象创建就失败了,那么就会抛出outofmemeryError异常。

方法区,顾名思义,它就是用来存储方法的(当然还有别的=。=),它和堆一样被线程共享,负责存储加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(注意,JAVA代码通常是即时编译的,即用到哪里就编译哪里,用的少的就擦掉,用的多的就留下来)。这里同样需要GC的回收和处理,其实通常需要回收的仅仅是常量池而已(至于类信息吗、、、),方法区和堆一样,无可扩展时就会抛出outofmemeryError异常。

本地方法栈,线程私有,这个地方如果不深入剖析的话,很难理解这是干什么用的,因此目前俺只知道它用来存储本地的方法(只有个模糊的感念凭感觉这像是干什么的干什么的、、=。=),区别于JAVA方法,它是对非JAVA语言的一种外部接口。还有它是栈,是栈就可能溢出。

虚拟机栈,每个线程有一个独立的虚拟机栈,互不影响,随线程的出生而出生死亡而死亡,虚拟机栈以帧为单位,每当执行一个方法时,都会在栈顶创建一个栈帧,用于存储局部变量(方法内的)、方法出口等信息,方法的调用和完成的过程,就是栈帧入栈出栈的过程。

程序计数器,这个很重要,每个线程/方法执行到哪了,在哪休眠,在哪恢复,都需要程序计数器记录,由于CPU每个核心同时只能执行一个线程的指令,所以这种记录是非常必要的,因此它线程私有。

最新文章

  1. Asp.Net Mvc + ComBoost.Mvc快速开发
  2. Sass初使用
  3. js控住DOM实现发布微博简单效果
  4. 关于VMWARE 上对于不小心VMWare Tools Easy Install 后卡死的解决方法
  5. [原创]flexslider 中文文档 使用教程 参数手册
  6. 微信支付 V3版
  7. OC语言-02面向对象的三大特性
  8. POJ1017 packets
  9. centos6.5安装docker
  10. windows下mysql 5.7以上版本安装及遇到的问题
  11. java去除查询实体字段多值之间空格
  12. Google搜索
  13. 解决Android Studio出现Failed to open zip file. Gradle's dependency cache may be corrupt的问题
  14. [LeetCode&Python] Problem 118. Pascal's Triangle
  15. 什么是Mixin模式:带实现的协议
  16. Unity3d学习笔记记录
  17. Linux/Unix下Shell快捷键操作集合
  18. 5.mybatis实战教程(mybatis in action)之五:与spring3集成(附源码)
  19. Web运行控制台输出乱码解决总结
  20. sql语句-6-高级查询

热门文章

  1. Josn转换
  2. 自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)
  3. jQuery懒加载插件
  4. 【web】movie review——静态页面训练、css训练
  5. 返回mapcontrol上的已被选择的element
  6. JS性能优化的那点事
  7. node18 服务器上 pytorch cyclegan 测试有问题,numpy 版本不对
  8. I-129表
  9. 腾讯云服务器CVM购买详细过程 选择我们需要的腾讯云服务器
  10. springMvc-视图模型封装及注解参数