存档

2012年12月 的存档

JVM -verbose参数详解

2012年12月31日 没有评论

 

java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息。
 
1.java -verbose:class
 
在程序运行的时候有多少类被加载!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX  (XXX为程序名)你会在控制台看到加载的类的情况。
verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下: 
[Opened D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.String from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Class from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.ClassLoader from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.System from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Throwable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
 
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
 
2.java –verbose:gc
 
在虚拟机发生内存回收时在输出设备显示信息,格式如下: [Full GC 256K->160K(124096K), 0.0042708 secs] 该参数用来监视虚拟机内存回收的情况。
 
public class JvmVerbose {
 
/**
* JVM -verbose[:class|gc|jni] 参数测试
* @param args
*/
public static void main(String[] args) {
JvmVerbose jvmVerbose = new JvmVerbose();
System.gc();
}
 
}
 
 
在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令: java -verbose:gc JvmVerbose 后结果为:
 
[GC 647K->256K(124096K), 0.0274253 secs]
[Full GC 256K->160K(124096K), 0.0042708 secs]
 
箭头前后的数据256K和160K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有256K-160K=96K的对象容量被回收,括号内的数据124096K为堆内存的总容量,收集所需要的时间是0.0042708秒(这个时间在每次执行的时候会有所不同)。
 
3.java –verbose:jni
 
-verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
 
在虚拟机调用native方法时输出设备显示信息,格式如下: [Dynamic-linking native method java.lang.Object.registerNatives ... JNI] 该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。
分类: jvm 标签: ,

mysql中limit的用法

2012年12月13日 没有评论

 

 
SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset
 
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。 
 
mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15
 
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
 
//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行
 
//换句话说,LIMIT n 等价于 LIMIT 0,n。
分类: mysql 标签:

格式化MySQL输出

2012年12月9日 没有评论

 

只要在 SQL 后面加上 "\G" 便可解決,例如:
 
select * from user;
 
改成
 
select * from user\G;
 
 
 
另外语句执行结尾会产生ERROR: No query specified
原因是:\G就是结束  再加一个";" 就多余了,所以才报错

 

分类: mysql 标签:

@Override的作用

2012年12月6日 没有评论

 

如果想重写父类的方法,比如toString()方法的话,在方法前面加上@Override 系统可以帮你检查方法的正确性,
@Override
public String toString(){…}这是正确的
一旦写错 写成这样
@Override
public String tostring(){…}
编译器可以检测出这种写法是错误的 这样能保证你的确重写的方法正确
而如果不加@Override
public String tostring(){…}这样编译器是不会报错的 它只会认为这是你自己新加的一个方法而已
 
————————————————————
 
@Override的用法:
 
Override:
java.lang.Override是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。
 
使用方法极其简单:在使用此annotation时只要在被修饰的方法前面加上@Override。
下面的代码是一个使用@Override修饰一个企图重载父类的toString方法,而又存在拼写错误的sample:
清单1:
 
@Override public String toSting() { // 注意方法名拼写错了 return "[" + super.toString() + "]";}
——————————————————-
Java6的@override注解与Java5不同之处:
首先看一下下面的示例代码 : 
  Parent.java
public class Parent{
  public void parentMethod(){
  }
}
  IChild.java
public interface IChild{
  void interfaceMethod();
}
  Child.java
public class Child extends Parent implements IChild{
  @Override
  public void parentMethod(){
  }
  @Override
  public void interfaceMethod(){
  }
}
  由于代码很简单,我就不做说明
  上述代码在jdk6下可以编译通过
  而在jdk5下编译无法通过,输出的错误信息如下:
  Child.java:7: 方法未覆盖其父类的方法
  @Override
  ^
  1 错误
  上面的错误信息说在Child.java第七行的Override注解是不对的,不对的原因是该方法(interfaceMethod)不是父类方法。
  当然,实际上这个方法是类实现的接口中方法,但是,这个语法的jdk6的下面是可以通过的,也就是说java6认为类覆盖父类方法与实现接口方法都叫override,而jdk5不是这样认为的,不知道这是当初jdk5的bug,还是当初就是认为覆盖父类方法与实现接口方法是不一样的,不得而知。但是从OO角度来看,覆盖父类方法与实现接口方法都可以认为override,因为他们目的都是一样的,都是为了重用,都是多态的一种表现方式。这从jdk6的支持这个功能就可以看出。
  差一点忘了:
  标准的java api文档java5与java6对Override annotation的的解释一样的
  java5:
  Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
  java6:
  Indicates that a method declaration is intended to override a method declaration in a superclass. If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.
  两段说明一模一样,让人搞不清楚的是java6文档没有提到Override对interface的支持。
分类: java基础知识 标签:

OO的五大原则

2012年12月3日 没有评论

 

 
OO的五大原则是指SRP、OCP、LSP、DIP、ISP
1. SRP(Single Responsibility Principle 单一职责原则) 
所谓单一职责,就是一个设计元素只做一件事。
2. OCP :开闭原则
“对变更关闭;对扩展开放”。
3.LSP——里氏替换原则 
4.DIP 依赖倒置原则 
依赖倒置(Dependence Inversion Principle)原则讲的是:要依赖于抽象,不要依赖于具体。 
5.ISP 接口隔离原则 
使用多个专门的接口比使用单一的总接口要好。
 
分类: 项目管理 标签: