START FROM 2014/5/12 for memory of wenchuan
【1】关于java内存的三篇文章:
1,内存模型
而内存模型就是规定了一个规则,处理器如何同主内存同步数据的一个规则。
2,垃圾回收
要点: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关键字
对于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();
}
}