java随笔(二)



1、类的加载
   类的加载分为隐式加载和显示加载,通常我们隐式加载用的比较多,如:Test obj=new Test();这样jvm就通过classpath找到Test.class路径,加载到内存,不过jvm在加载前会检查该类是否存在内存中,如果存在就不加载了;其次就是显示加载了,如:
Class c = Class.forName("Test"); 
Test obj= (Test)c.newInstance();  通过forName显示的把类加载到内存,并通过newInstance()得到实例,这样我们就可以用obj对象了。

   Class 的 forName() 方法还有另外一种形式: Class forName(String s, boolean flag, ClassLoader classloader) , s 表示需要加载类的名称, flag 表示在调用该函数加载类的时候是否初始化静态区, classloader 表示加载该类所需的加载器。如下用的例子:
Test test = new Test();//Test 类为自定义的一个测试类; 
ClassLoader cl = test. getClass().getClassLoader(); // 获取 test 的类装载器; 
Class c = Class.forName("TestClass", true, cl); 
   
    如果不用jvm的加载机制,可以自定义加载,如:
URL url = new URL("file:/d:/test/lib/"); 
URLClassLoader urlCL = new URLClassLoader(new URL[]{url}); 
Class c = urlCL.loadClass("TestClassA"); 
TestClassA object = (TestClassA)c.newInstance(); 

注意:在加载类的时候首先检查是否有static成员,如果存在就先给static分配内存空间并初始化,如果没有初始化值,就默认值,对象为null,整形为0;然后再初始化其他成员,最后加载构造函数;static成员如果存在不会重新分配内存,整个过程只会初始化一次。


2、jvm垃圾回收机制
   jvm垃圾回收功能作为一个守护线程运行在后台,jvm垃圾回收是非常消耗性能的,jvm一般只会在内存不够用的时候才会去回收并清空垃圾。jvm垃圾回收算法很多,如引用计算法、追踪算法、拷贝算法、迭代算法等;我觉得引用计算法和追踪算法效果可能会更高点。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象不在引用或出了作用,计算器就减1,当为0的时候,这个对象就满足了垃圾回收条件了; 追踪算法,当垃圾扫描的时候发现某个对象不可达或者在栈中没reference这个时候垃圾回收就能回收它了。







  

你可能感兴趣的:(java,jvm,C++,c,算法)