java环境
JDK
Java Development Kit java开发者工具
运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre
jdk里的javac.exe是开发者需要,用户不需要的
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
JRE
Java Runtime Environment java运行时环境
目录:jdk->jre
JVM
Java Virtual Machine java虚拟机
-
目录:jdk->jre->bin===jvm
-
目录:jdk->jre->lib===jvm需要的类库
-
bin + lin===JRE
JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。
JDK卸载
- 删除java安装目录
- 环境变量里删除JAVA_HOME
- 删除path下关于java的目录
- 查看java版本:java -version
JDK安装
环境变量配置
- 环境变量->系统变量
- 新建->变量名:JAVA_HOME,变量值:jdk安装路径
- Path新增
- %JAVA_HOME%\bin
- %JAVA_HOME%\jre\bin
程序运行机制
源程序(.java)----编译器--->字节码文件(.class)---类加载器,字节码校验器,解释器--->操作系统平台
-
加载:类加载器(ClassLoader)和子类把编译好的.class文件读入内存(通常创建字节数组读入.class文件),产生与被加载器对应的Class对象
-
连接
- 验证:确保类信息符合jvm规范,安全
- 准备:为静态变量分配内存并设置默认的初始值
- 解析:符号引用(常量名)替换为直接引用(地址)
-
初始化:有直接父类,先初始化父类,依次执行其他初始化语句
-
执行类构造器clinit方法,收集类中所有类变量赋值动作和静态代码块中的语句合并起来(类构造器是构造类信息)
-
父类没有初始化就先初始化父类
-
类的主动引用:会发生类的初始化
- 先初始化main
- new 对象
- 调用类的静态成员(除了final常量)和静态方法
- Class.forName反射调用
- 父类没有初始就先初始化父类
-
类的被动引用,不会发生类的初始化
- 通过子类引用父类的静态变量,不会导致子类初始化
- 通过数组定义类引用,不会发生此类初始化
- 引用常量不会发生类初始化(常量在连接阶段就存入调用类的常量池中了)
-
-
虚拟机会保证一个类的clinit方法在多线程环境中被正确加锁和同步
-
-
类加载器

自定义类加载器->系统类加载器->扩展类加载器->根加载器(c/c++)->
//1.系统类加载器
ClassLoader sysCl=ClassLoader.getSystemClassLoader();
//2.系统类加载器的父类->扩展类加载器
ClassLoader parent=sysCl.getParent();
//3.扩展类加载器的父类->根加载器(引导类加载器)
ClassLoader parent1=parent.getParent();//c/c++开发,无法获得,null
//系统类加载可以加载的路径:
System.getProperty("java.class.path");

浙公网安备 33010602011771号