java虚拟机(一) --Java内存区域与内存溢出异常(1)

一、概述

对于c和c++开发来说,担负着每一个对象生命开始到终结的维护负责。但是对于Java开发者而言,则不需要,因为这一块由Java虚拟机负责,但是不了解Java虚拟机,排错将会成为一件很痛苦的事情


二、运行时数据区域


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



2.1程序计数器

程序计数器是一块较小的内存空间,他可以看做是当前线程所执行的字节码的行号指示器。这与我们在计组里所学的程序计数器类似的,为什么这个是线程隔离的数据区,
由于Java虚拟机的多线程是通过多线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行以条线程中的指定。因此,为了线程切换后能恢复到正确的执行位置,所以才需要独立。


2.2 Java虚拟机栈

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈桢用于储存信息。每一个方法从调用知道完成,就对应一个栈桢在虚拟机栈中入栈和出栈的过程。我们通常所指的栈就类似于这个。


每一个线程包含一个stack区,只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在共享heap中;

     每个栈中的数据(基本数据类型和对象引用)都是私有的,其他栈不能访问;

     栈分为3部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

  栈的优势劣势:存取速度比堆要快,仅次于直接位于CPU的寄存器,但必须确定的是存在stack中的数据大小与生存期必须是确定          

          的,缺乏灵活性。单个stack的数据可以共享。

      stack:是一个先进后出的数据结构,通常保存方法中的参数,局部变量。

      在java中,所有基本类型和引用类型都在stack中储存,栈中数据的生存空间一般在当前scopes内


2.3本地方法栈
这个和Java虚拟机栈所发挥的作用十分的类似,他们之间的区别不过是,Java虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用的Native方法服务


2.4 Java堆

对大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有对象实例以及数组都在这里分配。

存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令);

     jvm只有一个heap区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身。

     堆的优劣势:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数据,但缺点是,由于要在运行时动态分配内存,存取速度慢。


2.5 方法区

它用于存储常量,静态常量等数据


2.5.1运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本,字段等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用。这部分将在类加载后进入方法区的运行时常量池中存放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值