coreJava_1——Linux下安装配置jdk及Java程序运行原理

一、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仍可成功运行。

你可能感兴趣的:(coreJava_1——Linux下安装配置jdk及Java程序运行原理)