`
janeky
  • 浏览: 366248 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
文章列表
最近开始优化页游服务端的性能,一些心得总结一下。现在的服务器硬件越来越好,几十G内存,十几个CPU。当硬件不是瓶颈的时候,如果让程序发挥最大效用就成了我们需要考虑的问题。就游戏服务器来说,得满足几个要求,高负载,低延时。特别是在开服当天,大量用户会涌进来,可能给服务器造成压力。使用Java作为服务器语言,除了程序本身的性能外,JVM的配置也直接影响到系统性能。   参数调优   入门级别的配置一般是:java -server -Xmx5000m Xms5000m 服务器端的jvm运行程序记得都最好加上 -server 很多默认参数都会根据这个运行模式来优化。这里设置了最大内存 ...
netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。   1.Buff ChannelBuffer变成了ByteBuff。还引 ...
今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改变某些参数的值。   突然,想到一个问题,就是在线上运行服务器时,假如我要改变某个参数的值,有   没有办法呢?通过查找资料后,发现jdk竟然也提供了动态编译的工具。因此,我   们可以让java变成一个脚本语言。我发送一个类的代码到服务端,动态编译后,利   用反射来执行。代码很简单,我从网上找了一个例子简单改装一下 import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; import jav ...
这段时间在处理服务端人物移动广播遇到了问题,记录一下。 1.问题 现在的页游都朝着客户端的方向靠齐了,大地图,千人同屏。因此,也给页游的服务端开发带来了不少的挑战。假设一个场景地图是8000*8000大小,同时有1000人在。1秒钟内,每个玩家移动一次。按照最原始的做法,就是给同一个场景的用户广播消息。简单计算一下广播量:1000*1000=1000000的广播量,有点恐怖。 2.方案 优化的目标肯定是减少广播量了。我们看到,场景特别大,这对于美术同事来说不是什么好事了,对于服务端来说,未尝是坏事。假设最理想的状态下,用户能够遍布各个角落。那么,我们只想向能看到移动目标的用户 ...
Redis的应用已经如火如荼了,你要是搞服务端的,说你还没用过,一些人又要从心里鄙视你n遍了。刚好在项目中实践了,有一点点心得,在这里跟大家交流一下。由于时间的关系,Redis的源码还未读完,今天先把客户端jedis的源码研究一下吧。看完代码后其实你可以自己实现一个了。代码一定要剖析到每一行,吸取精华才算凑效。jedis,在各种客户端中算比较优秀的。代码风格也很好,读来如沐春风,心旷神怡啊:) 1.Redis的通信协议 Redis采用自定义的二进制通信协议。有一个基本规范发送命令规范:   <参数个数>\r\n $<参数1字节数>\r\n <参数1>\r ...
简述 ConcurrentLinkedHashMap 是google团队提供的一个容器。它有什么用呢?其实它本身是对   ConcurrentHashMap的封装,可以用来实现一个基于LRU策略的缓存。详细介绍可以参见    http://code.google.com/p/concurrentlinkedhashmap   使用范例 public static void main(String[] args) { ConcurrentLinkedHashMap<Integer, Integer> map = new ConcurrentLin ...
      在学一些函数式语言的时候,经常遇到尾递归。总结一下   什么是尾递归       递归是指一个函数直接或者间接调用其本身。递归会造成什么问题呢,每次函数调用,肯定需要一个方法栈来保存相关信息的。如果递归深度太深的话,必然导致栈溢出。举一个例子,斐波那契函数吧     public int fib(int n) { if(n<2){ return n; } return fib(n-1)+fib(n-2); }     上面代码就是传统的递归.如果n太大,就可能导致栈溢出了   用尾递归来实现:   public int fib ...
简述   Actor模型在并发编程中是比较常见的一种模型。很多开发语言都提供了原生的Actor模型。例如erlang,scala等     Actor,可以看作是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个Actor收到其他Actor的信息后,它可以根据需要作出各种相应。消息的类型可以是任意的,消息的内容也可以是任意的。这点有点像webservice了。只提供接口服务,你不必了解我是如何实现的。   一个Actor如何处理多个Actor的请求呢?它先建立一个消息队列,每次收到消息后,就放入队列,而它每次也从队列中取出消息体来处理。通常我们都使 ...
注解以前用的少,最近项目中发现偶尔一用,可以使得代码更加简洁   自定义一个注解     @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface TestAnnotation { public int value() default 1; } 对这些一一解释一下:   1.Documented.java  表示这一类型的注释将通过 javadoc 和类似的默认工具进行文档化   2.Target ...
  为什么要深入学习jvm? 从事java开发有几年的时间了,以前对jvm了解不够深入。项目中遇到一些问题,深刻体会到不是代码层级可以解决的。很多问题难以解决之处在于你发现不了问题源头。例如服务器的tps上不去,瓶颈在哪里?程序内存溢出,什么原因造成的?如何监控程序运行的状况?为此,特意抽出时间,系统学习了jvm的相关原理,希望更深刻得了解java运行的机制。总之,学习jvm,能让你站更高处看问题。 主要看了几本书 1.《深入java虚拟机》是jvm领域的经典图书,已经绝版了,里面的内容很详细,深入到每条指令的执行过程2.《深入理解java虚拟机》国内最近出版的一本书。写得非常好,将jv ...
简述 我们要运行java程序,必须保证jvm已经加载类所需的类。这个过程是怎样的呢 类的生命周期 包括了装载,连接(包括验证、准备和解析)和初始化 加载 将二进制字节码读入jvm。包括以下阶段:1.通过类的全限定名获得定义此类的二进制数据流2.将字节流转化为方法区的内部数据结构3.在jvm堆中生成java.lang
简述: 上一篇系统学习了各种垃圾算法。现在就看看jvm(HopSpot)提供了那些垃圾收集器,怎样搭配使用。先回忆了,然后思考以下问题:新生代和老年代分别用什么算法合适? Serial收集器 略懂英文的同学大概明白这个词的意思,串行,连续的。没错,这个收集器很简单,当要进行gc时,就暂停所有线程。用复制算法执行完,继续所有线程。又用餐巾纸的例子来说明,清洁大妈高喊一声“stop”,然后所有人静止不动,等收集完,大伙又继续吃饭。有些java程序平时运行正常,隔一段时间“假死”,很可能与它有关。这个收集器看起来问题多多,但是简单高效,适用于实时性不高的场合,如客户端软件。对于服务端程序, ...
简述: 垃圾回收算法有很多种,每种有各自的适用场合,各有千秋,如何在不同的场合搭配使用是我们要考虑的问题 引用计数 这是最简单最原始的算法。原理很简单,对象生成后,有一个相关联的计数器,当有一个地方引 ...
整体架构 当一个java类文件被jvm装载进来,就需要创建对象,涉及到内存管理了。先来看看jvm内部的体系结构 pc寄存器 对汇编有一定了解的同学都明白这个概念。我们可以简单把它看做是当前线程所执行的字节码的行号。有 ...
简介 本文是尝试从虚拟机的角度来分析java线程的一些本质 线程模型 java的线程模型可以通过下图来说明:一个对象都有一个相关的锁,每次只能由获得它的一个线程来操作。获得它的线程可以wait,放弃锁,进入等待区域, ...
Global site tag (gtag.js) - Google Analytics