JVM概述

java语言的特点:

面向对象编程
摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的思想。提供相对安全的内存管理和
访问机制。避免了绝大部分的内存泄漏和指针越界问题。实现了代码检测和编译以及优化

JDK的统称

java程序设计语言、java虚拟机、javaAPI类库这三部分统称为JDK(Java Development
Kit)。Java API类库中的JavaSE API子集和JVM虚拟机称为JRE(Java Runtime Environment),JRE是java程序运行的标准环境。

Java内存区域和内存溢出异常:

运行时内存区域
JVM在java程序运行的过程中会把自己管理的内存分为 :方法区、堆、虚拟机栈、本地方法栈、程序计数器

程序计数器(Program Counter Register):

一块较小的内存空间,当前线程所执行的字节码行号指示器。字节码解释器就是根据来改变这个计数器的值来选取下一条执行的字节码指令。每条线程都有一个不同的程序计数器,互不影响,独立存储—”线程私有内存”。

虚拟机栈(Java Virtual Machine Stacks):

被线程私有、声明周期和线程相同。每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口。。。每个方法从调用到执行完的过程,就对应一个栈帧在虚拟机中的入栈和出栈的过程。
局部变量表存放了编译器可知的各种基本数据类型(Boolean 、byte、char、short 、int、 double、 long 、float)、对象引用(reference类型) 和 returnAddress类型。
64位长度的long和double数据会占用2个局部变量空间,其余数据类型占用1个。局部变量表是在编译期 完成分配。在方法运行的时候,局部变量表的内存是不能被改变的。
在虚拟机中规定了两个异常:如果线程请求的栈深度大于虚拟机允许的深度,就会抛出StackOverflowError。如果扩展的时候不能获取足够的内存,则抛出OutOfManaryError。

本地方法栈(Native Method Stack):

为虚拟机使用Native方法服务,也会抛出StackOverflowError和OutOfManaryError。

java堆:(Java Heap)

JVM管理的最大的一块内存,被所有线程共享 ,在虚拟机使用时创建。此处的唯一目的就是存放java对象实例。所有的对象实例和数组都在堆内存上分配空间。
java堆是垃圾收集器主要管理区域。也被称为GC堆(Garbage Collected Heap)。为了更好的回收和分配内存,堆被细分为:新生代和老年代,更细致的有Eden空间、From Survivor空间、To Survivor空间等。
java堆可以存在不同的物理存储空间中,只要逻辑上是连续的就可以,如果在堆中没有完成对象实例分配,并且无法扩展时,将会抛出OutOfManaryError。

方法区(Method Area):

用于存储被虚拟机已经加载的类信息、常量、静态变量、以及被编译期编译后的代码等。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError。

运行时常量池(Runtime Constant Pool):

运行时常量池是方法区的一部分。Class文件有版本、字段、方法、接口等,还有就是常量池,用于存放编译期生成的各种字面量和符号引用。这部分内容将会在类加载后存放到运行时常量池中。
运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值