这篇文章可以说是摘抄自周志明的《深入理解Java虚拟机》,但是加上了自己的理解,印象可以更深些。

Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区域有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而创建和销毁。

Java虚拟机会把运行时的数据区域分为以下几个区域:

程序计数器:

程序计数器是一块很小的内存空间,代表着当前线程执行的字节码的行号指示器,记录着所执行的行号,java虚拟机执行的是由后缀名为.java的文件编译而来的.class文件(字节码文件),所以字节码解释器根据程序计数器来执行字节码文件。每个线程都有自己的程序解释器,这样才能保证程序的正确执行,也就是说程序计数器是线程私有的。

Java虚拟机栈:

java虚拟机栈是用来描述java方法的内存模型,每个方法在执行的同时都会创建一个栈帧,而这个栈帧存储的是方法中的局部变量,操作的数据,方法的入口返回值等信息,当一个方法被调用的时候,就代表着栈帧的入栈直至方法的结束代表着栈帧的出栈。因为虚拟机栈存储的数据决定了他也是线程私有的,每个线程都拥有一个虚拟机栈记录着方法的内容。我们平时所说的栈就是指的是虚拟机栈,其中存储着基本数据类型和指向堆内存中对象的指针(对象的引用)。

本地方法栈:

这块区域和虚拟机栈执行的操作其实是一致的,但是他们之间的服务对象不一样,虚拟机栈为java方法服务,而本地方法栈为native方法服务,我们在看源码的时候经常了一看到用native关键字修饰的方法,这种方法的实现是用c/c++实现的,我们在平时是看不到他的源码实现的。

Java堆:

堆内存是这几块内存区域中最大的一块,堆内存存在的目的是存放对象的实例(通过new创建的对象,对象的引用放在虚拟机栈中指向堆中的实例),在虚拟机启动的时候堆内存也就被创建了,这块内存被所有线程共享,在虚拟机运行期间的所有线程创建的对象的实例都被存储在堆内存中。既然堆被线程所共享,那么线程创建的对象不能一直存放在这里,总会有装不下的时候,在一定条件下,java虚拟机会触发垃圾回收机制(GC),来回收这里被看作没有用的对象,虚拟机所管理的垃圾回收器总是会对这块区域进行管理操作。关于垃圾回收(GC)机制可以看另一篇文章:Java
GC垃圾回收机制

方法区:

方法区和堆内存一样,是各个线程共享的数据区域,看到这个方法区这个名字很快能想到这个区域存方法信息,事实上方法区存放的数据很多,包括被虚拟机加载的类信息,用final修饰的常量,String对象,用static修饰的静态变量。

运行时常量池:

准确的说这块区域属于方法区,也就受到了方法区的空间限制,之前所说的String对象,就是字符串常量就是存放在这里,编译期生成各种字面值和符号引用,将在类价在后放入方法区的运行时常量池的。运行时常量池的存储具有动态性,并不是在类加载时才能放入数据,在程序运行期间也可以有新的常量放入。String类中的intern()方法就是这种特点,详看之前转载的一篇文章:String的intern()方法详解

直接内存:

这块区域和java中的新的io方式(NIO)有关,不属于虚拟机的运行时数据区。NIO是一种基于通道,缓冲区的io方式。后面会详细看看。

参考:《深入理解Java虚拟机 JVM高级特性与最佳实践》周志明

Java运行时内存划分的更多相关文章

  1. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  2. JVM发展史和Java运行时内存区域

    目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...

  3. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

  4. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  5. Java程序运行时内存划分

    1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...

  6. Java运行时内存

    对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业.好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此, ...

  7. JAVA虚拟机运行时内存划分--运行时数据区域

    Java虚拟机在执行java程序时会把内存划分为以下几个不同的数据区域: java虚拟机内存划分(运行时)1.线程私有的: 程序计数器(Program Counter Register):可以看作当前 ...

  8. java运行时内存分配详解

    一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私 ...

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

    一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...

随机推荐

  1. elasticsearch-5.1.1使用snapshot接口备份索引

    如果ES是集群,那么需要使用共享存储,支持的存储有:a.shared file systemb.S3c.HDFS 我使用的是第一种,NFS共享文件系统.这里要说一下权限问题,ES一般是使用 elast ...

  2. JavaScript的预编译和执行

    JavaScript引擎,不是逐条解释执行javascript代码,而是按照代码块一段段解释执行.所谓代码块就是使用<script>标签分隔的代码段. 整个代码块共有两个阶段,预编译阶段和 ...

  3. python替换脚本

    任何场合都用的到的全文替换 #!/usr/bin/python import sys if len(sys.argv) < 5: print 'usage: python %s from to ...

  4. directdraw显示rgb555

    // TODO: 在此添加控件通知处理程序代码  height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0, ...

  5. Css中路径data:image/png;base64的用法详解

    今天查看一些网站的css中发现了 background-image:url(data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAAB ...

  6. VTK显示.vtk格式文件

    void ReadandShowVTKFile () { vtkSmartPointer<vtkRenderer > aRenderer = vtkSmartPointer<vtkR ...

  7. 打开CSDN论坛出现403

    打开CSDN论坛出现403 在查找资料的过程中,出现"403-禁止访问"

  8. JavaScript去除日期中的“-”

    JavaScript去除日期中的"-" 1.说明 经常会出现这样的情况,页面的日期格式是:YYYY-MM-DD,而数据库中的日期格式是:YYYYMMDD,两者之间需要转换一下,方能 ...

  9. Linux显示用户注册名

    Linux显示用户注册名 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ finger -s Login Name Tty Idle Login Time Of ...

  10. /opt/apache-tomcat-7.0.57/conf/catalina.policy(权限不够)

    1 错误描述 /opt/apache-tomcat-7.0.57/conf/catalina.policy(权限不够) 2 错误原因 3 解决办法