Class字节码文件
Class字节码文件概述Java源代码的编译结果是字节码,那么肯定需要有一种编译器能够将Java源码编译为字节码,承担这个重要责任的就是配置在path环境变量中的javac编译器。javac是一种能够将Java源码编译为字节码的前端编译器。
源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVN的指令,而不像C、C+t经由编译器直接生成机器码。
Java的跨平台性:
Java虚拟机不和包括 Java 在内的任何语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。
class字节码文件可以通过JDK自带的javap命令来反编译查看
字节码文件结构Class文件的总体结构如下:
魔数
类型:u4(4个字节的无符号整数)
名称:magic
说明:用于识别Class文件格式
Class文件版本
类型:u2+u2(4个字节的无符号整数)
名称:minor_version+major_version
说明:包 ...
垃圾回收器
垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。
垃圾回收器分类:
按线程数分:可以分为串行垃圾回收器和并行垃圾回收器。
按工作模式分:可以分为并发式垃圾回收器和独占式垃圾回收器。
并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。
独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
按碎片处理方式分:可分为压缩式垃圾回收器和非压缩式垃圾回收器。
压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
再分配对象空间使用:指针碰撞
非压缩式的垃圾回收器不进行这步操作。
再分配对象空间使用:空闲列表
按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器。
-XX:+PrinrCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
性能指标
吞吐量:运 ...
垃圾回收
垃圾回收概述什么是垃圾( Garbage)呢?
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。
为什么需要GC
如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。
除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。
随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。
Java自动内存管理
Java自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险,自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发。
自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险让你头疼不已。
垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全堆和方法区的回收。
Java堆是垃圾收集器 ...
对象引用
对象引用概述在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。
强引用(Strong Reference) :
最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似”object obj=new object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
软引用(Soft Reference):
在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。
弱引用(Weak Reference):
被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存空间是否足够,都会回收掉被弱引用关联的对象。
虚引用(Phantom Reference):
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通 ...
执行引擎
执行引擎概述“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
编译和执行的过程Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
JIT编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
缺省情况下HotSpot VM是采用解释器与即时编译器并存的架构,当然开发人员可以根据具体的应用场景,通过命令显式地为Java虚拟机指定在运行时到底是完全采用解释器执行,还是完全采用即时编译器执行。如下所示:
-Xin ...
运行时数据区
运行时数据区概述大致结构图:
详细内存划分图:
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
每个线程:独立包括程序计数器、栈、本地栈。
线程间共享:堆、堆外内存(永久代或元空间、代码缓存)
Runtime类:每个JVM只有一个Runtime实例。即为运行时环境,相当于内存结构的中间的那个框框:运行时环境。
程序计数器JVM中的程序计数寄存器(Program counter Register)中, Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。
这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。
在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
作用:
P ...
对象的实例化
对象的实例化对象创建的方式
new对象
常规直接new
XXX的静态方法
XXXBuilder/XXXFactory的静态方法
Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public
Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求
使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
使用反序列化:从文件中、从网络中获取—个对象的二进制流
创建步骤1.判断对象对应的类是否加载、链接、初始化
虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛)出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class类对象
2. ...
类的加载过程
类的加载过程类加载子系统结构:
作用:
类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。
ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定。
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
类的加载过程Loading阶段主要功能:
1.通过一个类的全限定名获取定义此类的二进制字节流2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
Linking阶段主要功能:
验证:
目的在子确保class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。
主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
准备:
为类变量分配内存并且设置该类变量的默认初始值,即零值。
这 ...
JVM概述
JVM概述简介介绍
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。
Java技术的核心就是Java虚拟机(JVM,Java virtual Machine) ,因为所有的Java程序都运行在Java虚拟机内部。
作用Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点
一次编译,到处运行
自动内存管理
自动垃圾回收功能
JVM所处位置
JVM的整体结构
执行流程:
java程序编写
通过jiava编译器编译成class字节码文件
在JVM上进行解释执行
类的加载
字节码校验
执行引擎对字节码进行解析编译执行
在具体操作系统上执行
JVM生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class load ...
分布式系统认证
分布式系统认证方案什么是分布式系统随着软件环境和需求的变化 ,软件的架构由单体结构演变为分布式架构,具有分布式架构的系统叫分布式系统,分布式系统的运行通常依赖网络,它将单体结构的系统分为若干服务,服务之间通过网络交互来完成用户的业务处理,当前流行的微服务架构就是分布式系统架构,如下图:
分布式认证需求分布式系统的每个服务都会有认证、授权的需求,如果每个服务都实现一套认证授权逻辑会非常冗余,考虑分布式系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求;考虑分布式系统开放性的特点,不仅对系统内部服务提供认证,对第三方系统也要提供认证。分布式认证的需求总结如下:统一认证授权
统一认证授权:提供独立的认证服务,统一处理认证授权。
应用接入认证:应提供扩展和开放能力,提供安全的系统对接机制,并可开放部分API给接入第三方使用,一方应用(内部 系统服务)和三方应用(第三方应用)均采用统一机制接入。
技术方案根据 选型的分析,决定采用基于token的认证方式,它的优点是:
适合统一认证的机制,客户端、一方应用、三方应用都遵循一致的认证机制。
token认证方式对第三方应用接入更适 ...