23 Sep 2019
Docker
包括一个命令行程序、一个后台守护进程,以及一组远程服务。它解决了常见的软件问题,并简化了安装、运行、发布和删除转件。这一切能够实现是通过使用一项UNIX
技术,称为容器。
事实上,Docker
项目确实与Cloud Foundry
的容器在大部分功能和实现原理上都是一样的,可偏偏就是这剩下的一小部分不一样的功能成为了Docker
呼风唤雨的不二法宝,这个功能就是Docker
镜像。
与传统的PaaS
项目相比,Docker
镜像解决的恰恰就是打包这个根本性问题。所谓的Docker
镜像,其实就是一个压缩包。但是这个压缩包中的内容比PaaS
的应用可执行文件+启停脚本的组合就要丰富多了。实际上,大多数Docker
镜像是直接由一个完整操作系统的所有文件和目录构成的,所以这个压缩包内容和本地开发、测试环境用的操作系统是完全一样的,这正是Docker
镜像的精髓所在。
12 Aug 2019
Java
与C++
之间有一堵由内存分配和垃圾回收技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。对于C
、C++
程序开发人员来说,在内存管理领域,它们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民。拥有每一个对象的所有权,也有担负着每一个对象生命开始到终结的维护责任。
对Java
程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new
操作写配对的delete
、free
代码,因有虚拟机管理内存,不容易出现内存泄漏和内存溢出的问题。
1. 虚拟机内存结构:
jvm
会把它管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖于用户线程的启动和结束而建立和销毁。
程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
13 Apr 2019
java8提供了一个新的API(称为流 Stream),它支持许多并行的操作,其思路和在数据库查询语言中的思路类似——用更高级的方式表达想要的东西,而由“实现”来选择最佳低级执行机制。这样就可以避免synchronized
编写代码,这一行代码不仅容易出错,而且在多核cpu上的执行所需成本也比想象的高;
在java8中加入Stream可以看作把另外两项扩充加入java8的原因:把代码传递给方法的简洁方式(方法引用、lambda)和接口中的默认方法;java8里面将代码传递给方法的功能(同时也能返回代码并将其包含在数据结构中)还让我们能够使用一套新技巧,通常称为函数式编程;
java8引入默认方法主要是为了支持库设计师,让他们能够写出更容易改进的接口。这一方法很重要,因为你会在接口中遇到越来越多的默认方法。由于真正需要编写默认方法的程序员较少,而且它们只是有助于程序改进。
1. 行为参数化:
让你的方法接受多种行为(或策略)作为参数,并在内部使用完成不同的行为。行为参数化是一个很有用的设计模式,它能够轻松的适应不断变化的需求。这种模式可以把一个行为(一段代码)封装起来,并通过传递和使用创建的行为(例如对Apple的不同谓词)将方法进行行为参数化。