JVM基础一:Jvm内存区域介绍

JVM内存区域介绍

1、内存介绍(下图为JDK1.7)

在这里插入图片描述
(1)堆:线程共享的一片区域,虚拟机启动的时候创建。用来新创建的对象实例,几乎所有的对象和数组都从这里分配内存。

(2)方法区:用于存储已经被虚拟机加载的类的信息、常量、静态变量、即时编译后的代码等数据。Java1.8后被直接内存里的元空间代替了。方法区里面还包含运行时常量池(1.8后也直接放在内存里了),运行时常量池包含的内容:字面量(文本字符串,声明为final的常量值,基本数据类型的值,其他)和符号引用(类和结构的完全限定名,字段名称和描述符,方法名称和描述符)。

(3) 程序计数器(线程私有):一块较小的内存空间,可以看做当前线程执行的字节码的行号指示器。作用:一是,字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制(顺序,选择,循环等等);二是,在多线程的情况下,程序计数器用来记录当前线程执行的位置,用于上下文切换

(4)虚拟机栈(线程私有):描述的是java方法执行的内存模型,每次调用的数据都是栈传递的。主要用来存储局部变量表,操作数栈常量池等信息。
E. 本地方法栈(线程私有):为虚拟机使用到的native方法服务,用于存放本地方法的局部变量表,操作数栈,动态连接,出口信息。

(5) 直接内存:直接内存不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但这部分也频繁被使用。

注意:JDK1.8之后,方法区被直接内存的元空间给取代了,取代的好处是:方法区是分配好的一个区域,当容量不够的时候回抛出java.long.OutOfmemoryError异常,而使用在直接内存中的元空间,不会出现异常错误。这也是面试官常问的一个问题

2、Java虚拟机栈可能出现的两种异常,是什么?

 Stack OverflowError:若虚拟机栈的内存大小不允许动态扩展,当线程请求栈的深度超过当前虚拟机栈的最大深度的时候就会抛出该异常。
 OutofMemoryError:若java虚拟机栈的内存大小允许动态扩展,且当前线程请求栈的内存用完了,无法动态扩展,就抛出该异常。

3、B. Java虚拟机栈中java方法和本地方法栈中native方法的区别?

虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,简单来说一个Native 方法就是一个java调用非java代码(比如c++代码)的接口。虚拟机栈中的java方法是使用java代码写的方法。

部分内容来自网络,侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值