JVM、JDK、JRE
JVM:Java虚拟机(HotSpot),Java程序的运行环境,所编写的程序并不是运行于操作西铜之上,而是JVM运行在操作系统之上,Java程序运行于JVM之上,正因为如此才可以实行跨平台。
JVM要求的运行规则是,java命令后面加上要运行的类的名字
C:\Program Files\Java\jdk1.8.0_74\jre\bin\server jvm所在位置 //win
JDK:Java的开发库,包含了JRE和开发人员所需要的库
JRE:Java运行时环境,包含JVM和运行Java程序所需要的类库
JDK包含了Java程序开发运行所需要的环境
JDK下载:https://www.oracle.com/index.html
bin:脚本文件,可执行文件 ,存放JDK中提供的Java相关的命令
db:JDK自带的小型数据库
include:JVM启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件
jre:JDK自带的一个java运行环境
lib:library,提供jar包依赖
src.zip:压缩文件存放JDK的核心代码,API源码
Java程序运行流程
Java程序开发步骤:编写java源程序,编译Java程序,运行Java程序
编译:将编写好的Java程序翻译成class文件,在这个过程中会检查编写的程序是否存在编译错误,没有编译错误就会产生字节码文件
运行:将编译好的class文件交给jvm去执行,Java程序会在jvm上运行。\
JVM的热点代码:
热点代码有两类?
1 被多次调用的方法
2 被多次执行的循环体
判断是否为热点代码,需不需要触发即时编译?
1 基于采样的热点探测:周期性去栈顶采样
2 基于计数器的热点探测:为方法建立计数器,超过阈值则为热点
main与类
1、一个Java文件只能拥有一个public class
2、如果写了public class,类的名字要与文件名保持一致
3、一个Java可以出现多个class,但class的名字不能重复
main:主方法,Java程序的入口,程序执行都是从main开始,固定写法 public static void main (String[ ] args){},如果不写main方法,程序也可以进行编译但无法运行于jvm
命令:
javac HelloWorld.java -encoding utf-8 转编码
作业:
1.修正Test1.java、Test2.java、Test3.java、Test4.java
四个java源文件中的错误,使其能够编译和运行
2.阐述JRE JDK JVM 之间的关系
JVM java虚拟机,用来运行java程序,现在oracle jdk 用的虚拟机模式时HotSpot
JRE java运行时环境,主要时包含了JVM和运行时所需的库(rt.jar)
JDK java开发库,主要包含了 JRE和 开发所需要的库
JDK > JRE > JVM
3.Java为什么说是跨平台的语言,这个平台指的什么
所谓的平台指的就是操作系统
所谓的跨平台其实就是jVM功劳
因为java程序时是运行在JVM上
只需要在不同的操作系统安装不同的jvm
一处编译,处处运行
4.阐述Java程序运行流程
1. 开发人员编写的程序 源程序 .java
2. 经过编译以后就会产生 一个字节码文件 .class
class 文件里面都是二进制
我们可以将二进制转换成十进制去查看
每一个class文件 开头都有一段字母,这个字母就是魔数
还有一串数字 202020 34:52(10)
52 代表jdk 1.8的版本 , 51: jdk 1.7
3. 当 java 限定类名
1.启动jvm
2.启动启动类加载器,去加载 jre/lib/*.jar(rt.jar)
3.再启动拓展类加载器,去加载 jre/lib/ext/*.jar
4.再启动应用类加载器去加载开人员写的jar/class文件
5.利用双亲委托机制去加载开发人员写的class文件,如果
说限定类名与 jre/lib/*.jar jre/lib/ext/*.jar 里面
任何一个类相同,就不会加载自己写的。
6. 加载完了以后进行字节码校验
7. 校验通过以后,热点代码直接执行,非热点代码通过
JIT 去解释一行就让CPU执行一行。
5.什么样的错误会在编辑期间出现错误
不符和java语法的错误。
附加题:
1.写出九九乘法表
public class multiplication{
public static void main (String[] args){
for(int i=1;i<10;i++){
for(int j=1;j<i+1;j++){
System.out.print(j+"×"+i+"="+i*j+" ");
}
System.out.println();
}
}
}
2.给定一个数组 arr = {1,3,4,5,6,76}
按照从大到小展示出来。
public class sort{
public static void main (String[] args){
int arr[]={1,3,4,5,6,76};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]<arr[j+1]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
for(int s:arr){
System.out.print(s+" ");
}
}
}
3.给定一个数组,求出数组里面 最大值和最小值
并且按照从小到大排列出来
arr = {45233,2345,23452,32,3412,341}
public class reorder{
public static void main (String[] args){
int arr[]= {45233,2345,23452,32,3412,341};
for(int i=0;i<arr.length;i++){
int min =arr[i];
int index =i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<min){
min=arr[j];
index =j;
}
}
int temp =arr[i];
arr[i]=min;
arr[index]=temp;
}
System.out.println("数组最大值:"+arr[5]);
System.out.println("数组最小值:"+arr[0]);
for(int s: arr){
System.out.print(s+" ");
}
}
}```