- 浏览: 365936 次
- 性别:
- 来自: 广州
最新评论
-
dwlxjz:
其实感觉楼主分享的这个只是简单的实现,从逻辑上来说的一个办法。 ...
网页游戏服务端-人物移动广播优化 -
ndsafhhlk:
CountDownLatch的例子为啥用两个CountDown ...
java多线程学习-java.util.concurrent详解(一) Latch/Barrier -
尘墨染:
每隔一段时间触发异常的那个不对啊,只触发了一次。
java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor -
sgq0085:
import static java.nio.file.Sta ...
JDK7新特性<六> 监听文件系统的更改 -
solemichael:
遗憾的是只能监控一层目录,下层不能监控了,哎。
JDK7新特性<六> 监听文件系统的更改
文章列表
最近开始优化页游服务端的性能,一些心得总结一下。现在的服务器硬件越来越好,几十G内存,十几个CPU。当硬件不是瓶颈的时候,如果让程序发挥最大效用就成了我们需要考虑的问题。就游戏服务器来说,得满足几个要求,高负载,低延时。特别是在开服当天,大量用户会涌进来,可能给服务器造成压力。使用Java作为服务器语言,除了程序本身的性能外,JVM的配置也直接影响到系统性能。
参数调优
入门级别的配置一般是:java -server -Xmx5000m Xms5000m
服务器端的jvm运行程序记得都最好加上 -server 很多默认参数都会根据这个运行模式来优化。这里设置了最大内存 ...
netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。
1.Buff
ChannelBuffer变成了ByteBuff。还引 ...
让java变成脚本语言
- 博客分类:
- 服务端
今天在弄游戏的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程序平时运行正常,隔一段时间“假死”,很可能与它有关。这个收集器看起来问题多多,但是简单高效,适用于实时性不高的场合,如客户端软件。对于服务端程序, ...
jvm学习笔记(4)垃圾回收算法分析
- 博客分类:
- jvm
简述:
垃圾回收算法有很多种,每种有各自的适用场合,各有千秋,如何在不同的场合搭配使用是我们要考虑的问题
引用计数
这是最简单最原始的算法。原理很简单,对象生成后,有一个相关联的计数器,当有一个地方引 ...
jvm学习笔记(3)内存管理
- 博客分类:
- jvm
整体架构
当一个java类文件被jvm装载进来,就需要创建对象,涉及到内存管理了。先来看看jvm内部的体系结构
pc寄存器
对汇编有一定了解的同学都明白这个概念。我们可以简单把它看做是当前线程所执行的字节码的行号。有 ...
jvm学习笔记(2)多线程的相关原理
- 博客分类:
- jvm
简介
本文是尝试从虚拟机的角度来分析java线程的一些本质
线程模型
java的线程模型可以通过下图来说明:一个对象都有一个相关的锁,每次只能由获得它的一个线程来操作。获得它的线程可以wait,放弃锁,进入等待区域, ...