JVM虚拟机以及垃圾回收机制(一)

JVM

虚拟机栈,程序计数器,本地方法区,堆,方法区。

(1)JVM中一共有两个“栈”,一个是本地方法栈,一个是虚拟机栈。

两个“栈”的功能相似,都是方法运行过程中的内存模型。并且两个“栈”内部构造相同,都是线程私有。只不过Java虚拟机栈描述的是Java方法过程的内存模型,而本地方法栈是描述Java本地方法运行过程的内存模型。

(2)Java虚拟机的内存模型中一共有两个“堆”,一个是原有的堆,一个是方法区。方法区本质上属于堆的一个逻辑部分。堆中存放对象,方法区中存放类信息,常量,静态变量,即时编译器编译的代码。

(3)堆是Java虚拟机中最大的一块内存区域,也是垃圾收集器主要的工作区域。

(4)程序计数器,Java虚拟机栈,本地方法区是线程私有的,堆和方法区是线程共享的。

什么是堆

堆是用来存放对象的内存空间,几乎所有对象都存储在堆中。

特点:

(1)线程共享

整个Java虚拟机只有一个堆,所有的线程都访问同一个堆,而程序计数器,Java虚拟机栈,本地方法区都是一个线程对应一个。

(2)在虚拟机启动时创建。

(3)垃圾回收的主要场所。

(4)可以进一步细分为:新生代和老年代。

新生代又分为:Eden,From Survior,To Survior。

不同的区域存放具有不同生命周期的对象。这样可以根据不同的区域使用不同的垃圾回收算法,而更具有针对性,从而有效。

(5)堆的大小既可以固定也可以扩展,但主流的虚拟机堆的大小是可扩展的,因为当线程请求的时候,但堆已满 ,且内存已满无法扩展时,就抛出OutOfMemoryError。

什么是方法区

Java虚拟机规范中定义方法区是堆的一个逻辑部分。

方法区存放已经被虚拟机加载的类信息,常量,静态变量,即时编译器所编译的代码等。

特点:

(1)线程共享

(2)永久代

方法区中的信息一般需要长期存在,而且它又是堆的逻辑分区,因此用堆的划分方法,我们把方法区称为老年代,

(3)内存回收效率低

方法区的信息一般都是需要长期存在,回收一遍内存之后可能只有少量信息无效。

对方法区的内存回收的主要目标是:对常量池的回收和对类型的卸载。

(4)Java虚拟机对方法区的规范比较宽松。

和堆一样,允许固定大小,也允许可扩展的大小,还允许不实现垃圾回收。

什么是Java虚拟机栈

Java虚拟机栈描述的是Java方法运行过程的内存模型。

Java虚拟机栈会为每一个即将运行的Java方法创建一块叫做“栈帧”的区域,这块区域用于存储该方法运行过程中所需要的一些信息,这些信息包括:局部变量表,操作数栈,动态链接,方法出口信息等。

当一个方法即将被运行时,Java虚拟机栈首先会在Java虚拟机栈中为该方法创建一块“栈帧”,当方法在运行过程中需要创建局部变量时,这是局部变量的值存入栈帧的局部变量表中。当这个方法完后,这个方法所对应的栈帧将会出栈,并释放内存。

特点:

(1)局部变量表的创建是在方法被执行的时候,随着栈帧的创建而创建。而且,局部变量表的大小在编译时期就确定下来了,在创建的时候只需分配事先规定好的大小即可。此外,在方法运行的过程中,局部变量表的大小是不会改变的。

(2)Java虚拟机栈会出现两种异常:StackOverFlowError和OutOfMemoryError。

StackOverFlowError:若Java虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就会抛出此异常。

OutOfMemoryError:若Java虚拟机栈的内存大小允许动态扩展,且当线程请求栈时内存用完了,无法再扩展了,就会抛出此异常。

(3)Java虚拟机栈时私有的。

什么是本地方法栈

本地方法区是本地方法运行的内存模型。

本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

方法执行完毕后相应的栈帧也会出栈并释放内存空间。

也会抛出StackOverFlowError和OutOfMemoryError异常。

什么是程序计数器

程序计数器是一块较小的内存空间,可以把它看做当前线程正在执行的字节码的行号指示器。程序计数器中记录的是当前线程正在执行的那一条字节码指令的地址。但是,如果当前线程正在执行的是一个本地方法,那么此时程序计数器为空。

作用:

(1)字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流量控制。

(2)在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的就清楚上次执行到的位置。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值