内存的划分 & 程序代码运行时内存工作流程

内存的划分:
  1,寄存器。
  2,本地方法区。
  3,方法区。
  4,栈内存。
    存储的都是局部变量。
    而且变量所属的作用域一旦结束,该变量就自动释放。

  5,堆内存。
    存储是数组和对象(其实数组就是对象) ,凡是new建立的都在堆中。
    特点:
    1)每一个实体都有首地址值。
    2)堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同。整数是0,小数0.0或者0.0f,boolean类型是false,char类型是 ‘\u0000‘,引用数据类型是NULL
    3)垃圾回收机制。

全局变量和局部变量的区别:

  局部变量是定义在方法内的变量,在其作用域结束时被释放;

  全局变量是定义在方法外的变量。

程序代码运行时内存工作流程演示:

  演示代码:

 1 class  Demo2
 2 {
 3     public static void main(String[] args)
 4     {
 5         int[] arr = new int[3];
 6         arr[2] = 5;
 7         System.out.print(arr[2]);
 8
 9     }
10 }

  演示图解:

  文字说明:

    1)在栈内存中为main函数开辟一个内存空间;

    2)在main的内存空间为局部变量arr开辟一个内存空间;

    3)在堆内存中开辟一个内存空间存放实体数组,数组自动初始化;

    4)将堆内存中开辟的数组首地址传给栈内存中的局部变量arr;

    5)arr[2]的值修改;

    6)控制台上打印arr[2]的值。

  tips:

    1)数组的确定必须明确其长度;

    2)堆内存中的实体会自动初始化,而栈内存中不会,并且栈中未初始化会在编译时报错;

    3)堆内存中开辟给数组的空间首地址传给栈内存的数组名变量,数组名变量保存值为 [[email protected]哈希值 ;( [ 表示引用指向数组,I 表示引用指向数组为int型,@之后是哈希值,通过哈希值计算得出引用在堆内存中的首地址)

  数组代码常见异常:

    1)ArrayIndexOutOfBoundsException:(此异常在编译时通过,在运行时报错)

      当访问到数组中不存在的角标时,就会发生该异常。

    2)NullPointerException:(此异常在编译时通过,在运行时报错)

      当引用型变量没有任何实体指向时,还在用其操作实体,就会发生该异常。

  

时间: 2024-10-18 10:38:32

内存的划分 & 程序代码运行时内存工作流程的相关文章

对象与运行时内存

和大多数猴子一样,我原来也抵触对原理的学习, 后来发现掌握了原理才有了那种了然于胸,运筹帷幄的感觉,也就是顿悟. 这里主要介绍Java对象与运行时内存的知识. java运行时内存 Program Counter Registe(程序计数器): 记录当前线程执行字节码的位置,相当于行号指示器,为线程私有的. Java Virtual Machine Stacks(java虚拟机栈): 存放方法出口信息.局部变量表(对象引用.基本类型数据等),为线程私有的. Native Method Stack(

获取java程序运行时内存信息

由于最近想自己动手测试一下String和StringBuffer的效率问题,需要获取程序运行时的内存占中信息,于是上网查了一下,根据查到的资料写了个程序,发现结果有问题,才发现查到的资料是错误的.所以在这里跟大家分享一下获取内存占用的正确方法 错误的方法 //程序开始时:(先调用一下垃圾回收,但是不一定立即执行) Runtime.getRuntime().gc(); long initm=Runtime.getRuntime().freeMemory(); //程序结束时: Runtime.ge

Linux下程序运行时内存状态及相应查看工具

最近在解决一个编译问题时,一直在考虑一个问题,那就是Linux下可执行程序运行时内存是什么状态,是按照什么方式分配内存并运行的.查看了一下资料,就此总结一下,众所周知,linux下内存管理是通过虚存管理的,在分配内存是并非在物理内存开辟了一段空间,而是在使用时才分配的,而且是通过段页式管理.以上比较废话,开始看看程序运行时内存会是什么状态. 在linux下内存分配是以页为单位的,而页是通过段管理,各个段之间是独立的,方便管理.linux程序运行时,可以分为以下几个内存段: 一.BSS段 (bss

程序运行时内存管理

1,管理运行阶段内存空间分配 malloc()/new; int *pn = new int(存储的类型,内存根据此设定相应存储字节的内存) pn是内存地址(所以 当声明一个变量的指针变量时没初始化,声明后再来初始化则pn 接收的应该是变量在内存中的地址 &VariableName); *pn是存储在内存的值 用于给所指向内存中的变量赋值; 为一个数据对象(结构,基本类型)获得并指定分配内存格式 typeName pointer_name = new typeName; 指定需要什么样的内存和用

[转]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来指

JAVA-JVM 运行时内存结构(Run-Time Data Areas)

Java 虚拟机定义了在程序执行期间使用的各种运行时数据区域. 其中一些数据区域是在 Java 虚拟机启动时创建的,仅在Java虚拟机退出时销毁. 其他数据区域是每个线程.线程数据区域是在线程退出时创建和销毁线程时创建的. 一.运行时数据区划分(JDK8) 1.The pc Register(PC 寄存器.程序计数器) 2.Java Virtual Machine Stacks(Java 虚拟机栈.Java 栈) 3.Native Method Stacks(本地方法栈,C栈) 4.Heap(堆

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

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成