java关于JVM问题整理

1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.描述一下 JVM 加载 class 文件的原理机制?

JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的Java 运行时系统组件。它负责在运行时查找和装入类文件的类。 Java 中的所有类,都需要由类加载器装载到 JVM 中才能运行。类加载器本身也是一个类, 而它的工作就是把 class 文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
类装载方式,有两种
(1)隐式装载, 程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到 jvm 中。
(2)显式装载, 通过 class.forname()等方法,显式加载需要的类 , 隐式加载与显式加载的区别:两者本质是一样的。 Java 类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到 jvm 中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

3.jvm 是如何实现线程?

线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配和执行调度分开。 一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件 IO 等),又可以独立调度。线程是 CPU 调度的基本单位。 主流 OS 都提供线程实现。Java 语言提供对线程操作的同一 API,每个已经执行 start(), 且还未结束的 java.lang.Thread 类的实例,代表了一个线程。 Thread 类的关键方法,都声明为 Native。这意味着这个方法无法或没有使用平台无关的手段来实现,也可能是为了执行效率。
实现线程的方式 :
使用内核线程实现内核线程(Kernel-Level Thread, KLT)就是直接由操作系统内核支持的线程。
内核来完成线程切换。
内核通过调度器 Scheduler 调度线程,并将线程的任务映射到各个 CPU 上。
程序使用内核线程的高级接口,轻量级进程(Light Weight Process,LWP) 。
用户态和内核态切换消耗内核资源。
使用用户线程实现。
系统内核不能感知线程存在的实现用户线程的建立、同步、销毁和调度完全在用户态中完成。
所有线程操作需要用户程序自己处理,复杂度高。
用户线程加轻量级进程混合实现。
轻量级进程作为用户线程和内核线程之间的桥梁。

4.类加载过程?

如下图所示,JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化。
类加载过程
类的生命周期(7个):加载、验证、准备、解析、初始化、使用、卸载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值