Java基础六:关于虚拟机的基本知识(一)

简述JDK、JRE和JVM之间的关系

  • JDK(Java Development Kit),是用于支持Java程序开发的最小环境,基本上Java程序设计语言、Java虚拟机、Java API类库这三部分组成了JDK
  • JRE(Java Runtime Enviroment),是支持Java程序运行的标准环境,Java API类库中的Java SE API自己和Java虚拟机这两部分组成了JRE
  • Java虚拟机负责Java程序设计语言的安全特性和平台无关性。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译器只需要生成
    在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。Java虚拟机使得Java摆脱了具体机器的束缚,使跨越不同平台编写程序成为了可能。

类加载机制的作用和过程

  • 类加载器的作用是将Java类文件加载到Java虚拟机
    包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)

运行时数据区分为哪几块?述说你对每块区域的理解(比如存储的内容、生命周期、作用等)

  • 1.程序计数器:线程私有,可以看成是当前线程所执行的字节码的行号指示器,用于选取下一条需要执行的指令,也是唯一一个没有OOM情况的区域,生命周期和线程相同;
  • 2.Java虚拟机栈:线程私有,主要描述Java方法执行的线程内存模型,生命周期和线程生命周期相同
  • 3.Java堆:主要用于存储实例对象,Java中几乎所有的对象实例都存储在这块内存中,考虑到即时编译和逃逸分析,有一部分的对象实例会分配到栈上。
  • 4.方法区:主要用于存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
  • 5.运行时常量池:属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用

结合Eden、S0、S1和Old区,描述一下一个对象的创建过程

  • 对象的分配,从理论上来讲应该都是在堆上分配(即时编译和逃逸分析,会分配到栈上)。在正常分代的情况中,新生成的对象会分配在新生代中,但是少数情况下(比如对象大小超过一定阈值)会直接分配到老年代。
    大多数情况下,对象在Eden区中分配,当Eden区没有足够空间时,虚拟机会发起一次Minor GC,新生代采用的是复制算法,把存活的对象从Eden和S0复制到S1区,后把对象年龄加一,并清空Eden和S0(新生代的对象大多为活跃的对象,会频繁的创建和销毁,所以新生代GC时应该存活的对象很少,所以采用复制算法是最合适的)当对象达到一定年龄之后(默认15岁,可修改-XX:MaxTenuringThresold=需要的年龄数字),对象会被移动到老年代,当然老年代如果空间不足,会发生Major GC,采用标记整理算法(老年代的对象大部分都是经过一段Minor GC的,所以相对比较稳定,每次回收的对象相对比较少,所以采用标记整理算法最合适)
    另外,一个对象的创建过程,上述描述只是一个对象的创建过程中的一个步骤中的详解,一个对象的创建,从虚拟机的角度来看,包括:遇到new指令—判断引用能否在常量池定位;检查引用能否被加载、解析、初始化过—分配内存(包括指针碰撞和空闲列表法,这一部分内容是我上面的描述)—初始化内存空间—设置对象头—执行init()方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值