分类目录: 软件技术

Jetty线程“互锁”导致数据传输性能降低问题分析

以下分析针对jetty的特定版本:http://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/tags/jetty-7.2.1.v20101111

首先介绍一下Jetty的反映器模型,Jetty用的经典的NIO异步模型(Scalable IO in Java http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf)。连接管理的示意图如下:

pool

Jetty在使用这个模型的时候,做了一些改动,acceptor是独立出来的一个阻塞线程,用于阻塞地接受新的连接请求,而所有的连接建立之后,都会想selector线程注册网络事件和内部的事件(changes),selector需要同时处理网络事件和内部的changes。同时还要定期检查超时的链接。

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 16票) Loading ... Loading ... | 同时归档在:Jetty | 标签: |

《求a & x 的取值集合》解答改进版

按照上一篇中提到的思路,最后问题的焦点在于:怎样快速找到tmp中的为1的bit位在x中的实际位置。这样在计算N值的同时将每一位的权值与索引位置的关系用数组对照起来,最后只需要在遍历tmp的值为1的bit位时作相应的加权累加即可。
也综合评论中提到的递归方案,重新补充了各个方案的代码和性能测试代码。

见“方案1”的代码处:

阅读全文 »

| 1 分2 分3 分4 分5 分 (4.40- 5票) Loading ... Loading ... | 同时归档在:C/C++, Java, 算法数据结构, 职业发展 |

给定一个long型常量,其值为x,给定long型变量a,要求a & x 的取值集合

给定一个long型常量,其值为x,给定long型变量a,要求a & x 的取值集合,结果放入ArrayList中。

思路,x先转换为bit数组,得出其中元素值为1的总数为n,则所有取值的总数为2的n次方,记为N。
在0~N的闭区间中,依次取出各个数值,记为tmp,将tmp也转换为bit数组,依次遍历x的每一个bit位,当x的bit位为1时,到tmp中去取出相应的bit位,如果也为1,则将该位为1时,其他所有位为0时所代表的数值累加到结果中。
遍历完所有的bit位后,得到的结果即为所需要的数值。

整个思路有点复杂,性能也不高,从数值本身的与或运算上面着手,肯定还有更简单的方法。

代码:

阅读全文 »

| 1 分2 分3 分4 分5 分 (4.75- 4票) Loading ... Loading ... | 同时归档在:Java, 算法数据结构, 职业发展 |

内核模块编程初探

照着这里的简单教程(http://www.kerneltravel.net/?page_id=8)编写了第一个内核模块,对中断和内核模块注册形成了简单的认识。

Makefile文件:

# Makefile2.6
obj-m += first.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 7票) Loading ... Loading ... | 同时归档在:Linux内核 |

JNI编程初试

首先编写Java类,用于调用C++库导出的方法:

public class TestMain
{
public native boolean printInfo();

public native int getNum();

public native void setNum(int num);
 

阅读全文 »

| 1 分2 分3 分4 分5 分 (5.00- 6票) Loading ... Loading ... | 同时归档在:Java, JNI技术 |

【每天一题】获取单向链表的倒数第K个元素

思路:无论如何,如果不借助于辅助数据结构,那么链表的某些元素肯定需要被遍历两遍。
在使用辅助的数据结构的情况下,可以采用如下方案:
遍历的同时将每个节点的地址和序号记录在一个足够大的数组中,等到遍历完成时就可以从数组中找到倒数第K个元素。这肯定不是出题人的本意。
 
在对链表遍历两遍的情况下,可以有两种方案:
1、用两个指针,一个指针先走K步,然后第二个指针再从头开始,这样当地一个指针走到尾节点时,第二个指针的位置就是所需要的节点位置。
2、先遍历一遍链表得到链表的长度N,然后再从头遍历,直到第N-K个节点。
 
两种方法无优劣之分,但是前者显然更有“创意”,下面就方案1给出代码:

阅读全文 »

| 1 分2 分3 分4 分5 分 (4.88- 8票) Loading ... Loading ... | 同时归档在:Java, 算法数据结构 |

jvisualvm.exe连接的建立

jstatd -J-Djava.security.policy=jstatd.all.policy -p 10423
注意jstatd.all.policy文件的绝对路径和jstatd可执行文件的路径要一致。

对于jmx连接:
service:jmx:rmi:///jndi/rmi://172.16.128.80:1099/JMXConnector

| 1 分2 分3 分4 分5 分 (5.00- 6票) Loading ... Loading ... | 同时归档在:Java |

Gbean与Mbean的联系

关于Mbean和JMX

基于RMI实现的JMX动态管理java程序运行时的实例的属性的接口标准。

用 MBeanServerKernelBridge 和 MBeanGBeanBridge 连接 Geronimo 与 JMX
Geronimo 提供了几个类来弥补 Geronimo GBean 框架与 JMX MBean 框架之间的差距。MBeanServerKernelBridge 类将载入 Geronimo 的每一个 GBean 注册为相关联 MBeanServer 实例中的一个 MBean。该行为使得使用 Geronimo 公开 MBeans 的过程只是将其封装在 GBean 中,然后使用 Geronimo 内核注册 GBean。

内核启动过程中,在 MBeanServerKernelBridge 实例启动时,将检索内核注册的所有 GBeans 并将它们转换为 MBeans。这些 MBeans 是动态 MBean,它们以 MBeanGBeanBridge 实例的形式维护对 Geronimo 内核的引用和存储在每个 GBean 的 GBeanInfo 引用中的信息。
因为 MBeanServerKernelBridge 实例是由 Geronimo 内核注册为 GBean 的,所以只要注册新的 GBean,该 GBean 就会自动注册为 LifecycleAdapter 实现,以接收加载事件和卸载事件。在发生加载和卸载事件时,MBeanServerKernelBridge 使用 MBeanServer 将每个相关联的 GBean 注册和注销为一个 MBean,以确保 JMX 感知客户端提供 Geronimo 和 Geronimo 内核当前状态的精确视图。

| 1 分2 分3 分4 分5 分 (5.00- 8票) Loading ... Loading ... | 同时归档在:Geronimo, JMX |
返回顶部