一、jdk环境配置
1、在终端中找到已下载好的jdk包位置,如jdk-8u91-linux-x64.tar.gz,在/home/Desktop
2、将文件解压放在/opt
sudo tar -xzvf jdk-8u91-linux-x64.tar.gz -C /opt
注:
-c建立压缩文件
-x解压缩文件
-z使用gzip压缩
-v显示所有过程
-f指定创建的文件名(注意-f后边只能接文件名,如-fc test.tar.gz错误)
3、为方便后期jdk的升级维护等,建立软链接(或快捷方式):到解压目录下,建立名称为jdk的软链接指向解压后的jdk1.8.0_91 jdk
cd /opt
sudo ln -s jdk1.8.0_91 jdk jdk
4、配置初始化文件(注意修改>bashrc前做好备份)
cd ~
vim .bashrc
在最后添加以下内容:
export JAVA_HOME=/opt/jdk
export CLASSPATH=$CLASSPATH:.
export PATH=$JAVA_HOME/bin:$PATH
注:JAVA_HOME :指定jdk的安装目录,配置的目的是其他
第三软件启动的时候会默认到环境变量中加载JAVA_HOME
e.g. : tomcat(服务器)
CLASSPATH java程序执行被装载到JVM虚拟机中(内存中)
JVM虚拟机通过CLASSPATH找到你编写的代码
PATH: 可执行的命令存放的路径,将来命令的执行就是基于PATH找到的
(注:1. PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
2. CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的.class文件。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
javac -c 路径 (可以指定class文件存放目录)
java -cp 路径 (可以指定要执行的class目录)
3. JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。
)
5、保存退出
6、验证
运行java、javac、java -version
二、jdk目录结构
bin: 存放java的执行命令,该目录应当保存到PATH变量中
Lib:是JDK工具用到的类库及其他文件,eg:tools.jar就包含了对开发工具的支持功能库
jre: java的运行环境(包含了java的类库和JVM虚拟机)
src.zip:jdk提供的类库的java代码
db:jdk自带的小型数据库
Include:包含c语言编写的文件
jre/lib/rt.jar jdk提供的类库的字节码 ,
对应的java代码在src.zip
三、Java特点
1、加速开发,写一次,到处运行,支持程序多线程的出来,动态的支持升级及编译
2、没有指针,不需要管理内存,纯粹的面相对象编程
3、提供gc的支持
4、垃圾回收器(GC)
垃圾回收器:java中有一个线程,专门负责JVM中垃圾内存的释放
垃圾:没有引用的内存节点
5、垃圾回收的算法
注意:有垃圾回收相关方法java.lang.System.gc()、java.lang.Runtime.gc(),但还是无法控制垃圾回收机制
算法有:标记-清除,复制,标记-整理,分代收集
四、Java程序执行的整个流程
Hello.java- -编译 ->Hello.class- ClassLoader装载- ->JVM- ->字节码验证
- ->对字节码逐行解析(解释执行)- ->执行
- ->JIT(即时编译) - ->执行
五、JVM装载.class文件到内存的双亲委托机制
1、启动级类加载器(Bootstrp ClassLoader)用C++语言写的,它是在Java虚拟机启动后初始化,它主要负责加载%JAVA_HOME%/jre/lib,
-Xbootclasspath参数指定的路径
以及%JAVA_HOME%/jre/classes中的类
2、扩展级类加载器(Extension ClassLoader)用java语言写的,它负责将%JAVA_HOME%/jre/lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
3、本地类加载器(Applicaiton ClassLoader)用java语言写的,用于加载我们自己定义编写的类,它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统(System)加载器
4、双亲委托机制加载类的过程
当本地类加载器加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器扩展级类加载器去完成。
当扩展级类加载器加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
如果启动级类加载器加载失败,会使用扩展级类加载器来尝试加载;
若扩展级类加载器也加载失败,则会使用本地类加载器来加载,
如果本地类加载器也加载失败,则会报出异常ClassNotFoundException。
案例:如果把编译后生成的.class打包为.jar,并把该jar包移到扩展级类的目录下(如%JAVA_HOME%/jre/lib/ext),那么运行java hello仍可成功运行。