Java知识总结(一)java内存区域

运行时数据区域

程序计数器

        程序计数器是一块很小的内存空间,是运行速度最快的存储区域。位于处理器内部。保存着当前线程所执行的字节码里的行号。字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令。分支,循环,跳转,异常处理,线程恢复都依靠这个计数器完成。为了保证线程切换后能恢复到原来的执行位置。每个线程都拥有一个独立的程序计数器。属于线程私有内存。当线程数量超过CPU数量时,线程之间会自动根据时间片轮询的方式抢夺CPU资源。对于单核CPU而言,每一时刻只能有一个线程处于运行状态。对于多核CPU而言,可以允许多个线程同时执行,各个线程之间的计数器以互不影响、独立工作为设计目标。如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个本地方法,则程序计数器为空。

java虚拟机栈

      JVM的架构是基于栈的,程序的每一个指令都要经过入栈和出栈这样的组合型操作才能完成。

虚拟机栈也是一个可以快速访问的存储区域,位于内存中,通过使用其所谓的“栈指针”可以访问处理器。堆栈指针向下移动,分配新的内存,向上移动回收内存。由于Java虚拟机需要预先生成相应的内存空间,所以允许程序时,Java虚拟机必须知道被存储在栈内的所有数据的确切大小和生命周期。这限制了程序的灵活性。所以只有某些数据被存放在栈里,如对象的引用。而应用程序内部数量庞大的Java对象存放在堆中。

      栈的优势是访问速度比堆要快,并且数据是可以被共享的。缺点是存储在栈里的数据大小和生命周期必须是确定的。缺乏灵活性,所以虚拟机栈内主要存放一些基本类型的变量,例如int、short、long、byte、float、double、boolean、char,以及对象的引用。

     Java虚拟机栈也是线程的私有内存空间,和Java线程在同一时间创建,保存方法的局部变量、部分结果,并参与方法的调用和返回。虚拟机栈运行时使用了一种叫作栈帧的数据结构来保存上下文数据。栈帧包括(局部变量表,操作数栈,动态连接方法,返回地址信息)。每一个方法的调用都是栈帧的入栈,方法的返回则是出栈。如果方法调用时,方法的参数和局部变量较多,栈帧中的局部变量表也会比较大,栈帧会不断膨胀以满足调用所需传递的信息。

    栈帧主要由三个部分组成(局部变量区,操作数栈,帧数据区)。

    局部变量区被定义成一个从0开始的数字数组。byte,short,char,boolean存入前会转成int,long和double则占两个字长。局部变量区通过数组下标进行访问。

  操作数栈也被组织成一个数字数组,但是不通过数组下标访问。通过push和pop。前一个操作push进的数据可以被下一个操作pop出来使用。

  帧数据区主要有三个作用

  1.解析常量池里面的数据

  2.方法执行完后处理方法返回,恢复调用现场

  3.方法执行过程中抛出异常时的异常处理,存储在一个异常表,当出现异常时,虚拟机查表看是否有对应的catch操作。如果没有就终止方法调用。

本地方法栈

与虚拟机所发挥的作用相似。区别是:虚拟机栈执行java方法(也就是字节码)服务本地方法栈则为虚拟机使用到的Native方法服务。在HotSpot虚拟机中,本地方法栈和Java虚拟机栈合二为一。Java虚拟机用于管理Java函数的调用,而本地方法栈用于管理本地方法的调用。本地方法是使用C实现的。当某一个线程调用本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界,本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈,但是调用本地方法时,虚拟机会保持Java栈不变,不再现线程的Java栈内压入新的帧,只是简单的链接并直接调用本地方法。

Java虚拟机所管理的内存中最大的一块,Java堆使所有线程共享的一块内存区,在虚拟机启动时创建。只要求逻辑上是连续的,物理空间上可以不连续,并且被所有线程共享。堆用来存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。

java堆是垃圾收集器管理的主要区域。因此也被称为GC堆。从垃圾回收角度,因为现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分成:新生代和老年代;更加细分为:Eden空间,From Survivor、To Survivor空间等。进一步划分的目的是为了更好的收回内存,或者更快的分配内存。

堆的优势时可以动态的分配内存大小,不需预先告知编译器生命周期。缺点是因为运行时动态分配内存,所以数据访问速度较慢。

方法区

方法区与Java堆一样,是各个线程共享的内存区域。方法区中最为重要的是类的类型信息、常量池、域信息、方法信息。

类型信息(类的完整名称、父类的完整名称、类型修饰符、类型的直接接口类表)

常量池(这个类方法、域等信息所引用的常量信息)

域信息(域名称、域类型、域修饰符)

方法信息(方法名称、返回类型、方法参数、方法修饰符、方法字节码、操作数栈和方法栈帧的局部变量大小以及异常表)

在HotSpot虚拟机中,方法区也被称为永久区,是一块独立于Java堆的内存空间。但是其中的对象也是可以被GC回收的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值