什么是Java?
Java是世界上最流行的编程语言,语法由Java Language Specification 规定,针对于JVM的编程语言。
为什么用Java ?
1.跨平台
①通过不同操作系统安装不同的Java虚拟机达到一份代码处处运行
2.自动垃圾回收
①使程序员不用再担心内存释放的问题,可以专注于业务逻辑的实现
Java的核心:JVM
JVM (Java virtual machine)全称:Java虚拟机 简单说就是安装在操作系统上的另一个虚构的操作系统,但是这个操作系统只针对Java翻译后的字解码文件,通过字解码上的信息,来调用操作系统的函数库,来模拟真实的计算机,执行Java语言的各种指令。
虚拟机的组成部分:
类装载器:将Java本地的类库与编写的类库装载到方法区。
公开的区域:
方法区:存放Java各种类,方法,常量等等东西的地方
堆:存放对象的地方,当程序new一个对象时,这里会创建一块内存空间
私有的区域:
虚拟机栈:执行方法的地方,当运行到一个方法之后,会以先进后出的方法存 放一个一个方法执行完一个方法后会先释放掉这个方法。
本地方法栈:将虚拟机栈中执行的指令,作用到物理机调度本地函数的地方
程序计数器:用于标记程序运行位置,在多线程情况下,线程切换时,程序运 行到哪个地方,由它来记录。
JVM运行流程:
解放指针的:
GC自动垃圾回收:
GC(Garbage Collection)自动垃圾回收,JVM的核心之一,使得程序员可以 专心的安排业务逻辑不必担心内存空间浪费的问题。
GC把内存空间分为了三个区域:
GC如何知道哪部分内存需要释放?
1.什么样的对象需要被释放?
判断存活有两种算法:
1)引用计数算法
给对象添加一个引用计数器,当有地方引用它时,计数器值就加1;当引用失 效时, 计数器值就减1;计数器为0的对象就是不被使用的。
2)可达性分析算法
通过GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
2.怎么释放垃圾?
三种方式:
1 标记-清除算法:
通过可达性分析方式找到所以需要回收的对象,并进行标记,在标记完成后统一回收所有被标记的对象。
主要问题是容易参数内存碎片。
2 复制算法
它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收,缺点是每次都这样大量复制,太影响性能
3 标记-整理算法
标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。以此避免内存碎片。
分代收集法,根据对象存活的生命周期分为:新生代、老年代和永久代;
1)新生代:每次都回收大量对象—>复制算法
2)老年代:每次都回收少量对象—>标记整理法
3)永久代:存储class类、常量、方法描述,回收废弃常量和无用类
当然,Java肯定不止这两个优势,同时它通过世界上最大的开源社区,成为了最流行的编程语言。