- 博客(41)
- 收藏
- 关注
游戏服务器JVM性能调优
最近开始优化页游服务端的性能,一些心得总结一下。现在的服务器硬件越来越好,几十G内存,十几个CPU。当硬件不是瓶颈的时候,如果让程序发挥最大效用就成了我们需要考虑的问题。就游戏服务器来说,得满足几个要求,高负载,低延时。特别是在开服当天,大量用户会涌进来,可能给服务器造成压力。使用Java作为服务器语言,除了程序本身的性能外,JVM的配置也直接影响到系统性能。 参数调优 入门...
2013-07-06 15:15:55
191
Netty4更新详解
netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。 1.BuffChannelBuffer变成了ByteBuff。还引入了Buff对象池Unpooled来管理回收不用的buff,避免gc的频率。在netty3中,buff都是固定大小或者d...
2013-04-09 00:36:15
178
让java变成脚本语言
今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改变某些参数的值。 突然,想到一个问题,就是在线上运行服务器时,假如我要改变某个参数的值,有 没有办法呢?通过查找资料后,发现jdk竟然也提供了动态编译的工具。因此,我 们可以让java变成一个脚本语言。我发送一个类的代码到服务端,动态编译后,利 用反射来执行。代码很简单,我从网上找了一个例子简单改装一下...
2012-08-14 22:51:56
487
网页游戏服务端-人物移动广播优化
这段时间在处理服务端人物移动广播遇到了问题,记录一下。1.问题现在的页游都朝着客户端的方向靠齐了,大地图,千人同屏。因此,也给页游的服务端开发带来了不少的挑战。假设一个场景地图是8000*8000大小,同时有1000人在。1秒钟内,每个玩家移动一次。按照最原始的做法,就是给同一个场景的用户广播消息。简单计算一下广播量:1000*1000=1000000的广播量,有点恐怖。2...
2012-07-31 22:50:15
286
Redis客户端-Jedis源代码探索
Redis的应用已经如火如荼了,你要是搞服务端的,说你还没用过,一些人又要从心里鄙视你n遍了。刚好在项目中实践了,有一点点心得,在这里跟大家交流一下。由于时间的关系,Redis的源码还未读完,今天先把客户端jedis的源码研究一下吧。看完代码后其实你可以自己实现一个了。代码一定要剖析到每一行,吸取精华才算凑效。jedis,在各种客户端中算比较优秀的。代码风格也很好,读来如沐春风,心旷神怡啊:)...
2012-05-23 23:20:52
125
google的ConcurrentLinkedHashmap源代码解析
简述ConcurrentLinkedHashMap 是google团队提供的一个容器。它有什么用呢?其实它本身是对 ConcurrentHashMap的封装,可以用来实现一个基于LRU策略的缓存。详细介绍可以参见 http://code.google.com/p/concurrentlinkedhashmap 使用范例public static v...
2012-05-18 00:06:14
475
浅析尾递归
在学一些函数式语言的时候,经常遇到尾递归。总结一下 什么是尾递归 递归是指一个函数直接或者间接调用其本身。递归会造成什么问题呢,每次函数调用,肯定需要一个方法栈来保存相关信息的。如果递归深度太深的话,必然导致栈溢出。举一个例子,斐波那契函数吧 public int fib(int n){ if(n<2){ return n;...
2012-05-16 23:03:11
120
Actor模型浅谈
简述 Actor模型在并发编程中是比较常见的一种模型。很多开发语言都提供了原生的Actor模型。例如erlang,scala等 Actor,可以看作是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个Actor收到其他Actor的信息后,它可以根据需要作出各种相应。消息的类型可以是任意的,消息的内容也可以是任意的。这点有点像webservic...
2012-04-29 10:56:00
382
注解 java.lang.annotation.* 详解
注解以前用的少,最近项目中发现偶尔一用,可以使得代码更加简洁 自定义一个注解 @Documented@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface TestAnnotation { public int value() def...
2012-03-05 23:25:37
285
原创 jvm学习笔记总结
为什么要深入学习jvm?从事java开发有几年的时间了,以前对jvm了解不够深入。项目中遇到一些问题,深刻体会到不是代码层级可以解决的。很多问题难以解决之处在于你发现不了问题源头。例如服务器的tps上不去,瓶颈在哪里?程序内存溢出,什么原因造成的?如何监控程序运行的状况?为此,特意抽出时间,系统学习了jvm的相关原理,希望更深刻得了解java运行的机制。总之,学习jvm,能让你站更高处看...
2011-11-22 00:06:38
115
jvm学习笔记(6)类加载机制
简述我们要运行java程序,必须保证jvm已经加载类所需的类。这个过程是怎样的呢类的生命周期包括了装载,连接(包括验证、准备和解析)和初始化加载将二进制字节码读入jvm。包括以下阶段:1.通过类的全限定名获得定义此类的二进制数据流2.将字节流转化为方法区的内部数据结构3.在jvm堆中生成java.lang.Class实例,成为java程序与内部数据结构之间的接口怎么生...
2011-11-22 00:05:07
95
原创 jvm学习笔记(5)垃圾收集器介绍
简述:上一篇系统学习了各种垃圾算法。现在就看看jvm(HopSpot)提供了那些垃圾收集器,怎样搭配使用。先回忆了,然后思考以下问题:新生代和老年代分别用什么算法合适?Serial收集器略懂英文的同学大概明白这个词的意思,串行,连续的。没错,这个收集器很简单,当要进行gc时,就暂停所有线程。用复制算法执行完,继续所有线程。又用餐巾纸的例子来说明,清洁大妈高喊一声“stop”,然后...
2011-11-22 00:03:06
112
jvm学习笔记(4)垃圾回收算法分析
简述:垃圾回收算法有很多种,每种有各自的适用场合,各有千秋,如何在不同的场合搭配使用是我们要考虑的问题引用计数这是最简单最原始的算法。原理很简单,对象生成后,有一个相关联的计数器,当有一个地方引用时,计数器加1;当引用失效时,计数器减1。jvm定期扫描对象时,发现计数器为0的对象就可以清除。这个算法的特点是实现简单,速度快。不足之处在于:每次分配和指针操作都需要额外的操作来更新相...
2011-11-22 00:00:01
100
原创 jvm学习笔记(3)内存管理
整体架构当一个java类文件被jvm装载进来,就需要创建对象,涉及到内存管理了。先来看看jvm内部的体系结构pc寄存器对汇编有一定了解的同学都明白这个概念。我们可以简单把它看做是当前线程所执行的字节码的行号。有什么用呢。当执行完一条指令的时候,需要跳转到下一条指令,就得靠它了java虚拟机栈是线程私有的,跟线程的生命周期相同。描述的是一个java方法执行的内存模型:当一个...
2011-11-21 23:57:03
88
原创 jvm学习笔记(2)多线程的相关原理
简介本文是尝试从虚拟机的角度来分析java线程的一些本质线程模型java的线程模型可以通过下图来说明:一个对象都有一个相关的锁,每次只能由获得它的一个线程来操作。获得它的线程可以wait,放弃锁,进入等待区域,待被唤醒notify后,它会重新查看锁的状态,参与锁的竞争虚拟机实现查看class文件的汇编代码,可以看到,进入同步区域和退出同步区域分别由两条指令 monitor...
2011-11-21 23:55:37
102
原创 jvm学习笔记(1)class文件
简述class文件是什么?稍微接触过java的同学都会说:就是java源文件编译后的.class文件。这句话虽然对,但是不够准确。其他语言,例如scala,jruby等,都可以编译出class文件。class文件是能被jvm识别和运行的一种文件格式。它是八位的二进制流文件。今天就跟大家一起学习class文件的格式整体结构用ultraedit等工具打开class文件,看到的都是二进...
2011-11-21 23:46:45
112
JDK7新特性<八>异步io/AIO
概述JDK7引入了AsynchronousI/O。I/O编程中,常用到两种模式:Reactor 和 Proactor。Reactor就是Java的NIO。当有事件触发时,我们得到通知,进行相应的处理。Proactor就是我们今天要讲的 AIO了。AIO进行I/O操作,都是异步处理,当事件完成时,我们会得到通知。JDK7的 AIO包括网络和文件操作。两者大同小异,本文通过一个完整的...
2011-06-09 00:12:05
198
JDK7新特性<七> 遍历文件树
有时需要递归遍历一个文件树,比如查找一个文件夹内符合条件的文件,查找某一天创建的文件……。jdk7 nio包提供一个新的接口 FileVisitor。它提供了遍历文件树的各种操作。 preVisitDirectory - 一个路径被访问时调用 PostVisitDirectory - 一个路径的所有节点被访问后调用。如果有错误发生,exception会传递给这个方法...
2011-05-20 00:22:58
164
JDK7新特性<六> 监听文件系统的更改
我们用IDE(例如Eclipse)编程,外部更改了代码文件,IDE马上提升“文件有更改”。Jdk7的NIO2.0也提供了这个功能,用于监听文件系统的更改。它采用类似观察者的模式,注册相关的文件更改事件(新建,删除……),当事件发生的,通知相关的监听者。 java.nio.file.*包提供了一个文件更改通知API,叫做Watch Service API. 实现流程如下...
2011-05-19 00:06:29
147
JDK7新特性<五> fork/join 框架
对于框架的原理,可以阅读 Doug Lea 的文章“A Java Fork/Join Framework”:了解 Fork/Join 模式的实现机制和执行性能。 原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个子任务,每个子任务用单独的线程去处理。这里用到了递归的思想。框架的结构图可以参考 图片来源(http://www.ibm.com/develop...
2011-05-18 00:48:25
105
JDK7新特性<四> NIO2.0 文件系统
java.io.File 不够完美吧。Jdk7提供了一套新的文件系统,会让你满意的。先来聊聊java.io.File的七宗罪吧:) 1.很多方法失败时候都没有抛出异常,很难查找原因 2.方法 rename 在不同平台中运行有问题 3.不能真正支持 symbolic links 4.不能读取文件的更详细属性,比如权限,所有者…… 5.访问 文件的 meta...
2011-05-18 00:47:55
94
JDK7新特性<三> JDBC4.1
JDBC4.1更新了两个新特性 1. Connection,ResultSet 和 Statement 都实现了Closeable 接口,所有在 try-with-resources 语句中调用,就可以自动关闭相关资源了 try (Statement stmt = con.createStatement()){ …} 2. RowSet 1.1:引入...
2011-05-18 00:44:30
99
JDK7新特性<二> 语法
JDK7对Java语法有少量更新,重点是在易用性和便捷性的改进。 1.二进制字面量 JDK7开始,终于可以用二进制来表示整数(byte,short,int和long)。使用二进制字面量的好处是,可以是代码更容易被理解。语法非常简单,只要在二进制数值前面加 0b或者0B byte nByte = (byte)0b0001; s...
2011-05-18 00:43:59
103
JDK7新特性<一>概述
JDK7至今仍未正式发布。从官方的 milestone schedule(里程碑)可知,目前已经准备就绪,处于测试准备阶段,感兴趣 的可以从官方下载JDK7开发预览版。笔者根据官方的相关文档,整理了这个系列的文章。 准备 JDK7下载 http://download.java.net/jdk7/API文档 http://do...
2011-05-18 00:43:27
75
如何招收合适的应届开发人员
最近跟业内的朋友交流,都有一个困惑,招不到合适的人。不要说经验丰富的开发者,就连合适的应届生都比较难招。好的应届生都被一流的公司校园招*先筛选走了。剩下的应届生中,要选择合适的,需要进行多方面的考核。今天分享一下招应届开发人员的一点经验,可能过于狭隘,希望大家有不同意见的可以多交流。 谈谈应届生的优势。 招*应届生的成本相对较低。现在招有工作的经验的开发人员,一到两年工作经验...
2011-04-06 21:20:57
93
《Effective Java》读书笔记
我们学习一门语言,包括编程语言,都要经过一些阶段,入门,熟练 精通。每个人在每个阶段耗费的时间不同。如何从一 个入门级别继续提高,除了实践,吸取一些前人经验是必须了。《Effective Java》将一些Java的高级主题一一列举,如 庖丁解牛般。是入门级Java Programmer 继续提高水平不可多得的资料。这里分析我的一些读书笔记吧。 ------------...
2011-04-03 12:17:48
121
《深入浅出面向对象分析与设计》读书笔记
面向对象分析与设计,在软件工程中越来越重要了。可惜很多大学的计算机都没有这门课。大多人读书时候,入门学了 C++等面向对象语言,也只是停留在语言层面,对于面相对象的精髓一知半解。在实际项目中,分析建模也是完全凭感觉, 即使错了,也不明白为什么?这本书是 面向对象分析与设计 入门的捷径。它延续Head First 系列的风格,轻松易懂,在 不知不觉中,你就掌握了原理...
2011-03-16 23:21:06
392
Java NIO 简单入门
为什么用NIO 优点:NIO以块的方式处理数据,NIO是以流(字节)方式处理。NIO将最耗时的IO操作(即填充和提取缓冲区)转移回操作统。 缺点:面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性 补充:JDK1.4以后,java.io.*已经以NIO为基础重新实现了,处理也会很快。 缓冲区Buffer 任何时候访问NIO中的数据,都是...
2011-03-12 13:32:33
78
《Clean Code》读后感
代码维护一直是软件开发中比较重要的一块内容。尤其是需要多次开发,更新频繁的项目。如何保证项目团队保证高 效的生产力?保持代码Clean是一个有效的途径。看了Bob大叔的《Clean Code》,受益匪浅。里面详细地描述了Clean Code的特征,从命名,到函数,到类,到系统。既抓出了一些常见的问题,也提供的很多解决方案。保持Code Clean, 并在团队中实施,是每...
2011-02-26 19:07:13
184
java多线程学习-java.util.concurrent详解(四) BlockingQueue
前面一篇blog [url]http://janeky.iteye.com/category/124727[/url]我们主要探讨了ScheduledThreadPoolExecutor定时器的使用---------------------------------------------------------------------------------7.BlockingQueu...
2010-09-24 22:06:43
89
java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor
前一篇blog [url]http://janeky.iteye.com/category/124727[/url]我们学习了java多线程的信号量/FutureTask----------------------------------------------------------------------------------6. ScheduledThreadPoolExecu...
2010-09-24 15:35:39
135
java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
前一篇文章 [url]http://janeky.iteye.com/category/124727[/url]我们学习了java.util.concurrent的CountDownLatch和CyclicBarrier今天我们继续共同来探讨其他的多线程组件-----------------------------------------------------------------...
2010-09-24 14:24:47
64
java多线程学习-java.util.concurrent详解(一) Latch/Barrier
Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起,我将跟大家一起共同学习这些新的Java多线程构件1. CountDownLatch 我们先来学习一下JDK1.5 API中关于这个类的详细介绍:“一个同步辅助类,在完成一组正在其...
2010-09-23 17:12:14
91
[读后感]《UML 精髓 3rd》-100多页的uml好教材
UML,对于大部分开发者而言都再熟悉不过了。我对它的认识还是在大学课程《软件工程》,虽然在工作中也经常用到。在大型项目,尤其是采用RUP开发流程,UML是文档中的大头。在敏捷开发中,虽然不强制要求,但在架构设计,团队交流时候,还是发挥了不可替代的作用。最近,系统学习了Martin Fowler的经典UML著作《UML Distilled 3rd》(原版),100多页,足以让我们一...
2010-07-11 16:43:00
156
原创 ActionScript for Multiplayer Games and Virtual Worlds-网页游戏的架构方案
断断续续看完了《ActionScript for Multiplayer Games and Virtual Worlds》,还是有点收获的。这本书的精彩在于提供了网页游戏的各种解决方案。如果你正在或者曾经从事过网页游戏的开发,里面的东西都是你再熟悉不过的。很多曾经困扰的问题,说不定在里面可以得到解决。 当然,这本书也有不足之处。它是居于ElectroSever服务...
2010-05-09 22:15:07
193
原创 开发人员学习mysql心得
前言 公司的mmo web game 玩家越来越多,每个表的数据量都突破千万级别了。虽然进行了分表映射处理,每个表还是有百万数据。每次在程序中要进行数据库操作都提心吊胆。一不小心可能就遇上性能瓶颈。为此,这段时间特意系统学习的MySQL的相关特性。当然,我不是DBA,也不想抢DBA的饭碗。所以,只是站在开发人员的角度学习MySQL。在MySQL管理,内部性能调优,参数设置方面不会涉及很...
2009-12-27 17:19:00
220
Java设计模式-之Singleton单例模式
Singleton (单例模式) Intent :Ensure a class only has one instance , and provide a global point of access of it. 瞎谈:就是保证一个类只有一个实例,并且提供一个全局可访问的点。打个比方,广州限制每户人家养狗,但是只能养一条。一开始你没有狗,你去买一条。若干年后,狗不行失踪了。你为了...
2009-09-19 22:49:27
60
高阶Java之 -- Java元数据-Java注解
特别说明:此Java注释不单单是Javadoc的注释 越来越的开源框架都提供了“元数据”支持了。为了不outdate,今天系统学习一下Java的注释(又叫元数据)。本文将遵循以下的结构布局1.什么是元数据?有什么作用2.Java的“注释”3.在Java中定义自己的注释4.总结一下-----------------------开始----------------------1...
2009-09-19 17:00:16
93
高阶Java-Java枚举类型 enum 应用详解
java的Enum枚举类型终于在j2se1.5出现了。之前觉得它只不过是鸡肋而已,可有可无。毕竟这么多年来,没有它,大家不都过得很好吗?今日看《Thinking in Java》4th edition,里面有一句话“有时恰恰因为它,你才能够"优雅而干净"地解决问题。优雅与清晰很重要,正式它们区别了成功的解决方案与失败的解决方案。而失败的解决方案就是因为其他人无法理他。"使用Enum枚举类型...
2009-09-06 17:18:52
193
Java 日志记录 log4j 最简明教程
最近在搞一个项目架设,希望从构建一个项目方方面面都彻底研究透,增长实战经验。今天先研究一下日志的构建,这里选择了log4j--java方面比较流行的log框架,功能很强大,使用起来也很方便了 废话少说,先看看一个史上最简单的log例子,看看我是如何用最简洁的设计实现将异常等信息写入日志文件的。项目文件结构--------TestLog |----sr...
2009-08-22 11:57:48
175
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人