【Java,JNI】学习汇总

START FROM 2014/5/12 for memory of wenchuan

【1】关于java内存的三篇文章:

1,内存模型http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html

而内存模型就是规定了一个规则,处理器如何同主内存同步数据的一个规则。

2,垃圾回收http://www.cnblogs.com/aigongsi/archive/2012/04/06/2434771.html

要点:jvm采用找root对象的方式确定是否回收。

Strong Reference(强引用) –>Weak Reference (弱引用) -> Soft Reference(软引用) – > Phantom Reference(引用)

 

Strong Reference : 只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收

Weak Reference :即使在root算法中 其引用的对象root可达到,但是如果jvm堆内存 不够的时候,还是会被回收。

Soft Reference : 无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。

Phantom Reference :在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列.

3,volatile关键字http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的

4,再总结下synchronized用法

   有两种,一种用来修饰方法 --public synchronized void quary(),一种用来造一个同步块--synchronized(xxx.class){...}

  修饰方法:若是实例方法,则:同一时间,同一个实例,只能访问被synchronized修饰的方法中的1个。若是类方法,同理;

  同步块:修饰方法无法避免不同线程的访问,同步块中加一个“锁”,锁即一个全局对象或者类,即可保证所有线程都只能有一个线程在访问。

5,20140707,mysql+hibernate过程中的问题及解决

  一,得不到session,搜了下,又仔细看了下生成的factory及接口,发现封闭极其漂亮,直接new一个dao就可以操作数据库,然后commit一下

  二,jsp就是把java代码放到html块中,java代码用<%%> <%!%><%=%>什么的括起来,page指令就是在jsp文件头可以import

  三,可以写一个有main方法的test类,直接跑这个test类,打出log

  四,jsp和html写完直接可以访问出来,servlet写完要重新跑一下,让servlet.class重新生成

  五,花了时间比较长的一个总是是getSession为空指针,百度不出解决,看log成了关键,一看就发现总是在哪里了。

6,20140805   关于MD5,一切皆在代码中

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {
    public static void main(String[] args){
        MD5Utils.md5String("i");
        log("******************************");
        MD5Utils.md5File("e:/TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.msi");
    }
    public static void log(String str){
        System.out.println(str);
    }

    private static final char HEX_DIGITS[] = {
            '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
    };


    public static String toHexString(byte[] b) {
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
            sb.append(HEX_DIGITS[b[i] & 0x0f]);
        }
        return sb.toString();
    }

    /**
     * MD5鍔犲瘑
     * 
     * @param string
     * @return
     */
    public static String md5String(String string) {

        byte[] hash;

        try {

            hash = MessageDigest.getInstance("MD5").digest(
                    string.getBytes("UTF-8"));
            log("hash.length = "+hash.length+"");
        } catch (NoSuchAlgorithmException e) {
            log("NoSuchAlgorithmException");
            throw new RuntimeException("Huh, MD5 should be supported?", e);
        } catch (UnsupportedEncodingException e) {
            log("UnsupportedEncodingException");
            throw new RuntimeException("Huh, UTF-8 should be supported?", e);
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        
        for (byte b : hash) {
            log(Integer.toHexString(b & 0xFF)+"");
            if ((b & 0xFF) < 0x10){
                hex.append("0");
            }
            hex.append(Integer.toHexString(b & 0xFF));
//            log(hex+"");

        }
        log(hex.toString());
        return hex.toString();
        
    }

    public static String md5File(String filename) {
        InputStream fis;
        byte[] buffer = new byte[1024];//1KB
        int numRead = 0;
        MessageDigest md5;
        int count = 0;
        try {
            fis = new FileInputStream(filename);
            md5 = MessageDigest.getInstance("MD5");
            log(toHexString(md5.digest()));
            while ((numRead = fis.read(buffer)) > 0) {
                log("numRead="+numRead);
                count++;
                log("count="+count+" buffer:"+buffer[0]+buffer[1]+buffer[2]+buffer[3]);
                md5.update(buffer, 0, numRead);
                log(toHexString(md5.digest()));
            }
            fis.close();
            log(toHexString(md5.digest())+"------result");
            return toHexString(md5.digest());
        } catch (Exception e) {
            System.out.println("error");
            return null;
        }
    }
}

 7,关于enum,依旧是一切都在代码中

public enum ECar {
    A("audi"), B("bmw"),V("vw");

    private String nName;

    ECar(String name) {
        this.nName = name;
    }

    public String getName() {
        return this.nName;
    }
    
    public static ECar getEnumByName(String name) {
        for(ECar car: ECar.values()){
            if(car.getName().equals(name)){
                return car;
            }
        }
        return ECar.V;
        
    }
    
    public static String getNameByEnumStr(String enumStr){
        for(ECar car: ECar.values()){
            if(car.toString().equals(enumStr)){
                return car.getName();
            }
        }
        return V.getName();
    }
    
}

 

posted @ 2014-05-12 18:26  linsen@java  阅读(243)  评论(0编辑  收藏  举报