【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(); } }