java虚拟机入门

我们可以把java语言、java虚拟机,java API类库这三部分统称为JDK(Java Development Kit),JDK是支持java程序开发的最小环境。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
可以把java API类库中的java SE API子集和java虚拟机这两部分统称为JRE(Java Runtime Environment), JRE是支持java程序运行的标准环境(java SE支持桌面级应用,java EE支持企业应用)。也就是说JDK是开发最小环境,JRE是运行最小环境。
对于java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码。java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域
,下面会一一介绍。

Java 源码编译机制

Java 源码编译由以下三个过程组成:

  • 编译器javac分析和输入到符号表
  • 注解处理
  • 语义分析和生成 class 文件

类加载机制

JVM 的类加载是通过 ClassLoader 及其子类来完成的。属于应用程序根据自身需要自定义的 ClassLoader,如 Tomcat都会根据 J2EE 规范自行实现 ClassLoader。
加载过程中会先检查类是否被已加载,检查顺序是自底向上,从 Custom ClassLoader 到 BootStrap ClassLoader 逐层检查,只要某个 Classloader 已加载就视为已加载此类,保证此类只所有 ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

类执行机制

JVM 是基于栈的体系结构来执行 class 字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。

程序计数器

程序计数器是一块较小的内存空间,它可以开做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,这块内存区域为线程私有的内存。

java虚拟机栈

java虚拟机栈也是线程私有的,它的生命周期与线程相同。每个方法在执行时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

java堆

对于多数应用来说,java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。java堆是由所有线程共享的一块内存区域,在虚拟机启动时创建,几乎所有的对象实例都在这里分配内存。

方法区

方法区与java堆一样,是各个线程共享的内存区域,它用于存储被虚拟机加载的类信息,常量,静态常量等。

运行时常量池

运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述外,还有一项信息是常量池,用户存放编译期生成的各种字面量和符号引用。

GC回收

栈中的随着方法的进入和退出有条不紊地进行出栈和入栈操作,每个栈帧分配多少内存基本是类结构确定下来就已知的,方法结束或者线程结束,内存自然就跟着回收了,而java堆和方法区则不一样,只有在程序运行时才知道会创建哪些对象。GC在对堆进行回收前,第一件事就是确定这些对象中哪些还存活着,哪些已经死去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值