JVM内存结构

原创 2018年04月17日 10:48:52

PC寄存器
  严格来说这是一个数据结构,用于保存当前正常执行的程序的内存地址。同时Java程序是多线程执行的,所以不可能一直按照线性执行下去,当有多个线程交叉执行时,被中断线程的程序当前执行到哪条的内存地址必然要保存下来,以便于它被恢复执行再按照被中断时的指令地址继续执行下去。这很好理解,它就像一个记事员一样记录下哪个线程当前执行到哪条指令了。这仅限于Java方法,对于Native方法并没有要求记录执行的指针地址。

Java栈
  每当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈,在这个Java栈中又会含有多个栈帧,这些栈帧是与每个方法关联起来的,没运行一个方法就创建一个栈帧,每个栈帧会含有一些内部变量、操作栈和方法返回值等信息。每当一个方法执行完成时,这个栈帧就会弹出栈帧的元素作为这个方法的返回值,并清除这个栈帧,Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向这地址。只有中国活动的栈帧的本地变量可以被操作栈使用,当这个栈帧中调用另外一个方法时,与之对应的一个新的栈帧的又被创建,这新创建的栈帧又被放到Java栈的顶部,变为当前的活动栈帧。Java栈是与Java线程对应起来的,这个数据不是共享的,所以不用关心数据一致性问题,也不会存在同步锁的问题。


  存储Java对象的地方,是JVM管理Java对象的核心存储区域,也是程序员最应该关心的地方。每一个存储在堆中的对象都会是这个对象的类的一个副本,他会复制包括继承自它父类的所有非静态属性。堆是所有Java线程共享的,因此对堆的访问需要注意数据同步的问题,方法和对应的属性都需要保证一致性。

方法区(java8被取消,由元数据区替代)
  用于存储类结构信息的地方,class文件中会标记出JVM能识别的不同的几个部分,这些不同的部分在这个class被加载到JVM时,会被存储在不同的数据结构中,其中的常量池、域、方法数据、方法体、构造函数,包括类中的专用方实例初始化、接口初始化都存在方法区。这个区域其实属于Java堆中的一部分(也就是说仍然会被GC管理),是Java堆中的永久区,它的大小可以通过参数来设置。
  这个方法区存储区域的大小在程序启动后的一段时间内就固定了,JVM运行一段时间后,需要加载的类通常都已经加载到JVM中了。需要注意一种情况,项目中如果存在对类的动态编译,而且是同样一个类的多次编译,那么需要观察方法区的大小是否能满足类存储。

运行时常量池
  这个常量池是方法区的一部分,就是上面说的方法区中的常量池。这里的常量包括:编译其的数字常量、方法或者域的引用(运行时解析)。每个常量池都是在JVM的Method area中分配的,每个Class或者Interface的Constant Pool都是在JVM创建class或接口时创建的。

本地方法栈
  本地方法栈是为JVM运行Native方法准备的空间,它和前面介绍的Java栈的作用类似的,由于很多Native方法都是用C语言实现的,所有它通常又叫C栈,除了在我们的代码中包含的常规的Native方法会使用这个存储空间,在JVM利用JIT技术时会将一些Java方法重新编译为Native Code,这些编译后的本地代码通常也是利用这栈来跟踪方法的执行状态的。
  JVM规范中没有对这个区域的严格限制,它可以由不用的JVM实现者自由实现,和其他存储区一样也会抛出OutOfMemoryError和StackOverflowError。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012484172/article/details/79971539

Java虚拟机详解----JVM内存结构

http://www.cnblogs.com/smyhvae/p/4748392.htm 主要内容如下: JVM启动流程JVM基本结构内存模型编译和解释运行的概念   ...
  • bluetjs
  • bluetjs
  • 2016-10-20 17:10:44
  • 12454

JVM内存结构图解

一 真实系统中的概念   JVM(Java Virtual Machine),顾名思义是对真实计算机系统的模拟,正因如此才能屏蔽物理机器的变化,从而实现“一次编译,到处运行”。   相信很多Jav...
  • coffeelifelau
  • coffeelifelau
  • 2016-09-14 08:44:36
  • 2377

JVM的基本结构和JVM的内存结构

JVM的基本结构和JVM的内存结构   这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM...
  • zhangzl4321
  • zhangzl4321
  • 2017-06-28 15:55:24
  • 873

JVM 的内存结构和内存分配

JVM 的内存结构和内存分配
  • u010375364
  • u010375364
  • 2016-07-14 10:29:46
  • 850

JVM内存结构与垃圾回收总结

1、JVM内存模型  JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令。正如任何一个操作系统进程那样,JVM也需要内存来完成它的运行时操作。记住:JVM本身是硬件的一层软...
  • fuzhongmin05
  • fuzhongmin05
  • 2017-10-07 12:46:10
  • 604

JVM体系结构-----深入理解内存结构

一、概述        内存在计算机中占据着至关重要的地位,任何运行时的程序或者数据都需要依靠内存作为存储介质,否则程序将无法正常运行。与C和C++相比,使用Java语言编写的程序并不需要显示的为每...
  • ljheee
  • ljheee
  • 2016-08-17 00:42:28
  • 3059

JVM的内存结构和GC机制

1. Jvm的内存可以分为堆内存和非堆内存 1)   堆内存 Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 Java所以实例和数组的内存均在此处分配。对象的对内存 java...
  • wangyang665
  • wangyang665
  • 2014-08-09 19:21:03
  • 432

深入理解JVM的内存结构及GC机制

一、前言       JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因...
  • anjoyandroid
  • anjoyandroid
  • 2017-11-23 02:12:38
  • 175

JVM内存结构图解 (四)

四 数据类型占用空间分析   操作数栈:long和double需要占用2个栈深单位(unit of depth),其它类型占用1个栈深单位。   局部变量表:long和double需要占用...
  • shenhonglei1234
  • shenhonglei1234
  • 2017-02-09 17:06:30
  • 505
收藏助手
不良信息举报
您举报文章:JVM内存结构
举报原因:
原因补充:

(最多只允许输入30个字)