春节读书计划

难得放假,读读书也是不错的。过年也就这么几天,准备读这几本书。

  • 大话处理器:处理器基础知识读本

这本到今天已经读完,算是提前完成任务了。作为入门级的读本,本书幽默风趣,真是在适合不过。

大话处理器:处理器基础知识读本

  • Java并发编程的艺术

草草翻了2章,不点到为止,系统化从底层讲起应该算是本书区别于市面上其它书籍的显著特征。

Java并发编程的艺术

  • 实战Java虚拟机:JVM故障诊断与性能优化

读过周志明的深入理解Java虚拟机:JVM高级特性与最佳实践(第1版)
个人感觉,还是葛一鸣写得更加简单明了

实战Java虚拟机:JVM故障诊断与性能优化

春节期间的任务就是读书,带娃,串门。

JAVA 8 学习总结

最近一周 JAVA8 的学习总结

Lambda 表达式

  • Predicate

方法: boolean test(T t)
函数描述: T -> boolean
作用: 传入一个参数,返回一个bool结果
特征化原始类型: IntPredicate, LongPredicate, DoublePredicate

  • Consumer

方法: boolean test(T t)
函数描述: T -> void
作用: 传入一个参数,返回一个bool结果
特征化原始类型: IntPredicate, LongPredicate, DoublePredicate

  • Function

方法: R apply(T t)
函数描述: T -> R
作用: 传入一个参数,返回一个结果
特征化原始类型: IntFunction, IntToLongFunction, IntToDoubleFunction, LongFunction, LongToIntFunction, LongToDoubleFunction, DoubleFunction, ToIntFunction, ToLongFunction, ToDoubleFunction

  • Supplier

方法: T get()
函数描述: () -> T
作用: 无参数传入,返回一个结果
特征化原始类型: BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier

更多

位移运算与运算的基本作用

最近看了很多底层代码,大量使用到了基础的位移,与运算等,做一个总结。

位移与运算基础知识

  1. 数字在计算机中是以 补码 的形式保存的;正数的原码,补码,反码相同;负数的补码是原码取反加 1 得到的

  2. 位移操作涉及到类型转换

假设有 x << n

  • x 是 byte short char int long 基本类型, n 只能是 int 类型

  • 若 x 是 byte short char 类型,首先将类型转化为 int 然后才进行位移操作

  • 若 x 是 byte short char int 类型,那么 n 会被重新赋值,计算方法是 n % 32,可以理解为超过如果 n 超过 32 进行取模

    取 n 的补码的低 5 位, 然后转换为十进制的 int 值,相当于对 n 取 32 模: n = n % 32

    为什么是 5,int 占用 32 位,刚好是 2 的 5 次方

  • 若 x 是 long 类型,取 n 的补码的低 6 位, 计算 n 的方法是 n % 64

  • double float 类型不能进行移位运算

  1. 左移运算 <<

按照二进制方式将所有的数字向左移动对应的位数,高位舍弃,低位补 0 ;左移有可能导致溢出。

数学意义:在没有溢出的情况下,对于 正数 和 负数, 左移一位相当于乘以 2 的 1 次方,移动 n 位相当于乘以 2 的 n 次方。

  1. 有符号右移运算 >>
    按照二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位的空位补符号位,即正数补 0 ,负数补 1

数学意义:右移一位相当于除以 2 ,右移 n 位相当于除以 2 的 n 次方, 取商,不要余数。

  1. 无符号右移运算 >>>
    按照二进制方式把所有的数字向右移动对应位数,低位舍弃,高位空位补 0

更多

java 基础 ----基本数据结构

基本数据类型

  • 字符型(char)

java 采用 unicode 编码, 使用 2 个字节表示一个字符,所以java中的一个字符是 2 个字节
c 语言使用的是 ASCII 编码,一个 char 占用 1 个字节。

由于是无符号的,且 2 个字节 32 位长度,那么其范围是 0 到 65535 。

  • 布尔类型: boolean

  • 数值类型: 有符号数值类型,最高位表示符号位
    byte : 1 字节
    short : 2 字节
    int : 4 字节
    long : 8 字节
    float : 4 字节
    double : 8 字节

更多

编辑器之 tmux

install

mac 上安装

1
brew install tmux

需要使用的时候只需要在命令行输入 tmux
tmux 所有的操作都带了一个 prefix , 这也是 tmux 用起来比较麻烦的地方. 默认的 prefix 是 ctrl + b

session

直接在终端查看 session 相关信息

1
2
3
4
tmux ls 列出会话
tmux attach -t session 进入某个会话
tmux -r 连接上个断开的session
tmux new -s session -d 在后台建立会话

进入 tmux 后查看 session 相关信息

1
2
3
ctrl+b s 查看/切换session
ctrl+b d 离开(detach)session
ctrl+b $ 重命名当前session

更多

JAVA ClassLoader

java 类加载器概述

要使用一个类必须要先将这个类加载到内存中, JVM 将编译后的字节码文件, 即 .class 文件加载到内存中, 并生成一个 java.lang.Class 对象.

字节码文件通常有一下来源:

  • 本地磁盘文件系统 class 文件
  • JAR 包中加载 class 文件
  • 网络地址加载 class 文件
  • 动态编译一个 java 源文件, 并执行加载

类加载器

java 中的类加载器是通过双亲委派模型来实现的, 有如下特点

  • 类的加载过程采用委托模式实现. 某个特定的类加载器在接到加载类的请求时, 首先将加载任务委托给父类加载器, 依次递归, 如果父类加载器可以完成类加载任务, 就成功返回; 只有父类加载器无法完成此加载任务时, 才自己去加载.

  • JVM 预定义了三种类加载器

    • 根类加载器(Bootstrap ClassLoader). 由C++实现, 负责将<Java_Runtime_Home>/lib下面的类库加载到内存中, 如 rt.jar
    • 扩展类加载器(Extension ClassLoader). 负责将 <Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir指定位置中的类库加载到内存中. 开发者可以直接使用标准扩展类加载器.
    • 系统类加载器(System ClassLoader). 负责将系统类路径(CLASSPATH)中指定的类库加载到内存中. 开发者可以直接使用系统类加载器。

Nginx 复习

WHY

对自己学习 nginx 的一个总结, 能熟练使用和配置 nginx , 熟悉相关知识和原理.

安装

  • 基本安装和配置文件位置

我这里使用的是 openresty, 我使用的是 ubuntu 安装非常简单, 具体请参考 openresty官网

执行 ./configure 之后可以看到

1
2
3
4
5
6
7
8
9
10
11
12
13
nginx path prefix: "/usr/local/openresty/nginx"
nginx binary file: "/usr/local/openresty/nginx/sbin/nginx"
nginx modules path: "/usr/local/openresty/nginx/modules"
nginx configuration prefix: "/usr/local/openresty/nginx/conf"
nginx configuration file: "/usr/local/openresty/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/openresty/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/openresty/nginx/logs/error.log"
nginx http access log file: "/usr/local/openresty/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

执行 make && make install 安装, 安装完成最后一行有如下提示, 我们可以直接执行 openresty 命令.

1
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/bin/openresty
  • 设置环境变量

为了后面启动 OpenResty 的命令简单一些, 不用在 OpenResty 的安装目录下进行启动, 修改环境变量添加一下内容

1
2
3
sudo vim /etc/profile
export PATH=/usr/local/openresty/nginx/sbin:$PATH
source /etc/profile
  • 非 root 用户启动

我这里使用自己创建的 admin 账户启动 nginx 报错

1
2
3
admin@iZ2zecl4i8oy1qsj9vq9ivZ:/usr/local/openresty/bin$ ./openresty
nginx: [alert] could not open error log file: open() "/usr/local/openresty/nginx/logs/error.log" failed (13: Permission denied)
2016/11/10 15:08:48 [emerg] 9765#0: mkdir() "/usr/local/openresty/nginx/client_body_temp" failed (13: Permission denied)

为了方便普通用户执行一些特权命令, SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份 需要设置下

1
sudo chmod u+s nginx

nginx 命令

启动

1
nginx

平滑启动

1
2
nginx s- reload
kill -HUP `cat /usr/local/openresty/nginx/logs/nginx.pid`

检查 nginx.conf 配置文件是否正确

1
2
nginx -t
nginx -t /usr/local/openresty/nginx/conf

停止 nginx

1
nginx -s stop

正向代理和反向代理

一般来说大家通常说的代理指的是正向代理(forward proxy), 正向代理和反向代理(reverse proxy)的区别如下图:

正向代理和反向代理的区别

参考 正向代理和反向代理

一句话总结:

1
2
正向代理: 代理端 代理的是 客户端
反向代理: 代理端 代理的是 服务端
  • nginx 做为反向代理服务器配置
  • nginx 作为 lb 的配置

nginx 做负载均衡, 后端其中一个 upstream 挂掉 nginx 并不知道, 需要配置, 参考如下链接

http://serverfault.com/questions/480241/nginx-failover-without-load-balancing
http://serverfault.com/questions/140990/nginx-automatic-failover-load-balancing

需要设置:

1
2
proxy_next_upstream
proxy_connect_timeout

具体设置方式参考nginx官方文档
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

  • 打发打发