item2+oh-my-zsh配置

安装iterm2后,使用以下命令安装oh my zsh

1
curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

待确定是否必要

.bash_profile文件添加以下内容

1
2
3
4
5
6
#enables colorin the terminal bash shell export
export CLICOLOR=1
#sets up thecolor scheme for list export
export LSCOLORS=gxfxcxdxbxegedabagacad
#sets up theprompt color (currently a green similar to linux terminal)
export TERM='xterm-256color'

JVM内存模型

图解

说明

生命周期都与线程相同

名称 特征 作用 配置参数 异常
程序计数器 占用内存小,线程私有 大致为字节码信号指示器
虚拟机栈 线程私有,使用连续的内存空间 Java方法执行的内存模型,
存储局部变量表、操作栈、
动态链接、方法出口等信息
-Xss StackOverflowError
OutOfMemoryError
线程共享,可以不使用连续的内存地址 保存对象实例,所有对象实例
(包括数组)都要在堆上分配
-Xms
-Xsx
-Xmn
OutOfMemoryError
方法区 线程共享,可以不使用连续的内存地址 存储已被虚拟机加载的
类信息、常量、静态变量、
编译器即时编译后的代码等数据
-XX:PermSize:16M
-XX:MaxPermSize:64M
OutOfMemoryError
本地方法栈 线程私有,使用连续的内存空间 为虚拟机使用到的Native方法服务 StackOverflowError
OutOfMemoryError

类对象(加载的最终产品)是存放在堆区的,类的元数据存在方法区(类的方法代码,变量名,方法名,访问权限,返回值等等)。

hashmap原理

实现原理

拉链法:数组+链表
初始化根据初始容量创建对应数量的数组,每个元素储存的是一个链表的头结点。

数组中index的算法

使用了高位算法和取模算法。

int表值范围从-2147483648到2147483648。前后加起来大概40亿的映射空间。HashMap扩容之前的数组初始大小才16。

所以散列值不能直接拿来用,用之前还要先做对数组的长度取模运算,得到的余数才能用来访问数组下标。

1
(tab.length - 1) & hash // 按位取并,作用上相当于取模mod或者取余%

但是即使这样就算我的散列值分布再松散,要是只取最后几位的话,碰撞也会很严重。

更要命的是如果散列本身做得不好,分布上成等差数列的漏洞,恰好使最后几个低位呈现规律性重复。这个使用就需要用到下面的一个函数”扰动函数”。

Read More

jvm原理

垃圾收集

分代收集:根据对象的生命周期分为新生代和老年代。

  • 新生代 -> 由于对象生命周期短,使用复制算法。新生代中分为Eden区和Survivor区,每次优先使用Eden区,如果Eden区满,将Eden区中存活的对象复制到Survivor区;如果Survivor区满,将Survivor区中存活的对象复制到老年代。
  • 老年代 -> 由于对象存活率高,使用标记-整理算法。扫描出存活的对象,回收未标记的对象,回收之后将存活的对象移动到同一端(不产生内存碎片)。

类的加载过程

7个过程。

  • 加载:内存中生成java.lang.Class对象,加载到方法区,作为该类的访问入口。
  • 验证:确保加载类的符合jvm规范,不会危害到jvm虚拟机。
  • 准备:为静态变量分配内存并分配默认值,在方法区中进行分配。(static int i = 9,这时i的值为0,在初始化时值才为9)
  • 解析:符号引用替换为直接引用。(String str=”s”,转化为str的地址指向”s”的地址)
  • 初始化:执行构造函数,静态和非静态代码块。
  • 使用:对象的属性或方法等调用操作。
  • 卸载: jvm通过确定对象没有引用后进行gc操作。
    简述:虚拟机把类从Class文件加载到内存中,并对数据进行校验,解析和初始化,形成虚拟机直接使用的java类型。

Read More

服务器端推送笔记

Server-Sent Event (SSE)

运行过程

浏览器通过HTTP向服务器发送请求,服务器拿到最新的数据,立即返回给客户端,客户端等待3秒后再次发出下一个请求。

执行过程

每3秒都会按照以下顺序执行onopen -> onmessage -> onerror,每次请求都会执行onerror方法,如果是正常关闭,onerror方法的回调参数readyState=3。

Headers设置

ContentType必须设置为text/event-stream

封包内容

Server端的程序推送给Client端的封包是由以下四部分构成,其格式为字段名称:字段内容,字段名称:字段内容\n\n

  1. event: 事件或识别名称,默认值为message
  2. data: 要传送给Client端的数据内容
  3. id: Server端推送到Client端时的事件ID
  4. retry: 用来定义两次要求之间的间隔时间,以毫秒为单位

WebSocket

描述

  • WebSocket可以看成是一种类似TCP/IP的socket技术;
  • 此socket在Web应用中实现,浏览器和服务器只需要做一个握手的动作[借用http协议],然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
  • WebSocket为应用层协议,其定义在TCP/IP协议栈之上。
  • WebSocket连接服务器的URI以”ws”[默认TCP端口为80]或者”wss”[默认TCP端口为443]开头。

运行过程

客户端通知WebSockets服务器一个事件,服务器将立即通知消息;当任何新的未读消息来的时候,服务器都将立即返回数据给客户端。

执行过程

连接建立成功时,执行onOpen方法,收到客户端请求时执行onMessage方法,发生错误时执行onError方法,连接关闭时,执行onClose方法

主要异同点

SSE:单向 | WebSocket:双向
SSE:轮询 | WebSocket:长连接

优缺点

SSE

优点:服务器端开发很简单,服务器端支持已经统一。
缺点:浏览器需要不断的向服务器发出请求,然而HTTP request的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。
实时性要求不高的情况下,推荐使用。

webSocket

优点:WebSocket协议中,为我们实现即时服务带来了两大好处:互相沟通的Header是很小的-大概只有2Bytes;服务器不再被动的接收到浏览器的request之后才返回数据,而是在有新数据时就主动推送给浏览器。
缺点:服务器长期维护长连接需要一定的成本,各个浏览器支持程度不一。
实时性要求高大情况下,推荐使用。

示例代码

链接

spring-boot构成

自动配置(auto-configuration)

一项简化配置的功能,比如在classpath中发现有spring security的jar包,则自动创建相关的bean等

starters(简化依赖)

这个比较关键,方便spring去集成各类组件,比如redis、mongodb等等。

  • core(securityaop)
  • web(webwebsocketwsvaadinrestmobile)
  • template(freemarkervelocitygroovy templatesthymeleaf)
  • data(jdbcjpamongodbredisgemfiresolrelasticsearch)
  • database(h2hsqldbmysqlpostgresql)
  • social(facebooklinkedintwitter)
  • io(batchintegrationjmsamqp)
  • ops(actuatorremote shell)
  • CLI(command-line interface),支持groovy开发

Actuator(对应用系统本身的自省功能)

这个有点devops的味道,使得应用程序本身可以做到自省,比如查看系统运行了多少线程,gc的情况,运行的基本参数等等

  • /beans: 这个endpoint列出所有由Spring Boot创建的bean
  • /mappings: 这个endpoint显示当前应用支持的URL映射
  • /info: 这个endpoint显示应用程序的基本描述
  • /health: 这个endpoint提供应用程序的健康状态
  • /env: 这个endpoint提供应用程序的环境变量

spring-boot配置属性字典-others

aop

  • spring.aop.auto: 是否支持@EnableAspectJAutoProxy,默认为: true
  • spring.aop.proxy-target-class: true为使用CGLIB代理,false为JDK代理,默认为false

application

  • spring.application.admin.enabled: 是否启用admin特性,默认为: false
  • spring.application.admin.jmx-name: 指定admin MBean的名称,默认为: org.springframework.boot:type=Admin,name=SpringApplication

logging

  • logging.file: 指定日志输出位置,比如:log/spring.log
  • logging.level.[package]:指定package的日志输出级别(ERROR > WARN > INFO > DEBUG)

Read More

spring-boot配置属性字典-security

security

  • security.sessions: 指定Session的创建策略(always, never, if_required, stateless)
  • security.user.name: 指定默认的用户名,默认为user
  • security.user.password: 默认的用户密码
  • security.user.role: 默认用户的授权角色
  • security.basic.authorize-mode: 要使用权限控制模式.
  • security.basic.enabled: 是否开启基本的鉴权,默认为true
  • security.basic.path: 需要鉴权的path,多个的话以逗号分隔,默认为[/**]
  • security.basic.realm: HTTP basic realm 的名字,默认为Spring

Read More

spring-boot配置属性字典-mq

activemq

  • spring.activemq.broker-url: 指定ActiveMQ broker的URL,默认自动生成
  • spring.activemq.in-memory: 是否是内存模式,默认为true
  • spring.activemq.password: 指定broker的密码
  • spring.activemq.pooled: 是否创建PooledConnectionFactory,而非ConnectionFactory,默认false
  • spring.activemq.user: 指定broker的用户

Read More