JAVA工作方式
源程序(myProgram.java) – > 编译(javac myProgram.java) -> JAVA字节码(myProgram.class) ->运行(java myProgram)
指令:
- 编译时:javac(compiler) + 文件名
- 运行时:java +文件名
JAVA的程序结构
源文件>类>方法>语句(source file > class > method > statement)
注意:
- 文件名MyFirstApp一定要文件内class的名称相同,大小写敏感。
- 使用javac指令编译时,大小写不敏感。
- 使用java指令运行时,大小写敏感。
- import java.lang 可省略
- 程序启动时会去找main()方法,main()是程序的起点
- 1个程序有且至于1个mian()方法
- 1个JAVA程序至少有1个类,但是同时可以是多个
- JAVA是强类型,条件测试结果一定要是boolean值
JDK、JRE、JVM的区别:
- JVM(Java Virtual Machine):JAVA虚拟机
- JDK(Java Developer’s Kit):Java开发工具包
- JRE(Java runtime environment):Java 运行环境
编程语言的分类(按程序的执行方式):
1.编译型语言:指使用专门的编译器,针对特定的操作系统将源程序代码一次性翻译成计算机能识别的机器指令。如C、C++
2.解释型语言:指使用专门的解释器,将源程序代码逐条地解释成特定的机器指令,解释一句执行一句,类似于同声翻译。如ASP、PHP。
JVM初识及工作原理:
JVM主要包括四个部分:
1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中。
2.执行引擎:负责执行class文件中包含的字节码指令
3.内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。运行时内存区主要可以划分为5个区域,如图:
- 方法区(Method Area):用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。虽然JVM规范把方法区描述为堆的一个逻辑部分, 但它却有个别名non-heap(非堆),所以大家不要搞混淆了。方法区还包含一个运行时常量池。
- java堆(Heap):存储java实例或者对象的地方。这块是GC的主要区域(后面解释)。从存储的内容我们可以很容易知道,方法区和堆是被所有java线程共享的。
- java栈(Stack):java栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈。在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是现成私有的。
- 程序计数器(PC Register):用于保存当前线程执行的内存地址。由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。
- 本地方法栈(Native Method Stack):和java栈的作用差不多,只不过是为JVM使用到的native方法服务的
4.本地方法接口:主要是调用C或C++实现的本地方法及返回结果。
JVM在整个JDK中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个王正的Java运行环境,因此也称为虚拟计算机。操作系统装入JVM是通过JDK中的java.exe来实现,主要以下几步:
1.创建jvm装载环境和配置
2.装载jvm.dll
3.初始化jvm.dll
4.调用JNIEnv实例装载并处理class类
5.运行java程序
什么是GC,GC的工作原理是什么: Garbage Collection,垃圾回收
1.垃圾收集器一般必须完成两件事:检测出垃圾;回收垃圾。怎么检测出垃圾?一般有以下几种方法:
引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1;引用失效就减1。
可达性分析算法:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。这里的根集一般包括java栈中引用的对象、方法区常量池中引用的对 象,本地方法中引用的对象等。
2.为什么要运用分代垃圾回收策略?
在java程序运行的过程中,会产生大量的对象,因每个对象所能承担的职责不同所具有的功能不同所以也有着不一样的生命周期,有的对象生命周期较长,比如Http请求中的Session对象,线程,Socket连接等;有的对象生命周期较短,比如String对象,由于其不变类的特性,有的在使用一次后即可回收。试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,那么消耗的时间相对会很长,而且对于存活时间较长的对象进行的扫描工作等都是徒劳。因此就需要引入分治的思想,所谓分治的思想就是因地制宜,将对象进行代的划分,把不同生命周期的对象放在不同的代上使用不同的垃圾回收方式。
3.如何划分?
将对象按其生命周期的不同划分成:年轻代(Young Generation)、年老代(Old Generation)、持久代(Permanent Generation)。其中持久代主要存放的是类信息,所以与java对象的回收关系不大,与回收息息相关的是年轻代和年老代。
4.分代回收的效果图如下: