于吉吉的技术博客

建造高性能门户网

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  65 随笔 :: 6 文章 :: 149 评论 :: 0 Trackbacks

#

     摘要: 一直以来似乎都有一个错觉,认为map跟其他的集合类一样继承自Collection,其实不然,Map和Collection在结构层次上是没有任何关系的,通过查看源码可以发现map所有操作都是基于key-value对,而不是单独的元素。

下面以HashMap为例子,深入对Map的实现机制进行了解,在这个过程中,请打开jdk源码。

Hash算法

HashMap使用Hash算法,所以在解剖HashMap之间,需要先简单的了解Hash算法,Hash算法一般也成为散列算法,通过散列算法将任意的值转化成固定的长度输出,该输出就是散列值,这是一种压缩映射,也就是,散列值的空间远远小于输入的值空间。
简单的说,hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等里面存取数据。

下面我们建立一个HashMap,然后往里面放入12对key-value,这个HashMap的默认数组长度为16,我们的key  阅读全文
posted @ 2011-02-15 19:18 陈于喆 阅读(10159) | 评论 (6)编辑 收藏

     摘要: 以前的房产地图一直都是使用有道地图,虽然有道地图是很好,但是为了更好,还是决定使用google地图来重新开发^_^,下面是一个开发完毕的简单应用http://xf.house.163.com/gz/map/000B.html

1)整合Google Maps JavaScript API V3 与 Google Local Search API

Google Maps JavaScript API V3
地址 http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/

Google Maps JavaScript API V3 文档读起来真的是很清晰,各种demo也很齐全,并且论坛的拥有巨大的论坛支持,对比了一下Google Maps JavaScript API V3 和 V2 的版本,虽然第3版的 Google Maps API 看上去跟第2版挺相识,但在内在机制上有了较大的变化,尤其在对移动浏览器的支持上,专门针对iphone和android  阅读全文
posted @ 2011-02-12 15:57 陈于喆 阅读(4931) | 评论 (6)编辑 收藏

     摘要: 对于进程管理工具平时大多用的是ps,kill,top,sleep等等这些命令,平时linux的一些指令我都会做一些记录,本着好记性不如烂博客的精神,也把进程管理的命令做一点系统性的记录,参考资料基本是鸟哥还有网上的一些文章。

ps
ps命令主要是查看系统进程的状态,平时最常用的命令是ps aux,然后再使用管道导向到grep查找特定的进程,然后进此特定进程进行操作。
要对进程进行操作必须先了解到当前进程的情况,ps命令体现了现实当前运行进程的快照,ps和top和相似,但ps提供了更多的信息,可以确定哪些进程正在运行,哪些进程被挂起,运行了多长时间,以及进行使用的资源和进程的优先级,这些信息对我们都有很重要的作用,当我们使用ps aux可以获得终端所有用户的有关进程信息。  阅读全文
posted @ 2011-01-21 17:56 陈于喆 阅读(1082) | 评论 (0)编辑 收藏

posted @ 2011-01-21 12:34 陈于喆 阅读(582) | 评论 (0)编辑 收藏

     摘要: 问题是这样的,有个脚本需要10秒钟执行一次,脚本具体功能就不细说,定时任务自然选用crontab,但是crontab最小的执行时间为分钟,最后决定选用死循环进行实现。

脚本
vi hello.sh
#!/bin/sh
while :
do
echo `date` >> /home/chenyz/1 //这里是任务的实现
sleep 10
done

这里的程序运行时间间隔是10s,小心咯,如果没有加sleep 10,你的机器很快就会耗尽资源,负载会狂飙。

接着需要把脚本用后台守护进程来运行,避免用户退出而导致脚本失效  阅读全文
posted @ 2011-01-19 17:47 陈于喆 阅读(2533) | 评论 (0)编辑 收藏

     摘要: 对于用户管理工具平时大多用的是groupadd,useradd,usermod等等这些命令,平时linux的一些指令我都会做一些记录,本着好记性不如烂博客的精神,也把用户管理的命令做一点系统性的记录,参考资料基本是鸟哥还有网上的一些文章。

用户组的管理
linux可以对一个用户组中的所有用户进行集中的管理,用户组的管理包括用户组添加,删除修改,实际上这些操作就是对/etc/group文件作出修改。

groupadd 新增一个用户组
groupadd [-g gid [-o]] [-r] [-f] group
-g 其中gid是指定新用户组的标识号,除非配合使用-o参数,不然该值必须是唯一的
-o 标识新用户组gid可以和系统中原有的用户组的gid值相同
实例:
groupadd chenyuzhe1
groupadd -g 789 chenyuzhe2

groupdel 删除用户组
实例:
groupdel chenyuzhe1  阅读全文
posted @ 2011-01-19 15:36 陈于喆 阅读(1444) | 评论 (0)编辑 收藏

     摘要: 对于磁盘管理工具平时大多用的是df,du这些命令,平时linux的一些指令我都会做一些记录,本着好记性不如烂博客的精神,先把磁盘管理的命令做一点系统性的记录。

du
du的英文为:disk usage,含义是磁盘空间使用情况,功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块的情况,如果没有指定目录,则对当前的目录进行统计。
du的命令各个选项含义如下:

a:显示全部目录和其次目录下的每个档案所占的磁盘空间
s:只显示各档案大小的总合
b:大小用bytes来表示
x:跳过在不同文件系统上的目录不予统计
a:递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数  阅读全文
posted @ 2011-01-19 13:08 陈于喆 阅读(492) | 评论 (0)编辑 收藏

     摘要: List在数据结构中表现为是线性表的方式,其元素以线性方式存储,集合中允许存放重复的对象,List接口主要的实现类有
ArrayList
ArrayList 其实就是一组长度可变的数组,当实例化了一个ArrayList,该数据也被实例化了,当向集合中添加对象时,数组的大小也随着改变,这样它所带来的有优点是快速的随机访问,即使访问每个元素所带来的性能问题也是很小的,但缺点就是想其中添加或删除对象速度慢,当你创建的数组是不确定其容量,所以当我们改变这个数组时就必须在内存中做很多的处理,如你想要数组中任意两个元素中间添加对象,那么在内存中数组要移动所有后面的对象。

LinkedList
LinkedList 是通过节点的连接实现链表的数据结构,向linkedList中插入或删除元素的速度是特别快,而随机访问的速度相对较慢,这个是由于链表本身的性质造成的,在链表中,每个节点都包含了前一个节点的引用,后一个节点的引用和节点存储值,当一个新节点插入式,只需要修改其中相关的前后关系节点引用即可,删除节点也是一样。操作对象只需要改变节点的链接,新节点可以存放在  阅读全文
posted @ 2011-01-16 17:36 陈于喆 阅读(11392) | 评论 (1)编辑 收藏

     摘要: 我们都知道Set是一种最简单的集合,对象的排序无特定的规则,集合里面存放的是对象的引用,所以没有重复的对象,在上面的代码中,程序创建了a、b、 c、d、e五个变量,其中a和c,b和e所引用的字符串是一致的,然后向set添加了这5个变量。打印出来的size()只有3个,实际上向集合加入的只有3个对象,在执行Set的add()方法时已经进行了判断这个对象是否存在于集合,如果对象已经存在则不继续执行。
Set的接口有两个实现类,HashSet和TreeSet,HashSet是按照哈希算法来进行存取集合中的对象,存取速度比较快,TreeSet类显示了SortedSet接口,具有排序功能

HashSet
HashSet是按照哈希算法来存取集合中的对象,具有很好的存取和查找性能,当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法来获取哈希码,然后根据这个哈希吗来计算对象在集合中的存放位置。
在Object类中定义了hashCode()和equal(),equal()是按照内存地址比较对象是否相同,如果 object1.equal(  阅读全文
posted @ 2011-01-06 18:07 陈于喆 阅读(8602) | 评论 (0)编辑 收藏

posted @ 2011-01-04 14:10 陈于喆 阅读(71413) | 评论 (6)编辑 收藏

     摘要: The minimum requirement for a POM are the following:

project root
modelVersion - should be set to 4.0.0
groupId - the id of the project's group.
artifactId - the id of the artifact (project)
version - the version of the artifact under the specified group

Here's an example:  阅读全文
posted @ 2010-12-29 17:50 陈于喆 阅读(314) | 评论 (0)编辑 收藏

     摘要: 由于历史原因,几个项目都选用hessian作为web service的实现方式,hessian的确是非常轻量级,基于http协议进行传输,通过自定义的串行化机制将请求信息进行序列化,以二进制传输节省了不少的开销,速度跟socket差不多.客户端和服务器发起和接收请求都是通过spring提供的hessian api进行请求和接收,但是在服务端中并没有记录和控制远端ip地址和主机的信息,所以需要对源码进行一些重写

对org.springframework.remoting.caucho.HessianServiceExporter进行重写

/**
* 重写HessianServiceExporter.handleRequest(),拦截获取远端调用信息
* @author chenyz
*
*/
public class HouseHessianServiceExporter extends HessianServiceExporter {

private static S  阅读全文
posted @ 2010-12-21 16:05 陈于喆 阅读(3012) | 评论 (0)编辑 收藏

     摘要: 目前几套系统中主要使用的hessian进行远程调用webservice服务的有hessian的 HessianProxyFactory(com.caucho.hessian.client.HessianProxyFactory)和 spring的 HessianProxyFactoryBean(org.springframework.remoting.caucho.HessianProxyFactoryBean).

1.HessianProxyFactory
查看HessianProxyFactory源码后发现,hessian在创建http请求连接webservice服务并没有对连接超时进行相关的参数设置,所以当网络出现问题就会造成整个hessian处理的阻塞,进而阻塞整个线程后续的处理
以下是HessianProxyFactory对连接处理的源码

protected URLConnection openConnection(URL url)
throws IOException
{
URL  阅读全文
posted @ 2010-12-16 14:46 陈于喆 阅读(11984) | 评论 (11)编辑 收藏

     摘要: 对很久以前的一个bug进行分析和总结

function parsePost(data, action) {
try {
var postData = eval("(" + data + ")");

// TO DO1
} catch (e) {

// TO DO2
}
}


这是一段页面的老代码,data是数据库body字段,既是用户录入并取出的数据,由于业务的关系,data是以json格式保存的,为了使数据能实现兼容,这里使用try...catch...方式处理,如果变量data能被转换成对象,则执行TO DO1,否则执行TO DO2.

我们知道eval的作用很简单,就是把一段字符串传递给js解析器,由javascript解析器将这段字符串解释成为  阅读全文
posted @ 2010-12-15 11:31 陈于喆 阅读(4316) | 评论 (2)编辑 收藏

     摘要: 上次因工作的需求对一台apache的log做了一次整体的分析,所以顺便也对apache的日志分析做下简单的介绍,主要参考apache官网的Log Files,手册参照 http://httpd.apache.org/docs/2.2/logs.html

一.日志分析
如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log
1.access_log
access_log为访问日志,记录所有对apache服务器进行请求的访问,它的位置和内容由CustomLog指令控制,LogFormat指令可以用来简化该日志的内容和格式
例如,我的其中一台服务器配置如下

CustomLog "| /usr/sbin/rotatelogs /var/log/apache2/%Y_%m_%d_other_vhosts_access.log 86400 480" vhost_combined

-rw-r--r-- 1 root root 22310750   阅读全文
posted @ 2010-12-10 17:52 陈于喆 阅读(12465) | 评论 (3)编辑 收藏

     摘要: 下载地址 http://awstats.sourceforge.net
下载最新版本

安装
cd /home/download
wget http://awstats.sourceforge.net/files/awstats-7.0.tar.gz
tar zxf awstats-7.0.tar.gz
mv awstats-7.0 awstats
perl awstats_configure.pl

在[y/n]选择时,输入y
接着输入你要分析的域名,输入tech163
一路Enter

配置
vi /etc/awstats/awstats.tech163.com  阅读全文
posted @ 2010-12-10 17:28 陈于喆 阅读(1209) | 评论 (0)编辑 收藏

     摘要: 下面一个伴随了好几个工程的时间操作的工具类,提供了一些常用的时间操作和计算的方法,每段时间都会进行一次整理,希望能去冗余和得到好的扩展

package com.***.product.util;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class DateUtil {
protected static Log logger = LogFa  阅读全文
posted @ 2010-12-09 18:37 陈于喆 阅读(437) | 评论 (0)编辑 收藏

     摘要: 大名鼎鼎的分布式缓存系统memcached,在开源社区中可谓是无人不知无人不晓,memcached支持分布式的横向扩展,但memcached的服务端却是单实例,并无"分布式"的功能,所谓的分布式只是客户端在存储的主键做分布的存储;还有memcached组件缓存对象,如果组件无进行序列化必定无法正确取得数据;如何使用memcached的java组件来监控memcached的运行状态;以上等等的问题是我在日常的工作中碰到并解决的,拿出来跟大家做个分享^_^

对象的序列化
首先memcached是独立的服务器组件,独立于应用系统,从客户端保存和读取对象到memcached是必须通过网络传输,因为网络传输都是二进制的数据,所以所有的对象都必须经过序列化,否则无法存储到memcahced的服务器端.
正如我们以往在集群中应用的序列化一样,memcached的序列化的性能也是往往让大家头疼,如果我们对我们的domain类进行对象的序列化,第一次序列化时间会比较长,但后续会优化,也就是说序列化最大的消耗不是对象的序列化,而是类的序列化,如果存储的只是一个String  阅读全文
posted @ 2010-12-08 15:00 陈于喆 阅读(5599) | 评论 (4)编辑 收藏

     摘要: 很久以前就见过这本1000页的书<代码大全>,觉得应该是说些写代码的东西,没怎么又兴趣去读它,一次偶然的机会,发现自己是误解了它,<代码大全>觉得应该叫软件百科好像更合适一点,因为它里面涵盖了架构,分析,设计,编程,测试,重构,面向对象,调试,规范,管理,软件质量控制,协作,优化,开发工具,注释,甚至个性,开发艺术等等等,让人感觉就是一本软件百科全书.

书读的不多,不过刚开始读了100多页有一点感悟,所以做了一点记录,叫读<代码大全>的一点记录之1.

利用隐喻
隐喻通过把软件开发与你所熟知的事情联系在一起,从而使你对其更有深刻的理解,正是因为如此在计算机中的发展不过仅有数十年的历史,却拥有着所有科学最为丰富多彩的语言

盖房子的隐喻
狗屋
霹雳啪啦,木材加铁钉,犯错了怎么办?无所谓,拆了再来过  阅读全文
posted @ 2010-12-07 17:59 陈于喆 阅读(1237) | 评论 (0)编辑 收藏

     摘要: memcached需要依赖到以下的一系列包
gcc
libevent
glibc-devel

下载
cd /home/download
wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
wget http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz

安装
tar -zxvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
./configure --prefix=/usr/local/libevent
make && make install

tar -zxvf memcached-1.4.0.tar.gz  阅读全文
posted @ 2010-12-07 16:34 陈于喆 阅读(333) | 评论 (0)编辑 收藏

列出全部内容
共4页: 上一页 1 2 3 4 下一页