Java基础
Java程序运行机制
Java既有解释性语言特性,也具有编译型语言特性,Java程序先编译后解释
Java运行机制和JVM
Java程序如何执行的
- Java语言编写的程序先经过编译,编译后生成一种平台无关的字节码(*.class文件)(编译性语言在此步骤生成特定平台的机器码)。
- 生成的字节码可以通过使用Java解释器来执行。
Java编译器
编译器负责将Java文件编译生成一种平台无关的字节码。
- 编译器接受各平台上的JVM所提供的相同编程接口
- 编译器只用面向虚拟机,生成虚拟机所需代码
JVM
JVM是负责解释执行字节码的部分。
- JVM是可以运行Java字节码文件的虚拟计算机
- 所有平台上的JVM向编译器提供相同的编程接口。
- JVM根据平台不同,向下适应不同的平台
Sun公司指定的Java统一细节
- 指令集
- 寄存器
- 类文件的格式
- 栈
- 垃圾回收栈
- 存储区
Java程序的基本规则
Java程序的组织形式
Java程序必须以类的形式存在,类是Java程序的最小程序单位。
-
Java程序不允许可执行语句、方法等成分独立存在,所有的程序必须放在类定义里
-
最简单的Java程序:
-
class Test { }
-
⭐如果类能被解释器直接解释执行,则这个类里必须包含main方法,同时main方法必须使用public static void来进行修饰
-
class Test { public static void main(String[] args) { } }
-
main方法是Java程序的入口
Java源文件命名规则
- Java程序源文件的后缀必须是.java
- 通常情况下,Java程序源文件的主文件名可以是任意的,
- 特例:如果Java程序定义了一个public类,该源文件的主文件名必须与该public类的类名相同(例如helloworld程序)
- 由此特例可知:Java程序源文件里最多只能定义一个public类
- 一个Java源文件里可以包含多个类定义,但是最多只能包含一个public类
Java源文件中没有包含public类时的建议规范
- 一个Java源文件之定义一个类,不同的类使用不同的源文件定义
- 将每个源文件中单独定义的类都定义成public
- 保持Java源文件的主文件名与该源文件中定义的public类同名
Java垃圾回收机制
显示垃圾回收缺点:
- 程序忘记及时回收无用内存,会导致内存泄漏,降低系统性能
- 程序错误地回收程序核心类库的内存,从而导致系统崩溃
Java程序内存回收机制
Java程序的内存回收与分配都是JRE在后台自动进行的。
- JRE负责回收不再使用的内存,这种机制被称为垃圾回收(Garbage Collection,GC)
JRE回收内存机制
- JRE通常会提供一条超级线程来进行检测和控制
- 通常在CPU空闲或内存不足时自动进行内存回收
- 程序员无法精确控制垃圾回收的时间和顺序
- Java的堆内存时一个运行时数据区,用以保存类的实例(对象)
- Java虚拟机的堆内存中存储着正在运行的应用程序所建立的所有对象,这些对象不需要程序通过代码来显示释放
- 堆内存是由垃圾回收来负责的,所有的JVM在在实现时都有一个由垃圾回收机制管理的堆内存
- 垃圾回收机制是一种动态存储管理技术
JVM垃圾回收机制优点
- 提高编程效率,以来垃圾回收机制可以缩短对存储器管理的时间
- 垃圾回收机制保护程序的完整性
JVM潜在的缺点
- 垃圾回收机制会增加资源的开销,应i昂程序的性能
- 进行垃圾回收时会有额外的处理器时间开销
- 垃圾回收算法不完备性,早期的内存回收机制不能保证完全回收内存
JVM垃圾回收特点
- 垃圾回收机制的目的是回收无用对象的内存空间,这些内存空间都是JVM堆内存里的内存空间,垃圾回收只能回收内存资源(数据库连接、磁盘IO等都不能回收)
- 将想让内存回收机制回收的对象的引用变量设置为null,可以按时内存回收机制回收该对象,加快垃圾回收
- 由于不同的JVM采用了不同的垃圾回收机制,和不同的垃圾回收算法,因此它由可能是定时发生,有可能是CPU空闲时发生,也有可能等到内存小号出现极限时发生。
- 可以通过finalize()方法或System.gc()方法来进行内存回收,但不能精确控制内存回收机制
- 垃圾回收的精确性表现:
- 垃圾回收机制能够精确地标记alive的对象(能够完全回收所有废弃对象的前提,不能确保的话就会造成内存泄漏)
- 垃圾回收器能够精确地定位对象之间的引用关系。(实现归并和赋值等算法的必要条件,通过这种引用关系,可以保证所有的对象都被可靠地回收,从而保证所有对象能够被重新分配,减少内存碎片的产生)
- JVM有不同的内存回收实现
- 有的当垃圾回收开始时就停止应用程序运行,
- 有的当垃圾回收运行时,同时允许应用程序的线程运行
- 有的在同一时间垃圾回收多线程运行