JVM虚拟机模型和运行时数据区

来源:互联网 发布:向男友求饶知乎 编辑:程序博客网 时间:2024/06/07 20:16

了解底层原理,搭基础,性能调优
1:jvm模型


在jvm做操作系统适配时,自己就是一个小系统
2:jvm jdk jre区别
1:jvm java virtual machine
1:Java的虚拟机
2:jdk java development kit
1:语法规则
2:编译,解析,调试工具
3:jre Java runtime enviroment
1: java运行环境,jar包,底层库文文件
2:jdk写出来的代码是在jre上运行的

3:jvm运行时数据区

1:程序计数器 Program Counter Register
1:指向当前线程正在执行的字节码指令的地址,也成之为pc寄存器
2:所有的指令都是需要cpu来执行的,在Java,最小的执行单元是线程
3:线程需要运行,必须竞争cpu的时间片(cpu的快速切换),如果多个线程同时竞争(看电视和聊天,聊天造成看电视线程的中断),造成线程中断,当需要回复线程时,程序计数器会根据记录回复上次的线程,
可以理解为专门给线程做记事员
4:在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
5:由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
6:如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。
2:虚拟机栈 Java Vitual Machine Stack


栈帧:
栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出
了在方法内未被捕获的异常)都算作方法结束。
1:当前线程运行方法时需要的数据,方法,指令,返回地址
2:方法是由线程来运行的,线程在运行一个方法的时候,需要有局部变量表,方法,返回值

1:栈帧,局部变量表(就是八大基本数据类型和引用数据类型,包含全局变量表)(每个方法里面的变量),操作数栈,动态链接,方法完成后出口
1:栈的深度是有限的,比如只能放100个帧,系统内存固定
2:如果单个的局部变量很大的话,启动的线程就会变少,如果方法需要传入10个或者100个参数,解决方案,通过对象包装(对象存储在堆里面),而栈只有该对象的引用地址
2:操作数栈
jvm是也线程为单位运行的,它会存储中间结果进行中间运算,先i入栈,然后j入栈,还有返回地址,出栈,加法运行结果sum进栈


3:出口
方法先入栈,然后压栈执行完成后出栈,有两个返回情况(一种正常返回,当发送异常返回到什么地方)
4:方法区
在Java虚拟机中,方法区是可供个条线程共享的运行时内存区域,它存储的每一个类的结构信息,例如运行时常量池(Rutime Constant Pool),字段和方法数据,构造函数和普通方法的字节码内容,还包括一些类.实例.接口初始化用到的特殊方法
1.7版本后,常量开始存储在堆中
5:本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。如果在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

6:虚拟机栈和方法区的区别
1:虚拟机栈是一个模型,先进后出,压栈,出栈,jvm虚拟机对栈的深度游要求
2:而方法区主要是用来存储数据
1:运行时常量池,静态变量
2:字段和方法数据
3:构造函数,实例等
7:为什么常量和静态变量存储在方法区,而不存储在堆中
1:常量和静态变量存储在方法区中实现对象共享(公用)
2:如果放在堆中,两个object分别存储,如果修改了object,那么object2也要修改
原创粉丝点击