Java基础技术体系
-
Java7,Java8,Java9
- coin/invokedynamic/g1/nio2/fork-join/
- Lambda/interface-static-default/function/stream/Nashorn/time
- Jigsaw/jshell(REPL)/JMH benchmark/进程api/jsonapi/
-
OpenJDK
-
Java内存模型/并发/多线程
-
内存模型
-
计算机系统#缓存一致性
- 每个处理器有自己的高速缓存,他们又共享同一主内存;当多个处理器都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致,那同步到主内存时以谁的缓存数据为准呢
- 在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象
- 指令重排序
-
Java内存模型-主内存与工作内存(每条线程有自己的工作内存)
- 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝
- 线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存的变量
- 不同的线程之间之间也无法直接访问对方工作内存的变量
- 线程间变量的传递均需要通过主内存来完成
- lock/unlock/read/load/use/assign/store/write-每一种操作都是原子的,不可再分的(注意double/long)
-
volatile
- 先行发生原则
- 工作窃取算法(Fork/Join)
- 原子性、可见性、有序性(如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的)
工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。
那么为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程干活,于是它就去其他线程的队列里窃取一个任务来执行。而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。工作窃取算法的优点是充分利用线程进行并行计算,并减少了线程间的竞争,其缺点是在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且消耗了更多的系统资源,比如创建多个线程和多个双端队列。
-
JVM
-
Class/Bytecode/Classloader
- hotswap
- 加载、验证、准备、解析、初始化
-
agent/instrumentation
- agentmain-jvm启动后可以通过代理做一些事情
- Instrumentation#redefineClasses,可以重定义class->而非之前实例替换->动态改变JVM已加载的类(这个很强大)
- 可通过agentmain获得Instrumentation,然后利用Instrumentation去redefineClasses
-
多语言编程
- invokedynamic/java.lang.invoke
架构
-
分布式服务器架构
- 应用和数据服分离/使用缓存/应用服务器集群/数据库读写分离/反向代理-CDN/分布式文件系统-分布式数据库系统/NoSql-搜索引擎/业务拆分/分布式服务/
-
分层
- 横向:应用层、服务层、数据层
- 纵向:将不同的功能和服务分割,模块化
-
分布式
- 将不同的模块部署在不同的机器上,通过远程调用协同工作
-
集群
- 将多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务
-
缓存
- 异步
- 冗余
- 自动化
-
架构要素
-
性能、可用性、伸缩性、扩展性、安全
- 响应时间、并发数、吞吐量、SystemLoad、对象数与线程数、内存使用、cpu使用、io、性能测试、负载测试、压力测试、稳定性测试
-
mmo游戏服务器架构
- 分线/分场景
- 动态的增加或者减少gs
- 网关可动态的增加或者减少
-
无缝地图
- NODE专注场景,OBJ专注玩家对象,GATE专注网络
- 动态负载均衡
- 很多无缝动态负载均衡的服务端宣称自己支持无限的人数,但不意味着 MMORPG游戏的人数上限真的可以无限扩充,因为这样的体系会受制于网络带宽和客户端性能。带宽决定了同一个区域最大广播上限,而客户端性能决定了同一个屏幕到底可以绘制多少个角色
模式
-
架构模式
- 背景-问题-解决方案
- Layers模式-分层-网络协议
- Pipes and Filters-处理数据流
- Blackboard-一系列独立的程序携手合作,致力于处理同一个数据结构
- Microkernel
- Broker
- MVC/PAC
- Reflection
- Whole-Part/Master-Slave/Proxy/Command Processor/View Handler/Forwarder-Receiver/Client-Dispatcher-Server/publisher-subscriber/
- CounterPointer
- 抽象、封装、信息隐藏、模块化、分离关注点、耦合与内聚、充分-完整-简单、策略与实现分离、接口与实现分离、单个引用点、分而治之
- 并发:Reactor/Proactor/Acceptor-Connector/Aysnchronous Completion Token/Active Object/Thread-Speific Storage
- 资源管理:Loopup/Lazy Acquisition/Caching/Pooling/Resouce Lifecycle Manager/
-
设计模式
-
面向对象设计原则
网络编程/并发编程
- bio/nio/nio2
- netty
- select/poll/epoll/kqueue/iocp/reactor/proactor
- java.util.concurrent
调优
Mysql/NoSql
- redis
- mongodb
- mongodb是一个真正的数据库而,redis更接近于memcache
- mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据
- nosql也分类型的;redis、memcached这样的KeyValue天然适合做缓存,相互替代比较容易,优缺点彼此争论不一;mongo属于文档型,介于nosql与关系型数据库之间,相比其他nosql,具有强大的查询语句,在一定程度上可以用来存储海量、需要多条件查询同时又不需要关系型数据库特性的“文档”,反正我用他来存日志
Linux
- shell
- vim
- grep
- 分析日志文件/启动-关闭脚本
- top、ps、netstat
开源框架
- Netty/Disruptor/Vert.x/Kafka/RocketMq/Nginx
Node.js/Go
- Go-Goroutine
- Node.js-事件驱动、非阻塞式I/O
前沿技术
posted on 2016-11-04 11:58
landon 阅读(2959)
评论(0) 编辑 收藏 所属分类:
Program 、
GameServer 、
ServerFramework