课程笔记:
Java的特性:
面向对象
跨平台
吸收了c/c++的优点
安全性较高(自动回收垃圾(GC),强制类型检查(在运行之前准确说是编写过程中提出错误,不给出错的机会),取消指针)
Java跨平台原理
Java虚拟机(JVM)万能翻译机
Java虚拟机(JVM)流程:
编写的源代码经过编译器翻译成class(Java字节码)文件,文件通过本地存储、u盘或者网络传送到
其他的运行环境中,类装载器对放到环境中的代码进行验证,发现没有问题后,引入系统的一些Java类
库(功能库),结合后发送给Java虚拟机(JVM),JVM获得代码后将代码进行解释(Java解释器)然
后翻译(即时编译器)成指令,再交给运行期系统,然后再发送给本地的操作系统(windows或者Macs),操作系统再将指令发送给硬件进行执行。
JVM可以理解成一个可运行Java字节码的虚拟计算机系统
1.它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信
2.对于不同的平台,有不同的JVM
JVM屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
垃圾回收器(GC)
不再使用的内存空间应当进行回收-垃圾回收;
c/c++中需要程序员自己对无用的内存进行回收;
Java语言消除了程序员回收无用内存空间的责任;
JVM提供了一个系统线程,用于跟踪存储空间的分配情况,检查并释放那些可以被释放的存储空间。
垃圾回收器在Java程序运行过程中自动启用,程序员无法精确控制和干预。
课外延展:
什么是Java垃圾回收器?
Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动
分配(Memory Allocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存块)。某一个时点,
一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃
圾回收器回收再利用。垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不是实时的发生
(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,使用内存占总内存的比列,比如0.75)时,触发垃圾
回收操作。有一个对象死亡的例外,java.lang.Thread类型的对象即使没有引用,只要线程还在运行,就不会被回收。
回收的机制:
依据统计分析可知,Java(包括一些其它高级语言)里面大多数对象生命周期都是短暂的,所以把Java内存分代管理。分代的
目的无非就是为不同代的内存块运用不同的管理策略(算法),从而最大化性能。相对于年老代,通常年轻代要小很多,回收
的频率高,速度快。年老代则回收频率低,耗时长。内存在年轻代里面分配,年轻代里面的对象经过多个回收周期依然存活
的会自动晋升到年老代。
设计选型(Design Choices)
设计选型影响JVM垃圾回收器的实现难度,以及JVM的性能指标,适用于不同的场景。描述的是回收算法的风格特点。
单线程串行回收 VS 多线程并行回收
回收操作自身是否多线程处理的问题。单线程回收的优点是简单,易实现,碎片少,适用于单核的机器。多线程并行回收在多核机器上面可以充分的利用CPU资源,减少回收的时间,增加生产力,缺点是复杂且可能有部分碎片没有回收。
回收时暂停应用线程 VS 回收和应用并发进行
回收操作时是否暂停应用线程的问题。暂停应用线程的优点是简单、准确、清理得比较干净、清理的时间也短(CPU资源独占),缺点是暂停应用线程之后会造成垃圾回收周期内应用的回应时间拉长,实时性非常高的系统比较敏感。回收和应用线程并行处理的优点是应用反应时间比较平稳、缺点是实现难度大、清理频率高、可能有碎片。
不合并释放的内存片段 VS 合并释放的内存片段 VS 把活着的复制到新的地方
这三个选型描述的是如何管理死亡的内存块片段。死亡的内存片段通常散落在堆的各个地方,如果不加以管理会有两个问题,内存分配的时候因查找可用的内存而导致速度慢,小的碎片会导致内存的浪费(比如大的数组要求大的连续内存片段)。管理有两种方式,把活着的内存挪到内存块的某一端,记录可用内存的开始位置,或者干脆把活着的内存复制到一个新的内存区域,原来的内存块整个空出来。
性能指标(Performance Metrics)
生产率(Throughput)
一个较长的周期(长的周期才有意义)内,非回收时间占总时间的比率。度量系统的运行效率。
垃圾回收花费(Garbage Collection overhead)
一个较长的周期内,回收时间占总时间的比率。与生产率相对应,加起来为100%。
暂停时间间隔(Pause time)
Java虚拟机在回收垃圾的时候,有的算法会暂停所有应用线程的执行,某些系统可能对暂停的时间间隔比较敏感。
回收的频率(Frequency of collection)
平均多久会发生回收操作。
内存占用的大小(Footprint)
如堆的大小。
实时性(Promptness)
自一个对象死亡起,经过多久该对象所占用内存被回收。
垃圾回收的类型
所有的回收器类型都是基于分代技术。Java HotSpot虚拟机包含三代,年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation)。
永久代
存储类、方法以及它们的描述信息。可以通过-XX:PermSize=64m和-XX:MaxPermSize=128m两个可选项指定初始大小和最大值。通常 我们不需要调节该参数,默认的永久代大小足够了,不过如果加载的类非常多,不够用了,调节最大值即可。
年老代
主要存储年轻代中经过多个回收周期仍然存活从而升级的对象,当然对于一些大的内存分配,可能也直接分配到永久代(一个极端的例子是年轻代根本就存不下)。
年轻代
绝大多数的内存分配回收动作都发生在年轻代。如下图所示, 年轻代被划分为三个区域,原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区。
JDK和JRE
JDK(Java Development Kits)--Java开发工具集
1.JRE(Java Runtime Environment)Java运行时环境
JVM
Java API(应用程序编程接口)
2.Java编译器(javac.exe)、Java运行时解释器(java.exe)、Java文档化工具(javadoc.exe)及其他工具及资源
JRE的三项主要功能:
1.加载代码:由类加载器(class loader)完成;
2.校验代买:由字节码校验器(byte code verifier)完成;
3.执行代码:由运行时解释器(runtime interpreter)完成。
环境变量详述
为执行的指令提供的环境
内部命令:指定文件夹中的命令
外部命令:环境变量中的命令
配置环境变量就是将安装的jdk下bin目录的指令加载到外部指令里
JAVA_HOME环境变量
将JDK安装的目录对应上JAVA_HOME这个名字
引用JAVA_HOME时需要在%%中间
区别:
修改环境变量只需要修改JAVA_HOME中就可以了,降低修改path时可能产生的风险
Java程序开发的三个步骤
1.编写源程序 2.编译源程序 3.运行
程序编写:(eclipse)
调整文字大小:window->preferences->general->appearance->colors and fonts->basic-text font
代码语句分类
1.结构定义语句
2.功能执行语句