一、JVM运行起来,就会给内存划分空间,这块空间成为运行时数据区。运行时数据区主要划分为以下几部分内容:

  1.栈

    每一个线程运行起来的都会对应一个栈(线程栈),栈中的数据是该线程独有的,不会产生资源共享的情况,因此栈是线程安全的

    栈当中存放的是栈帧,当线程调用方法时,就形成一个栈帧,并将这个栈帧进行压栈操作,方法执行完之后进行出栈操作。

    这个栈帧中包括:局部变量、操作数栈、指向当前方法对应类的常量池引用、方法返回地址等信息

  2.本地方法栈

    本地方法栈的机制和栈相似,区别在于:栈运行的是java方法,而本地方法栈中运行的是本地方法

    本地方法是指JVM需要调用非Java语言所实现的方法,

    例如C语言。在JVM规范中,没有强化性要求实现方一定要划分出本地方法栈(例如:HotSpot虚拟机将本地方法栈和栈合二为一)和具体实现(不同的操作系统,对JVM

    规范的具体实现都不一样)。

  3.程序计数器

    程序计数器也可以成为PC寄存器,通俗的讲就是指令缓存,它主要用来缓存当前程序执行的下一条指令的地址,CPU根据这个地址找到将要执行的指令。这个寄存器是JVM

内部实现的,不是物理概念上的计数器,不过和JVM的实现逻辑一样。

  4.堆

    堆内存主要存放创建的对象和数组,堆内存在JVM中是唯一的,被所有的线程说共享。堆里面每一个对象都存放实例的实例变量,堆内存中的对象没有被引用,会自动被java的垃圾回收机制回收。

    当在方法中定义了局部变量,如果变量是基本数据类型,直接存放在栈内存中,如果这个变量是引用数据类型,会将变量值存放在堆内存中,栈内存中只存放引用地址。

  5.方法区

    方法区在JVM中也是非常重要的一块内存区域,和堆一样,方法区可以被多个线程共享。主要存放每一个被加载的class的信息

    扩展:每一个被加载的class信息有哪些东西呢?

      class信息主要包含魔数(确定是否是一个class文件),常量池,访问标志(当前的类是普通类还是接口,是否是抽象类,是否被public修饰,是否使用了final修饰等描述信息......),字段表集合信息(使用什么访问修饰符,是实例变量还是静态变量,是否使用了final修饰等描述信息.....),方法表集合信息(使用什么访问修饰符,是否静态方法,是否使用了final修饰,是否使用了synchronized修饰,是否是native方法......)等内容。

    当一个类加载器加载了一个类的时候,会根据这个class文件创建一个class对象,class对象就包含了上述的信息。后续要创建这个类的实例,都根据这个class对象创建出来的。

  6.常量池

    常量池是方法区的一部分。存放class中最重要的资源,JVM为每一个class对象都维护者一个常量池

最新文章

  1. flume原理及代码实现
  2. NPOI操作Excel导入DataTable中
  3. jar-下载站点
  4. situations where MyISAM will be faster than InnoDB
  5. ubuntu下 apt-get install 下载的文件存放的目录
  6. 联想硬盘分区表格式修改 GPT -> MBR
  7. 使用FreeMarker生成静态HTML
  8. 【Qt编程】Qt学习之状态栏
  9. Laravel条件查询数据单条数据first,多条数据get
  10. Git 强制回退到某个历史版本再推送到远程
  11. python-day91--同源策略与Jsonp
  12. 使用代码查看Nutch爬取的网站后生成的SequenceFile信息
  13. Linux-配置虚拟IP
  14. ASP.NET MVC同时支持web与webapi模式
  15. 构建高性能J2EE应用的五种核心策略
  16. svg文字与图像
  17. HTML 水平线
  18. Fastjson 的简单使用<转>
  19. [转载]一步一步教你如何在Virtualbox虚拟机中安装Remix
  20. 宿主机ssh免密登录docker容器

热门文章

  1. Python生成Windows可执行exe文件
  2. 面试问烂的 MySQL 查询优化,看完屌打面试官!
  3. shell 命令 链接文件 ln
  4. django静态文件的配置
  5. splice用法
  6. [转]Ubuntu安装rabbitMq
  7. java 数组常见操作
  8. 最大流拆点——poj3281
  9. CUDA 关于 BLOCK数目与Thread数目设置
  10. hibernate_06_hibernate的延迟加载和抓取策略