Victor's Code Journey
Victor's Code Journey

算法简介

未完待续
持续更新中…

什么是算法?从一个步骤开始,按照既定的顺序执行完所有的步骤,最终结束得到结果的一个过程。

  • 确定性,算法的每个步骤都是明确的,对结果的预期也是确定的
  • 有穷性,算法必须是由有限个步骤组成的过程,步骤的数量可以是几个,也可以是几百万个,但是必须有一个确定的结束条件
  • 可行性,一般来说我们期望算法得出的是正确的结果,这意味着算法的每个步骤都是可行的,只要有一个步骤不可行,算法就是失败的,或者不能被称为某种算法。
  • 输入和输出,算法总是要解决特定的问题,问题的来源就是算法的输入,期望的结果就是算法的输出。

程序 = 算法+ 数据结构.

将问题抽象为数学模型,输入输出方法和算法步骤是编写计算机算法程序的三大关键要素。对于非常复杂的问题,建立数学模型是很困难的事情,但是对简单的计算机算法而言,建立数学模型实际上就是设计合适的数据结构的问题,同时,输入输出方式和算法步骤的设计都是基于相应的数据结构设计的。

Java 类加载

在java代码中,类型的加载,连接与初始化过程都是在程序运行期间完成的(类class文件信息在编译期间已经确定好)。

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载Loading、验证Verification、准备Preparation、解析Resolution、初始化Initialization、使用Using和卸载Unloading7个阶段。其中准备、验证、解析3个部分统称为连接Linking

加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。

注意,本文的JDK版本是Java 1.8,在Java 9 引进模块化后,ClassLoader也有了一些新变化。

Java虚拟机-Java内存模型

多任务处理在现代计算机操作系统中是一个必备功能。计算机的运算能力变得十分强大的同时,运算速度与存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信和数据库访问上,因此为了避免处理器的大部分时间都花费在等待其它资源,一种行之有效的方法是让计算机同时处理多项任务。

IEEE 754

浮点数是计算机科学中一种对于实数的近似数值表示法,由一个有效数字(尾数)加上幂数来表示,即二进制的科学计数法。IEEE 协会为了规范统一(方便CPU指令制造,各平台兼容等等)出台了 IEEE Standard for Floating-Point Arithmetic(IEEE-754)二进制浮点数算数标准,选用了浮点数作为储存和算数标准。 该标准描述了包括"浮点数的格式"、“一些特殊数值”、“浮点数的运算”、“舍入规则与例外情况” 等等内容。

Java虚拟机-内存分配与回收策略

对象的内存分配,主要是在堆上分配(也可能是JIT编译后被拆散成标量类型并间接的栈上分配):

  • 对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先分配在TLAB上。
  • 少数情况下会直接分配在老年代中。

分配的规则并不是百分百固定的,细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数设置。

对象的回收主要分为两种:

  • 新生代GC(Minor GC)指发生在新生代的垃圾回收动作,Minor GC十分频繁,回收速度较快。
  • 老年代GC(Major/Full GC)指发生在老年代的GC,出现了Major GC,经常会伴随至少一次Minor GC ,但非绝对,Parallel Scavenger 收集器里有直接进行Major GC的策略选择。通常,Major GC 比Minor GC 慢10倍以上。

Java虚拟机-GC算法简介

在了解垃圾回收算法前,我们先要了解几个基本概念。

首先是mutator和collector,这两个名词经常在垃圾收集算法中出现,collector指的就是垃圾收集器,而mutator是指除了垃圾收集器之外的部分,比如说我们应用程序本身。mutator的职责一般是NEW(分配内存),READ(从内存中读取内容),WRITE(将内容写入内存),而collector则就是回收不再使用的内存来供mutator进行NEW操作的使用。

第二个基本概念是关于mutator roots(mutator根对象),mutator根对象一般指的是分配在堆内存之外,可以直接被mutator直接访问到的对象,一般是指静态/全局变量以及Thread-Local变量(在Java中,存储在java.lang.ThreadLocal中的变量和分配在栈上的变量,方法内部的临时变量等都属于此类).

第三个基本概念是关于可达对象的定义,从mutator根对象开始进行遍历,可以被访问到的对象都称为是可达对象。这些对象也是mutator(你的应用程序)正在使用的对象。

Java并发之Thread

线程有时也被称为轻量级的进程。进程和线程都提供了一个执行环境,但创建一个新的线程比创建一个新的进程需要的资源要少。 线程是在进程中存在的,每个进程最少有一个线程。线程共享进程的资源,包括内存和打开的文件。这样提高了效率,但潜在的问题就是线程间的通信。