Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分

a.程序计数器(Program Counter Register)

一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空。

b.JVM栈(Java Virtual Machine Stack)

描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

每一个方法从调用直至执行完成的过程,就对应一个栈帧在JVM栈中入栈到出栈的过程。

c.本地方法栈(Native Method Stack)

与JVM栈发挥的作用非常相似,区别不过是JVM栈为JVM执行Java方法服务,而本地方法栈为JVM使用到的Native方法服务。

d.Java堆(Java Heap)

Java堆是被所有线程共享的一块内存区域,在JVM启动时创建。所有的对象实例以及数组都要在这里分配内存,但是随着JIT编译器的发展,渐渐变得不是那么绝对了。

e.方法区(Method Area)

存储已被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap。

f.运行时常量池(Runtime Constant Pool)

方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池,用于存放编译器生成的各种字面量和符号引用。

g.直接内存(Direct Memory)

不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存区域。

例如:JDK1.4中新引入的NIO(New Input/Output)类,一种基于通道与缓冲区的I/O方式,可以使用Native函数库直接操作堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用,避免了在Java堆和Native堆中来回复制数据。

Java 进阶(一) JVM运行时内存模型,布布扣,bubuko.com

时间: 2024-10-14 07:49:06

Java 进阶(一) JVM运行时内存模型的相关文章

[转]JVM运行时内存结构

目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的JVM参数 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描.而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会

JVM 运行时内存结构

  1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space+Young Space       Young Space=Eden+S0+S1 (1)持久带       JVM用持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等.可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化

JVM运行时内存结构

连接:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space+Young Space Young Space=Eden+S0+S1 (1)持久带 JVM用持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等. 可通过-XX:PermSize和-XX:MaxPermSize来指

jvm运行时内存解析

一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api,jre包含了java运行的基础类库和java虚拟机,java虚拟机支撑着java程序的运行. jvm(java virtual machine)翻译为java虚拟机,从字面上来理解,jvm就是一个虚拟的机器,其实类似于一个操作系统,通过软件去虚拟出一个虚拟机,帮助我们管理计算机的内存和调用计算机的硬件等等.而

运行时内存模型

运行时内存模型运行时中,类型.对象.线程和托管对有相互的关系.CLR的一个windows进程,这个进程中可能存在多个现在.一个线程创建时,会分配1M的栈.这个栈主要用于方法传递实参和方法内部定义的局部变量.如果方法中有涉及到对象,则在堆中创建类型对象和类型实例.类型对象主要由类型对象指针.同步块索引.静态字段.方法列表组成.类型实例主要由类型对象指针.同步块索引.实例字段组成.其中类型实例的类型对象指针指向类型对象的类型对象指针.它们的相互关系如下图所示. 通过这张图,可以清楚了解运行时的内存由

java运行时内存模型

运行时内存分为: 1.方法区 2.堆 3.虚拟机栈 4.本地方法栈 5.程序计数器 方法区.堆是共享的,所有线程都可以读取 虚拟机栈.本地方法栈.程序计数器是线程私有的,每个线程单独一套,它们在线程创建时生成,在线程死亡时销毁 堆分为年轻代,老年代,永久代.分区的目的是为了更快的分配内存和更好的执行垃圾回收.主要作用是存户对象实例,绝大部分实例和数据都存储在堆中,gc就作用于堆 hotspot虚拟机的方法区存储在永久区,方法区的实现jvm规范没有强制规定,hotspot虚拟机这么实现完全是为了懒

jvm运行时内存划分

(根据<深入理解java虚拟机>这本书总结) 本文主要解释jvm内存模型,以及各个部分的作用.都是自己总结的给自己看的通俗语言,未用专业术语的见谅. 一.为什么要了解jvm内存模型? 在了解一个类的编译-加载-内存分配-初始化所有过程前,要先了解jvm的内存模型.这样对整个java体系可能会更加便于理解.当然,如果不理解这些,也是没关系的,照样可以进行java开发. 二.jvm内存模型 1.根据自己的理解举个最简单的例子,一个main方法启动,进程运行,在这个过程中,会调用方法.开启多个线程.

关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,"在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?": 我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单线程的话是不会有问题的,我之所以不知道,是因为不清楚在JAVA内存模型中,一个线程对应一个栈,还是多个线程共享一个栈... 其实如果知道每个线程都有一个自己的JAVA栈的话,问题也就很清楚了

JVM运行时内存结构学习

学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) :  1.方法区(Method Area)类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中, 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是为了和Java的堆区分开 . 2.堆(Heap)虚拟机启动时自动分配创建,用于