Dos命令操作
- cd… 返回上级
- cd\ 返回根目录
- cd文件夹名 进入该文件
- 盘符: 切换盘符
- dir 显示该文件夹中的内容
- cls 清屏
- notepad 打开记事本
- ipconfig ip地址
Java开发环境
- JDK(JavaDevelopmentKit)java开发工具包
- JRE(JavaRuntimeEnvironment)运行环境
JDK就是Java开发工具包,包括JRE,同时还包括编译Java源代码的编译器javac,还包括java调试和分析工具,以及java程序编写所需要的文档和demo示例。
JRE是java运行时环境,包括java虚拟机以及java基础类库。是运行java程序所需要的软件环境。
跨平台性
java程序跨平台的实现主要依赖于JVM/java虚拟机/JavaVirtualMachine,针对不同的操作系统,有不同版本的jvm。
类的加载过程
五个过程:加载,验证,准备,解析,初始化
- Loading
加载是类加载过程的一个阶段,这个加载会在内存中产生一个java.lang.Class对象,作为方法区这个类各种数据的入口。(不一定从Class文件中获取数据,也可以从ZIP包(包括jar包和war包),也可以是其他文件生成(JSP文件转变成Class文件)) - Verification
主要验证class文件的字节流信息是否包含符合当前jvm的要求,以及该信息是否危害jvm的安全 - Preparation
准备阶段是正式为变量在方法区中分配内存空间,并设置初始值 - Resolution
解析阶段是将常量池中的符号引用替换为直接引用的过程。
(符号引用与虚拟机的直接布局无关,引用的目标不一定要直接加载到内存中,各种虚拟机实现的内存布局可以不相同,但是要接受的符号引用必须是一致的,符号引用的字面量形式明确定义在JVM的Class文件格式中)
(直接引用可以是一个指针,或者相对偏移量或者是能够直接定义到目标的句柄。若是直接存在,那么引用目标必定已经存在在内存中) - Initialization
真正开始执行java程序中的代码。
初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类变量的赋值操作和静态语句块合并成。虚拟机会保证执行之前,父类的方法已经执行完成。
如果一个类中没有静态变量,也没有静态语句块,那么编译器可以不为该类生成()方法。
注意:(以下情况不会进行初始化)
1.通过子类引用父类的静态字段,只会触发父类 的初始化,而不会触发子类的初始化。
2.定义对象数组,不会触发该类初始化
3.常量在编译期间会进入类的常量池中,本质上没有直接引用定义常量的类,不会触发定义常量的类。
4.通过类名获取Class对象,不会触发类的初始化
5.通过Class.forname加载类时,若指定参数initialize(该参数告诉jvm是否进行初始化操作)为false,不会触发初始化
6.通过ClassLoader默认的loadClass方法,也不会触发初始化动作。
JVM的分区
五个分区:程序计数器,本地方法栈,方法区,堆,栈
- Program Counter Register
用于指示执行哪条命令。
在jvm中,多线程是通过线程轮流获取CPU执行时间。因此在任意具体时刻,cpu只会执行一条线程中的一个指令,为了使每个线程切换后能回到原来的位置,每个线程都需要有自己的单独的程序计数器,不会相互干扰 - Stack
java栈是java方法执行的内存模型。java栈由java栈帧(stack frame)构成,栈帧由局部变量表、指向运行时常量池的引用、方法返回地址、附加信息、操作数栈五部分组成。
当线程执行一个方法时,会有一个相对应的栈帧压栈,在方法执行完毕后出栈。
局部变量表用于存储方法中产生的局部变量;操作数栈用于计算;指向运行时常量池引用用于取出类中常量;方法返回地址,用于在方法执行完成之后,返回到调用者。 - Native Method Stack
本地方法栈与操作系统机密联系,jvm调用系统中的功能。 - Heap
堆用于存取对象和数组内容(数组引用在栈中)。在c语言中,程序员可以通过malloc以及free函数对堆内存进行管理。与c语言不同,java的垃圾回收机制会自动处理。java堆内存是被所有线程共有的,在jvm中只有一个堆。 - Method Area
在方法区中存储了每一个类的信息、静态变量、常量以及编译器编译后的代码。在方法区中有一个非常重要的内容就是运行时常量池,在类或者接口被加载到jvm中后,相应的运行时常量池就被建立。