2020/2/25学习笔记-day05

java-day5

目录

java-day5

早上

第一节课

通过对API内的部分代码反编译查看

第二节课

回顾双亲委托内容

运行jar包的方式总结

第三节课

自定义类加载器

下午

JAVA是什么?

为什么会发明JAVA?

编译语言

垃圾回收器

1、java不需要自己分配内存

2、new关键字创建对象使用了内存,最终要把内存释放

3、垃圾回收器是什么?

4、我们是否能控制垃圾回收器去回收内存垃圾?

字节码验证

字节码验证规则

解释执行

JIT(Just InTime)即时编译


早上

第一节课

通过对API内的部分代码反编译查看

第二节课

回顾双亲委托内容

运行jar包的方式总结

person.jar是一个可执行jar包,里面有com.xxx.Person.class
同时Person类运行需要依赖hello.jar和commons.jar中的类
这时候有两种方式运行:
1、修改MF文件(配置Class-Path:.....)
2、以运行java类的方式去运行person.jar中的Person类
MF文件不需要配置,只需在外面配置系统环境变量
set classpth=jar/person.jar;jar/hello.jar;jar/c.jar;

将三个包都放在ext文件下,通过双亲委托机制运行

第三节课

自定义类加载器

调用API流程

ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(appClassLoader); 
//sun.misc.Launcher$AppClassLoader@2a139a55
​
ClassLoader extClassLoader = appClassLoader.getParent();
System.out.println(extClassLoader); 
//sun.misc.Launcher$ExtClassLoader@7852e922
​
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println(bootClassLoader);
//null
//注意:启动类加载在java中无法表示,因为它不是java语言实现的。所有这里输出null

下午

variables变量

JAVA是什么?

从jdk角度想,jdk提供什么?jdk能干嘛?
1、编程语言
2、开发环境 
3、运行环境
4、部署环境

为什么会发明JAVA?

1、提供解释的环境(Java不是真正的编译语言)
    *加速我们的开发
    *一次编写到处运行(跨平台)
        不同平台:操作系统不同
                操作系统内核不同
                操作支持的机器语言不同
    真正的编译语言一般只是针对当前系统中的内核来编译
    换个平台就不行了
    
    java语言为什么可以跨平台?
    java在不同平台有针对该平台的不同虚拟机
    
    *支持多线程
    *动态支持升级(JRE)
2、java提供更加简单的编程方式
    *代码更加强壮: 
    a、没有指针
    (程序员不需要自己控制指针来针对不同数据的操作)
​
    b、代码中没有内存指针管理
    (程序员不需要自己控制内存的分配使用和释放。
    避免了操作不当导致的内存溢出或泄露,这些JVM会搞定)
​
    c、纯正的面向对象编程
    (在java中一切皆为对象,做任何操作都是需要对象:
    例如:调用方法、访问属性都是通过对象来操作的。
    但是static修饰的方法和属性除了对象也可以用类名来访问)

编译语言

hello... --编译--> xxx(计算机直接执行)
例如:C语言
​
但是java并不是真正的编译语言
Hello.java--编译-->Hello.class-->JVM
--解释字节码-->计算机执行

垃圾回收器

1、java不需要自己分配内存

JAVA有一个关键字:new
同时他也代表了一个操作:创建对象的操作
使用new关键字就表示我们要在java中创建对象,在创建对象之前new关键字
内存中自动为我们申请一块空间,用来存放即将创建来的对象,同时我们要用
的数据也在这个内存中
​
例如:Person p = new Person(1,"Tom",20);
使用new关键字来创建Person类的一个对象,也称一个实例
同时在内存中从JVM申请一块内存空间存放这个对象,把对象的数据也存进来

2、new关键字创建对象使用了内存,最终要把内存释放

 (不用程序员管理)JVM有一个叫垃圾回收器
 作用:回收内存中使用过,现在已经不用了的内存空间

3、垃圾回收器是什么?

其实垃圾回收器也是JVM中的一对代码,它运行之后可以帮助我们回收不再使用的内存空间,以便让接下来要使用的代码继续使用。

4、我们是否能控制垃圾回收器去回收内存垃圾?

不能,我们只能通过调用相关的API建议垃圾回收器去清理内存垃圾。
但是是不是立刻清理,程序员控制不了。需要根据当前内存使用情况
和垃圾回收器的内置算法来决定的。
​
对应的API:
java.1ang.System.gc(); 
java.1ang.Runtime.gc();

字节码验证

一个class文件被加载到JVM内存之后,实现要经过字节码验证,验证通过后再确定哪些代码是解释执行的,那些代码是JIT及时编译执行的

字节码验证规则

1、检查当前class文件的版本和JVM的版本是否兼容
高版本的JDK编译出的class文件,使用低版本的JDK[无法]运行
低版本的JDK编译出的class文件,使用高版本的JDK[可以]运行
​
2、坚持代码是否破坏系统的完整性
​
3、检查当前代码是否有栈的溢出的情况
​
4、检查当前代码的参数类型是否正确
​
5、检查当前代码中的类型转换是否正确

解释执行

是java并不是真正的编译语言,编译成的class文件需要JVM文件
进行解释,解释成计算机可以执行的代码。解释一行代码就执行一
行代码。
​
如果全是如上方法,效率不高。

JIT(Just InTime)即时编译

它是JVM中执行java代码的一种方式,JVM可以使用JIT把java中的热点代码直接编译成计算机可以运行的代码,这样接下来再调用这个热点代码的时候,就可以直接使用编译好的代码让计算机直接运行,这样子可以提高运行效率。

发布了82 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/iostream992/article/details/104501087