首页 » Latest Post

zookeeper是一个开源的分布式协同服务系统。zookeeper的设计目标是将那些复杂且容易出错的分布式协同服务封装起来,抽象出一个高效可靠的原语集,并以一系列简单的接口提供给用户使用。比如分布式锁,leader选举

1.zookeeper起源---雅虎研究院一个小组,发现好多内部系统都需要依赖一个系统来进行协同。但是这样的协同系统往往存在单点问题。所以雅虎研究院就开发了一个通用的无单点问题的分布式协同服务系统,这就是zookeeper。zookeeper被著名开源项目使用:

  • hadoop ,使用zookeeper做 name node 的高可用
  • hbase ,保证集群中只有一个master,保存集群中的region server 列表,保存hbase:meta表的位置
  • kafka:集群成员管理,controller节点选举
  1. zookeeper 的应用场景
  • 配置管理
  • DNS服务
  • 组成员管理
  • 各种分布式锁

注意zookeeper适用于存储和协同相关的关键数据,不适合用于大数据量存储

Exception和Error都继承自Throwable类,可以被throw和catch,那么他们有什么区别呢

1.Exception是程序正常运行中,可以预料的意外情况,可能而且应该被catch,进行处理
2.Error是不大可能出现的情况,绝大部分Error会导致JVM处于非正常的不可恢复的状态,如OOM,不便于或者也不需要捕获。
3.Exception分为可检查异常和不检查异常。可检查异常是编译器检查的一部分,必须显示的进行捕获处理,如IO异常。不检查异常是运行时异常,可以再运行时用代码判断是否捕获。如空指针,数组超界。常见问题参考--https://blog.csdn.net/bryantlmm/article/details/78118763
4.注意try catch是有性能损耗的,不要用try包括大量的代码,用if else会更高效。对于追求极致性能的底层类库,会使用创建不进行栈快照的Exception。
5.Reactive 编程时,不能简单的抛异常,异常处理也要非常小心,很容易导致其他问题

说起java平台,最多的是跨平台,一次编译,到处运行。java代码用javac编译成bytecode 的class文件,然后运行时,解释器转换成最终的机器码。JIT会把热点代码编译执行,而不是解释执行。

1.类加载器,Bootstrap,Application,Extension class loader,参考周志明《深入理解java虚拟机》。经过加载,验证,链接,初始化。
2.常见的垃圾收集器,SerialGC,Parallel GC,CMS,G1
3.java分为编译期和运行时。

  • 编译生成的.class文件是平台无关的,会屏蔽具体的硬件细节和操作系统细节,这是“一次编译,到处运行”的基础
  • 运行时,通过类加载器Class Loader加载字节码(.class)文件。可以解释加载也可以编译加载。jdk 8 默认的是混合模式,即java运行指令-Xmixed,但是Client模式和Server模式有明显的区别
  • client模式以启动快速为目的,启动时 会进行1500次(上限)调用来进行编译。这里的JIT是C1
  • Server模式以长时间运行为目的,启动时 会进行上万次调用,来确定搞笑的编译,这里的JIT是C2,C2默认采用所谓的分层编译TieredComplilation
  • 当然可以再运行时指定-Xcomp,告诉jvm关闭解释器,编译运行,但这种未必是最搞笑的,而且启动会慢很多
  • 也可以指定-Xint,只解释运行
  • 除了编译和解释,还有一种aot模式(oracle jdk 9引入),将某个模块编译成机器代码,可以减少启动预热开销,使用jaotc工具来使用.注意分层编译可以和AOT一起使用,不是非此即彼的。
    jaotc --output libHelloWorld.so  HelloWorld.classs
    java -XX:AOTLibrary=./libHelloWorld.so HelloWorld

powsershell 创建alias

1.首先保证.profile 是存在的

New-Item –Path $Profile –Type File –Force

2.创建函数和别名

function Do-ActualThing {
    # do actual thing
}

Set-Alias MyAlias Do-ActualThing

3.重启powershell