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

1.程序计数器

  程序计数器(PC)是一块较小的内存,他是存储当前线程执行的字节码的行号指示器,可以类比硬件中PC,硬件中的PC用于指示当前程序执行的代码在内存中的内存地址.

2.JAVA虚拟机栈

  虚拟机栈描述的是JAVA方法执行的内存模型.每个方法在执行时都会创建一直栈帧用于存储局部变量表,操作数栈,动态链接,方法出口灯信息.每一个方法从调用到结束都对应一个栈帧在虚拟机栈中的入栈出栈.局部变量表存储的是编译期间可知的各种基本数据类型,对象引用和返回地址.基本数据类型有boolean,byte,char,short,int,float,long,double,其中boolean是1位,byte是8位即1个字节,char,short是16位即2个字节,float,int是32位即4个字节,long,double是64位即4个字节.在虚拟机栈中,64位的数据会占用两个局部变量空间,其他的只占用一个.

  在该区域有两个异常状况:如果线程请求的深度大于虚拟机允许的深度,会抛出StackOverflow异常,如果虚拟机栈可扩展,且扩展时无法申请到足够的内存会抛出OutOfMemoryError异常.

3.本地方法栈

  本地方发栈与虚拟机栈的作用非常相似,区别就在于前者执行的是本地方法,候着执行的是java方法.本地方法使用的语言,方式,数据结构没有强制规定,虚拟机可自由实现.

4.java堆

  该区域是用于存放对象实例的,几乎所有的对象实例以及数组都在这里分配..java堆是垃圾收集器管理的主要取悦,从内存回收的角度来看,由于现在收集器基本采用分代收集算法,所以java堆可分为:新生代和老年代.再细致一点分为Eden空间,From Survivor空间,To survivor空间等,从内存分配的角度看,线程共享的java堆可分出多个线程私有的分配缓冲区.无论如何划分,java堆始终存放的是对象实例.java堆是逻辑上连续的空间,就跟磁盘一样.关于这里提到的堆空间分区可以看下我的另一片关于java垃圾回收机制的博客.

5.方法区

  该区域用于存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后额代码等数据.存储常量的区域我们可称为常量池.这个区域的回收主要针对于常量池以及类型的卸载.

6.运行时常量池

  这里额外介绍运行时常量池,它是方法区的一部分.class文件中除了有类的版本,字段,接口,方法等信息之外,还有一项是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池存放.运行时常量区是具备动态性的.该区域的常量不一定是编译器才产生的,运行期间新的常量也可以放入池中.这点特性利用的最多的就是String类的intern()方法.

理解JVM之JAVA运行时内存区域的更多相关文章

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

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

  2. JVM笔记-运行时内存区域划分

    1. 概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域.它们各有用途,有些随着虚拟机进程的启动一直存在(堆.方法区),有些则随着用户线程的启动和结束而建立 ...

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

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

  4. Java运行时内存

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

  5. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  6. Java运行时数据区域分析

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

  7. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...

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

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

  9. Java运行时数据区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间.根据<Java虚拟机规范(Java SE 7版>的规定,J ...

随机推荐

  1. Linux输出信息并将信息记录到文件(tee命令)

    摘自:https://www.jb51.net/article/104846.htm 前言 最近工作中遇到一个需求,需要将程序的输出写到终端,同时写入文件,通过查找相关的资料,发现可以用 tee 命令 ...

  2. Django之form表单验证顺序

    概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...

  3. MyBatis 的案例

    首先我们需要先下载jar包 其次我们书写具体的内容 Student  Class package entity; /* * 学生类 * */ public class Student { //学生编号 ...

  4. NGUI 9宫格输入的一个巨坑

    UILabel 中的maxlines = 0,输入没有问题.如果maxlines=1,输入出错

  5. Fakes里的stub和shim的区别

    stub常用于虚拟接口.类.方法,无法重写静态方法(stub需要传递到具体调用代码中) shim常用于重写静态方法(在ShimsContext.Create()作用域内,拦截Runtime动态修改方法 ...

  6. 基于SymmetricDS的多主一从数据库同步方案

    原文参照:https://blog.csdn.net/seattle0564/article/details/22096901 下面就记录下测试的一款第三方同步方案SymmetricDS(以下简称S) ...

  7. Leetcode739 - Daily Temperatures

    题目描述 Leetcode 739 本题考察了栈的使用.题目输入是一段温度值列表,然后返回一个列表.这个列表包含了输入列表中每一天还有多少天温度升高.如果未来没有升高的情况,则输入 0. # Exam ...

  8. idea多级目录与单级目录切换

  9. google搜索设置,在新的窗口打开

  10. XML基础知识归纳(通俗易懂)

    XML:可扩展标记型语言 随着json等一些技术的普及,似乎xml的路子越来越窄,虽然xml的一些功能被其他的一些技术代替,但是学习xml还是非常有必要,如果用xml存储一些大量数据,还是有一定优势的 ...