- 浏览: 59492 次
- 性别:
- 来自: 杭州
最新评论
-
name327:
迟到三年多的回答,大概都不需要了,可以给其他人看,我的回答只代 ...
仿照jetty的nio原理写了个例子 -
顾惜朝:
...
ibatis如何自动获取自定义的handler -
悲伤逆流成河:
我也研究过,写了个socks5代理服务器,感觉真的nio真的一 ...
仿照jetty的nio原理例子2(7月10号改进) -
diyunpeng:
直接用JarInputStream读取Jar内文件不可以么?
...
写了个脚本查找项目里面重复的class文件,避免冲突 -
diyunpeng:
JdbcOdbcDriver class loaded
re ...
关于DriverManager与驱动
文章列表
刚才无意中看到几篇讲DriverManager源码的文章,发现几点没有讲明白的地方。
这里重新说一下:
直接进入正题
Class.forName("com.mysql.jdbc.Driver");
这个玩意做了这些事情:
1.驱动的实现类:com.mysql.jdbc.Driver 里面的static块,调用DriverManger.registerDriver()来 注册自己
2.DriverManger自己初始化(仅第一次调用注册方法的时候调用一次)
3.把驱动封装成对象存到victor里面
第一点,每个驱动的实现类都必须明确的注册自己到Drive ...
项目中的jar包里面可能有 包名+类名 都相同的class,可能导致class加载出问题。
昨天有同事写了个脚本来实现查找重复jar包操作的功能,结果跑一次要20分钟。
汗!
问我为啥这么慢!一看,发现时间都耗在io操作上了(他把jar包解压缩后再做的其他操作)。
其实要看jar包里面的内容无需解压,unzip -l即可
写了个脚本,自己在eclipse插件的那个文件夹里面试了一下,还好。
总共697个jar文件,里面包含了85836个class文件,解析一次只需要10秒左右。
awk的数组效率还是挺高的。shell代码如下:
ls *jar|while read LINE; do unzi ...
下午写了一个DO类,里面有一个枚举的对象,因此用到了ibatis的自定义handler
Account类里的status属性是枚举类型,对应的xml文件如下:
............
<typeAlias alias="account" type="test.Account"/>
<insert id="insertAccount" parameterClass="account">
insert into ACCOUNT (
ACC_ID ...
一直对线程池有些疑问:
1.线程池怎么保证线程一直存在?
2.线程池怎么控制最大空闲时间?
3.线程池怎么回收线程?
。。。。
带着这些问题,看了一边jetty的线程池。
jetty有三个线程池,分别是ExecutorThreadPool,OldQueuedThreadPool,QueuedThreadPool
它们都实现了org.eclipse.jetty.util.thread.ThreadPool接口,并继承org.eclipse.jetty.util.component.AbstractLifeCycle
这里我们只关注QueuedThreadPool。
看名字就知道,它是跟队列相关的 ...
前几天看到公司群里有人在找最长的方法名,今天想起来,写了个命令。
引用
find . -name "*\.java" -type f |xargs awk '$1~/public/{split($3,aa,"(");k=length(aa[1]);print k" "aa[1]}'|sort -nrk1,1|head -10
1.用awk匹配以public开头的,以()结尾的字符串。
2.$3就是方法名,用内置函数计算方法名的长度,打印长度和方法名
3.按照方法长度从大往小排序,显示前10行。
改动点:
1.分成了4个class文件,看起来清晰一点
2.把请求封装成附件,放到socketChannel里面
3.selector.accept()方法删除,取而代之的是selector.selectNow(),并且放到处理注册信息之后。增加了休息策略,selector.select(400),避免不停的循环,占用cpu%的情况。
4.每个请求到来之后,直接分出一个线程去处理。
7月10日改进点:
1.增加了自动删除超时的连接功能
2.key.interestOps操作优化,放到selector线程里面去做
3.request取消了runnable接口
SimpleJettyS ...
看了好些天的nio和jetty源码,写了个例子。
太晚了,先直接贴代码了,注释不是很全。
更新了代码的解释和2个疑问在最下面
package com.daizuan.jetty;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocke ...
看了虚拟机的一些文章,有点感触,赶紧写出来。
Class 用来描述一个类型,当一个类型被装载(虚拟机读取二进制的class文件)的时候,会创建一个与该类型对应的Class对象到内存堆中。(这个时候该类型甚至没有被分配内存,设置默认值,更别说初始化了)。
Class.forName有2个重载的方法:
public static Class<?> forName(String name, boolean initialize,
ClassLoader loader)
throws ClassNotFoundException
pu ...
以下6种情况会初始化实例中的变量:
1.创建类的新实例
2.调用类中声明的静态方法
3.操作类或者接口中声明的非常量静态字段
4.调用java api的特定的反射方法
5.初始化一个类的子类
6.指定一个类作为虚拟机启动时候的初始化类
以下四种情况会实例化一个对象:
1.明确的使用new操作符
2.调用Class或者java.lang.reflect.Constructor对象的newInstance()方法
3.调用现有对象的clone()方法
4.调用java.io.ObjectInputStream类的getObject()方法反序列化
另外,隐含实例化:
1.每一个main方法执行的 ...
class Lava{
private int speed = 0;
void flow(){
}
}
class Volcano{
public static void main(String args[]){
Lava lava = new Lava();
lava.flow()
}
}
学习后,理解的执行过程:
虚拟机找到Volcano的class文件,提取里面的二进制文件到方法区。
执行保存在方法区的字节码,开始main方法。此时,Lava类还没有被加载,等到需要时,才 ...
运行时候数据区:方法区,堆,java栈,pc寄存器,本地方法栈
每个虚拟机运行的时候,都会有方法区和堆,所有线程共享
每个线程被创建,都会得到自己的java栈和pc寄存器,任何一个线程都不能访问另一个线程的java栈和寄存器。
如果线程执行的是一个java方法(非被地方法),pc寄存器里的值总是指向下一条指令,而java栈中存放的是该线程执行的方法的状态,如:局部变量,传递进来的参数,返回值以及运算的中间结果等。
而本地方法的调用则是以某种依赖具体实现的方式存放在本地方法栈中,也可能是寄存器或者其他特定的实现相关的内存中。
java栈是由很多帧组成,每一帧包括一个方法的调用状态,当调用一个方 ...