Tomcat从零开始(四)一些零散的问题和下一节课预备知识

来源:互联网 发布:java split 逗号分隔 编辑:程序博客网 时间:2024/05/08 19:42

第四课:

我觉得blog这东西 和 看书是一样的。重要的不是从上面写的东西学到什么,而是你在学的时候  应该结合你自己所学的思考。比如就是昨天的   服务器加载servlet的时候,为什么使用的classloader来加载类  而不是用 Class.forName。 其实这个问题去翻翻API就能了解的差不多了。
    public static Class<?> forName(String className)                throws ClassNotFoundException {        return forName0(className, true, ClassLoader.getCallerClassLoader());    }
public static Class<?> forName(String name, boolean initialize,                                   ClassLoader loader)        throws ClassNotFoundException    {        if (loader == null) {            SecurityManager sm = System.getSecurityManager();            if (sm != null) {                ClassLoader ccl = ClassLoader.getCallerClassLoader();                if (ccl != null) {                    sm.checkPermission(                        SecurityConstants.GET_CLASSLOADER_PERMISSION);                }            }        }        return forName0(name, initialize, loader);    }

 private static native Class<?> forName0(String name, boolean initialize,                                            ClassLoader loader)        throws ClassNotFoundException;

从这里可以看到  Class.forName("xxxx")这个实际上是调用的  native方法  forName0这个方法,而forName()的三参 版也 调用的这个方法。而且  第二个参数是true 。 我们来看看第二个参数是什么意思,在src.zip中可以找到 如下注释initialize whether the class must be initialized。所以可以看出来 ,这个Class.forName 如果一旦执行,这个class就要被初始化了。而我们看看ClassLoader
    public Class<?> loadClass(String name) throws ClassNotFoundException {        return loadClass(name, false);    }

同样,根据注释可以看出 ,当resolve为false,那么加载的类 就是 还没有经过  linking的。更别说  初始化了。Java的类加载分为3个阶段  ,load、link、init。至于这三个阶段,我就不多解释了....如果不懂 ,可以大概的去了解一些JVM的知识。呃   可能很多人也认为new 之后系统才分配的内存吧,建议看看JVM虚拟机以后就能有个新的认识。深入理解Java虚拟机(周志明)的。前几天撸了大半本,感觉还算不错吧。

看完这么多,相信可能也了解为什么服务器用classLoader去加载类了。希望这个可以自己思考

之后就是下节课的预备知识了。

强烈建议看一下计算机网络,这东西其实也比较有用吧。这次先科普一下HTTP1.1就是持续的连接,一个连接可以下载整个页面,省去了多次建立 连接的消耗。之后就是分段传输。这个就不多说了。

另外一个就是  池的 概念,做J2EE的应该都知道jdbc池。其实 我们上节课的 程序,每次只能处理一个请求,所以,我们在这里就可以引入  池。可以自己建立一个 Stack,设定一个数值,开始的时候创建 min个 Http处理对象,当不够的时候就去自动创建,到最大值之后就暂时性的忽略请求。     至于min和max的数值设为多少,其实这个是依靠你实际情况来测试的。当时的jdbc连接池,为了调优,就是进行了测试。

妥了,今天就先说这么多。


原创粉丝点击