??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲色大成网站www永久网站,亚洲宅男天堂a在线,亚洲国产亚洲综合在线尤物http://www.tkk7.com/GavinMiao/category/49312.html我在仰望Qjava之上zh-cnWed, 11 Sep 2019 16:35:25 GMTWed, 11 Sep 2019 16:35:25 GMT60~码至高法则-高内聚低耦合http://www.tkk7.com/GavinMiao/archive/2019/09/11/434613.htmlGavinMiaoGavinMiaoWed, 11 Sep 2019 07:59:00 GMThttp://www.tkk7.com/GavinMiao/archive/2019/09/11/434613.htmlhttp://www.tkk7.com/GavinMiao/comments/434613.htmlhttp://www.tkk7.com/GavinMiao/archive/2019/09/11/434613.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/434613.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/434613.html阅读全文

GavinMiao 2019-09-11 15:59 发表评论
]]>
Jgoodies FormLayout 结http://www.tkk7.com/GavinMiao/archive/2012/09/29/388827.htmlGavinMiaoGavinMiaoSat, 29 Sep 2012 03:29:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/09/29/388827.htmlhttp://www.tkk7.com/GavinMiao/comments/388827.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/09/29/388827.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/388827.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/388827.html一、列与行的参数都׃个部分组成:寚w方式、固定尺寸、调整方式?
1.寚w方式Q?br />1Q列寚w有left, center, right, fill.默认fill
2Q行寚w有:top, center, bottom, fill. 其中fill表示填充x个区域。默认center?br />2.固定寸Q?br />pref表示preferred sizeQ适当大小Q即首选尺寸大?br />min表示minimum sizeQ?br />dlu 表示dialog unitsQ?br />px, pt, in, mm, cmQ分别表CPixel, Points, Inches, Millimeter, Centimeter?br />3. 调整方式:
二、CellConstraintsQ?br />cc.xywh(3, 1, 3, 1)Q表C?列,1行,colspan=3Qrowspan=1
三、FormLayoutQ?br />  1.FormLayout layout = new FormLayout(
   new ColumnSpec[]{
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC,
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC,
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC},
   new RowSpec[]{
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC,
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC,
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC
   }
  );
2.

FormLayout layout = new FormLayout( 
        "right:pref, 6dlu, 50dlu, 4dlu, center:50dlu", // columns
        "pref, 3dlu, pref, 3dlu, pref"); // rows   





参考文章:
http://hi.baidu.com/lijunwyf/item/a18d95f719ff01da6225d26f

GavinMiao 2012-09-29 11:29 发表评论
]]>
Vector见http://www.tkk7.com/GavinMiao/archive/2012/09/24/388406.htmlGavinMiaoGavinMiaoMon, 24 Sep 2012 00:49:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/09/24/388406.htmlhttp://www.tkk7.com/GavinMiao/comments/388406.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/09/24/388406.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/388406.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/388406.html例子Q?br />import java.util.*;
public class TestVector{
 public static void main(String[] args){
  Vector v = new Vector();
  v.add(null);
  v.add(new Integer(1));
  v.add("123");
  
  for(Enumeration e = v.elements();e.hasMoreElements();){
   System.out.println(e.nextElement());
  }
  v.insertElementAt("insert",2);
  v.setElementAt("insert",0);
  
  for(Enumeration e = v.elements();e.hasMoreElements();){
   System.out.println(e.nextElement());
  }
  
 }
}

l果Q?br />null
1
123

insert
1
insert
123
 
l论Q?br />vector中可以放入nullQ?br />vector可以攑օ不同cd的对象;
vector是同步的定w自增长的向量Q?br />


GavinMiao 2012-09-24 08:49 发表评论
]]>
String面试?/title><link>http://www.tkk7.com/GavinMiao/archive/2012/04/06/373497.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 06 Apr 2012 10:26:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2012/04/06/373497.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/373497.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2012/04/06/373497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/373497.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/373497.html</trackback:ping><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://www.tkk7.com/GavinMiao/archive/2012/04/06/373497.html'>阅读全文</a><img src ="http://www.tkk7.com/GavinMiao/aggbug/373497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2012-04-06 18:26 <a href="http://www.tkk7.com/GavinMiao/archive/2012/04/06/373497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp-java实现http://www.tkk7.com/GavinMiao/archive/2012/03/26/372732.htmlGavinMiaoGavinMiaoMon, 26 Mar 2012 10:03:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/03/26/372732.htmlhttp://www.tkk7.com/GavinMiao/comments/372732.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/03/26/372732.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/372732.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/372732.html1.jre下的rt.jar中sun.net.ftpClient
2.common net 中的ftp?br />二、ftp协议认识Q?br />参考规范:RFC 959
1.文g传输协议Qfile transfer protocol (ftp)
2.名词解释Q?br />DTPQ?div style="display: inline-block; ">数据传输q程
EORQ记录尾
PIQ协议解释器
NTVQ?div style="display: inline-block; ">|络虚拟l端
NVFSQ?div style="display: inline-block; ">|络虚拟文gpȝ
3.
控制q接是徏立在USER-PIT和SERVER-PI之间用于交换命o与应{的通信链\?br />4.
数据q接是传输数据的全双工连接。传输数据可以发生在服务器DTP和用户DTP之间也可以发生在两个服务器DTP之间?br />5.
数据q接只传输数据,控制q接传送命令和响应?br />6.
FTP使用Telnet协议q行控制q接
7.




参考文章:http://blog.csdn.net/williamzhou/article/details/215293 


GavinMiao 2012-03-26 18:03 发表评论
]]>
java中的位运应?/title><link>http://www.tkk7.com/GavinMiao/archive/2012/03/19/372204.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 19 Mar 2012 08:36:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2012/03/19/372204.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/372204.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2012/03/19/372204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/372204.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/372204.html</trackback:ping><description><![CDATA[1Q?a & 0xff 可得到a对应而二q制的最?位;<br />2Q左Un?-》表CZ?的Nơ方<br />3,  右移n?->表示除以2的Nơ方<img src ="http://www.tkk7.com/GavinMiao/aggbug/372204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-19 16:36 <a href="http://www.tkk7.com/GavinMiao/archive/2012/03/19/372204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java播放wav的基代码Q{载)http://www.tkk7.com/GavinMiao/archive/2012/03/14/371860.htmlGavinMiaoGavinMiaoWed, 14 Mar 2012 06:30:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/03/14/371860.htmlhttp://www.tkk7.com/GavinMiao/comments/371860.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/03/14/371860.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/371860.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/371860.htmlhttp://hi.baidu.com/breezedancer/blog/item/7eebb499680d8f086e068cb9.html 

import javax.sound.sampled.*;
import java.io.*;
public class TestMusic{
 
 private AudioFormat format;
    private byte[] samples;
 
 public static void main(String args[])throws Exception{
  TestMusic sound =new TestMusic("1.wav");
  InputStream stream =new ByteArrayInputStream(sound.getSamples());
        // play the sound
        sound.play(stream);
        // exit
        System.exit(0);
 }
 
    public TestMusic(String filename) {
        try {
            // open the audio input stream
            AudioInputStream stream =AudioSystem.getAudioInputStream(new File(filename));
            format = stream.getFormat();
            // get the audio samples
            samples = getSamples(stream);
        }
        catch (UnsupportedAudioFileException ex) {
            ex.printStackTrace();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
   }
   
   public byte[] getSamples() {
        return samples;
    }
   
     private byte[] getSamples(AudioInputStream audioStream) {
        // get the number of bytes to read
        int length = (int)(audioStream.getFrameLength() * format.getFrameSize());

        // read the entire stream
        byte[] samples = new byte[length];
        DataInputStream is = new DataInputStream(audioStream);
        try {
            is.readFully(samples);
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // return the samples
        return samples;
    }
 
 public void play(InputStream source) {

        // use a short, 100ms (1/10th sec) buffer for real-time
        // change to the sound stream
        int bufferSize = format.getFrameSize() *
            Math.round(format.getSampleRate() / 10);
        byte[] buffer = new byte[bufferSize];

        // create a line to play to
        SourceDataLine line;
        try {
            DataLine.Info info =
                new DataLine.Info(SourceDataLine.class, format);
            line = (SourceDataLine)AudioSystem.getLine(info);
            line.open(format, bufferSize);
        }
        catch (LineUnavailableException ex) {
            ex.printStackTrace();
            return;
        }

        // start the line
        line.start();

        // copy data to the line
        try {
            int numBytesRead = 0;
            while (numBytesRead != -1) {
                numBytesRead =
                    source.read(buffer, 0, buffer.length);
                if (numBytesRead != -1) {
                   line.write(buffer, 0, numBytesRead);
                }
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // wait until all data is played, then close the line
        line.drain();
        line.close();

    }


}



GavinMiao 2012-03-14 14:30 发表评论
]]>
不同厂商JDK下蝲|址http://www.tkk7.com/GavinMiao/archive/2012/03/08/371532.htmlGavinMiaoGavinMiaoThu, 08 Mar 2012 07:30:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/03/08/371532.htmlhttp://www.tkk7.com/GavinMiao/comments/371532.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/03/08/371532.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/371532.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/371532.html
各厂商JDK官网下蝲地址Q?nbsp;
1、Oracle JDKQ介质分32位和64位,分Linux、Solaris、Windowsq_ 
http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html 
2、HP JDKQ介质不?2位和64位,分PA和IAq_ 
https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=HPUXJDKJRE60 
3、IBM JDKQ介质分32位和64?nbsp;
https://www.ibm.com/developerworks/java/jdk/aix/service.html#i1 


参考文章:
http://shuwen.iteye.com/blog/1149992


GavinMiao 2012-03-08 15:30 发表评论
]]>
throws与throw的区?/title><link>http://www.tkk7.com/GavinMiao/archive/2012/03/06/371309.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Tue, 06 Mar 2012 01:48:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2012/03/06/371309.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/371309.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2012/03/06/371309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/371309.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/371309.html</trackback:ping><description><![CDATA[1.throw是语句抛Z个异常,throws是方法抛出异常;<br />2.throws可声明多个异常,用逗号分割Q?br />3.throws可单独用,throw必须与try-catch-finally或throws搭配使用Q?br />4.throws表示可能抛出哪些异常Qthrow是必定抛个异常;<img src ="http://www.tkk7.com/GavinMiao/aggbug/371309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-06 09:48 <a href="http://www.tkk7.com/GavinMiao/archive/2012/03/06/371309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLASS_PATH认识http://www.tkk7.com/GavinMiao/archive/2012/02/22/370517.htmlGavinMiaoGavinMiaoWed, 22 Feb 2012 05:51:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/02/22/370517.htmlhttp://www.tkk7.com/GavinMiao/comments/370517.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/02/22/370517.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/370517.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/370517.html注意Q?br />1.一般设|:
CLASS_PATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
2.jdk 1.5以上版本可以不用讄此环境变量;

GavinMiao 2012-02-22 13:51 发表评论
]]>
Q{载)System.getProperty()http://www.tkk7.com/GavinMiao/archive/2012/02/13/369883.htmlGavinMiaoGavinMiaoMon, 13 Feb 2012 08:52:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/02/13/369883.htmlhttp://www.tkk7.com/GavinMiao/comments/369883.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/02/13/369883.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/369883.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/369883.html阅读全文

GavinMiao 2012-02-13 16:52 发表评论
]]>
java相关下蝲|址http://www.tkk7.com/GavinMiao/archive/2012/01/18/368691.htmlGavinMiaoGavinMiaoWed, 18 Jan 2012 03:35:00 GMThttp://www.tkk7.com/GavinMiao/archive/2012/01/18/368691.htmlhttp://www.tkk7.com/GavinMiao/comments/368691.htmlhttp://www.tkk7.com/GavinMiao/archive/2012/01/18/368691.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/368691.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/368691.html
http://sourceforge.net/projects/hibernate/files/
struts
1Q?br />


GavinMiao 2012-01-18 11:35 发表评论
]]>
面utf-8Qjsp提交中文action中ؕ?/title><link>http://www.tkk7.com/GavinMiao/archive/2011/11/25/364826.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 25 Nov 2011 07:11:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2011/11/25/364826.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/364826.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2011/11/25/364826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/364826.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/364826.html</trackback:ping><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://www.tkk7.com/GavinMiao/archive/2011/11/25/364826.html'>阅读全文</a><img src ="http://www.tkk7.com/GavinMiao/aggbug/364826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2011-11-25 15:11 <a href="http://www.tkk7.com/GavinMiao/archive/2011/11/25/364826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转蝲Qjava断言Assertionhttp://www.tkk7.com/GavinMiao/archive/2011/11/25/364813.htmlGavinMiaoGavinMiaoFri, 25 Nov 2011 05:20:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/11/25/364813.htmlhttp://www.tkk7.com/GavinMiao/comments/364813.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/11/25/364813.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/364813.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/364813.html阅读全文

GavinMiao 2011-11-25 13:20 发表评论
]]>
操控pdfhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359824.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:29:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359824.htmlhttp://www.tkk7.com/GavinMiao/comments/359824.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359824.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359824.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359824.html

GavinMiao 2011-09-30 01:29 发表评论
]]>
操控xlshttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359825.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:29:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359825.htmlhttp://www.tkk7.com/GavinMiao/comments/359825.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359825.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359825.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359825.html

GavinMiao 2011-09-30 01:29 发表评论
]]>
操作jsonhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359821.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:27:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359821.htmlhttp://www.tkk7.com/GavinMiao/comments/359821.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359821.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359821.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359821.html待箋.......

GavinMiao 2011-09-30 01:27 发表评论
]]>
操作propertieshttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359822.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:27:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359822.htmlhttp://www.tkk7.com/GavinMiao/comments/359822.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359822.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359822.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359822.html

GavinMiao 2011-09-30 01:27 发表评论
]]>
操作xmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359820.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:25:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359820.htmlhttp://www.tkk7.com/GavinMiao/comments/359820.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359820.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359820.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359820.html

GavinMiao 2011-09-30 01:25 发表评论
]]>
转蝲QJAVA异常机制介绍/如何正确的进行JAVA异常处理http://www.tkk7.com/GavinMiao/archive/2011/09/30/359819.htmlGavinMiaoGavinMiaoThu, 29 Sep 2011 17:08:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359819.htmlhttp://www.tkk7.com/GavinMiao/comments/359819.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/30/359819.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359819.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359819.html

 文章来源Q?br /> 作者:Maverick
 blogQ?/span>http://blog.csdn.net/zhaohuabing  

1  引言
在JAVA语言出现以前Q传l的异常处理方式多采用返回值来标识E序出现的异常情况,q种方式虽然为程序员所熟?zhn)Q但却有多个坏处。首先,一个API可以q回L的返回|而这些返回值本wƈ不能解释该返回值是否代表一个异常情况发生了和该异常的具体情况,需要调用API的程序自己判断ƈ解释q回值的含义。其ơ,q没有一U机制来保证异常情况一定会得到处理Q调用程序可以简单的忽略该返回|需要调用API的程序员CL返回值ƈ处理异常情况。这U方式还让程序代码变得晦涩冗长,当进行IO操作{容易出现异常情늚处理Ӟ你会发现代码的很大部分用于处理异常情늚switch分支Q程序代码的可读性变得很差?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />上面提到的问题,JAVA的异常处理机制提供了很好的解x案。通过抛出JDK预定义或者自定义的异?能够表明E序中出C什么样的异常情况;而且JAVA的语a机制保证了异怸定会得到恰当的处理;合理的用异常处理机Ӟ会让E序代码清晰易懂?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />2 JAVA异常的处理机?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    当程序中抛出一个异常后Q程序从E序中导致异常的代码处蟩出,java虚拟机检寻扑֒try关键字匹配的处理该异常的catch块,如果扑ֈQ将控制权交到catch块中的代码,然后l箋往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线E的所属的ThreadGroup的uncaughtExceptionҎ(gu)被调用后Q遇到异常的当前U程被中止?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />3 JAVA异常的类层次
JAVA异常的类层次如下图所C:

? JAVA异常的类层次
Throwable是所有异常的基类Q程序中一般不会直接抛出Throwable对象QException和Error是Throwable的子c,Exception下面又有RuntimeException和一般的Exception两类。可以把JAVA异常分ؓ三类Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />        W一cLErrorQError表示E序在运行期间出C十分严重、不可恢复的错误Q在q种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一Uunchecked Exception,~译器不会检查Error是否被处?在程序中不用捕获Errorcd的异常;一般情况下Q在E序中也不应该抛出Errorcd的异常?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />        W二cLRuntimeException, RuntimeException 是一Uunchecked ExceptionQ即表示~译器不会检查程序是否对RuntimeException作了处理Q在E序中不必捕获RuntimExceptioncd的异常,也不必在Ҏ(gu)体声明抛出RuntimeExceptioncRRuntimeException发生的时候,表示E序中出C~程错误Q所以应该找出错误修改程序,而不是去捕获RuntimeException?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />        W三cL一般的checked Exception,q也是在~程中用最多的Exception,所有承自Exceptionq且不是RuntimeException的异帔R是checked ExceptionQ如?中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理,~译器会Ҏ(gu)作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exceptionq行处理Q不然不能通过~译。checked Exception用于以下的语义环境:

Q?Q?nbsp;该异常发生后是可以被恢复的,如一个Internetq接发生异常被中止后Q可以重新连接再q行后箋操作?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;E序依赖于不可靠的外部条Ӟ该依赖条件可能出错,如系lIO?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;该异常发生后q不会导致程序处理错误,q行一些处理后可以l箋后箋操作?/p>

4 JAVA异常处理中的注意事项
合理使用JAVA异常机制可以使程序健壮而清晎ͼ但不q的是,JAVA异常处理机制常常被错误的使用Q下面就是一些关于Exception的注意事:

1Q?nbsp;不要忽略checked Exception
L下面的代码:
try
{
  method1();  //method1抛出ExceptionA
}
catch(ExceptionA e)
{
    e.printStackTrace();
}
上面的代码似乎没有什么问题,捕获异常后将异常打印Q然后l执行。事实上在catch块中对发生的异常情况q没有作M处理(打印异常不能是算是处理异常,因ؓ在程序交付运行后调试信息没有什么用处了)。这L序虽然能够l执行,但是׃q里的操作已l发生异常,会D以后的操作ƈ不能按照预期的情况发展下去,可能D两个l果Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />一是由于这里的异常D在程序中别的地方抛出一个异常,q种情况会ɽE序员在调试时感到迷惑,因ؓ新的异常抛出的地方ƈ不是E序真正发生问题的地方,也不是发生问题的真正原因Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />另外一个是E序l箋q行Qƈ得出一个错误的输出l果Q这U问题更加难以捕捉,因ؓ很可能把它当成一个正的输出?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />那么应该如何处理呢,q里有四个选择Q?/p>

Q?Q?nbsp;处理异常Q进行修复以让程序l执行?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;重新抛出异常Q在对异常进行分析后发现q里不能处理它,那么重新抛出异常Q让调用者处理?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;异常{换ؓ用户可以理解的自定义异常再抛出,q时应该注意不要丢失原始异常信息Q见5Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;不要捕获异常?/p>

因此Q当捕获一个unchecked Exception的时候,必须对异常进行处理;如果认ؓ不必要在q里作处理,׃要捕莯异常Q在Ҏ(gu)体中声明Ҏ(gu)抛出异常Q由上层调用者来处理该异常?/p>

2Q?nbsp;不要一ơ捕h有的异常
L下面的代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(Exception e)
{
    ……
}
q是一个很׃h的方案,代码中用一个catch子句捕获了所有异常,看上d而且z,事实上很多代码也是这样写的。但q里有两个潜在的~陷Q一是针对try块中抛出的每UExceptionQ很可能需要不同的处理和恢复措施,而由于这里只有一个catch块,分别处理׃能实现。二是try块中q可能抛出RuntimeException,代码中捕获了所有可能抛出的RuntimeException而没有作M处理Q掩盖了~程的错误,会导致程序难以调试?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />下面是改正后的正代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(ExceptionA e)
{
    ……
}
catch(ExceptionB e)
{
    ……
}
catch(ExceptionC e)
{
    ……
}


3Q?nbsp;使用finally块释放资?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    finally关键字保证无论程序用Q何方式离开try块,finally中的语句都会被执行。在以下三种情况下会q入finally块:
Q?Q?nbsp;try块中的代码正常执行完毕?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;在try块中抛出异常?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;在try块中执行return、break、continue?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />因此Q当你需要一个地Ҏ(gu)执行在Q何情况下都必L行的代码Ӟ可以将q些
代码攑օfinally块中。当你的E序中用了外界资源,如数据库q接Q文件等Q必d释放q些资源的代码写入finally块中?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />必须注意的是Q在finally块中不能抛出异常。JAVA异常处理机制保证无论在Q何情况下必须先执行finally块然后在dtry块,因此在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后Q再向外抛出异常。如果在finally块中抛出异常Qtry块捕捉的异常׃能抛出,外部捕捉到的异常是finally块中的异怿息,而try块中发生的真正的异常堆栈信息则丢׃?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />L下面的代码:

Connection  con = null;
try
{
    con = dataSource.getConnection();
    ……
}
catch(SQLException e)
{
    ……
    throw e;//q行一些处理后再将数据库异常抛出给调用者处?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}
finally
{
    try
    {
        con.close();
    }
    catch(SQLException e)
{
    e.printStackTrace();
    ……
}
}
q行E序后,调用者得到的信息如下
java.lang.NullPointerException
 at myPackage.MyClass.method1(methodl.java:266)
而不是我们期望得到的数据库异常。这是因里的con是null的关p,在finally语句中抛ZNullPointerException,在finally块中增加对con是否为null的判断可以避免生这U情c?/p>

4Q?nbsp;异常不能影响对象的状?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />异常产生后不能媄响对象的状态,q是异常处理中的一条重要规则?在一个函?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />中发生异常后Q对象的状态应该和调用q个函数之前保持一_以确保对象处于正的状态中?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />如果对象是不可变对象(不可变对象指调用构造函数创建后׃能改变的对象Q即
    创徏后没有Q何方法可以改变对象的状?Q那么异常发生后对象状态肯定不会改变。如果是可变对象Q必d~程中注意保证异怸会媄响对象状态。有三个Ҏ(gu)可以辑ֈq个目的Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;可能生异常的代码和改变对象状态的代码分开Q先执行可能产生异常的代码,如果产生异常Q就不执行改变对象状态的代码?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;对不Ҏ(gu)分离产生异常代码和改变对象状态代码的Ҏ(gu)Q定义一个recoverҎ(gu)Q在异常产生后调用recoverҎ(gu)修复被改变的cd量,恢复Ҏ(gu)调用前的cȝ态?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Q?Q?nbsp;在方法中使用对象的拷贝,q样当异常发生后Q被影响的只是拷贝,对象本n不会受到影响?/p>

5Q?nbsp;丢失的异?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />L下面的代码:
public void method2()
{
try
{
    ……
    method1();  //method1q行了数据库操作
}
catch(SQLException e)
{
    ……
    throw new MyException(“发生了数据库异常:”+e.getMessage);
}
}
public void method3()
{
    try
{
    method2();
}
catch(MyException e)
{
    e.printStackTrace();
    ……
}
}
上面method2的代码中Qtry块捕获method1抛出的数据库异常SQLException后,抛出了新的自定义异常MyException。这D代码是否ƈ没有什么问题,但看一下控制台的输出:
MyException:发生了数据库异常Q对象名U?'MyTable' 无效?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />at MyClass.method2(MyClass.java:232)
at MyClass.method3(MyClass.java:255)
原始异常SQLException的信息丢׃Q这里只能看到method2里面定义的MyException的堆栈情况;而method1中发生的数据库异常的堆栈则看不到Q如何排错呢Q只有在method1的代码行中一行行d找数据库操作语句了,祷method1的方法体短一些吧?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />JDK的开发者们也意识到了这个情况,在JDK1.4.1中,Throwablecd加了两个构造方?public Throwable(Throwable cause)和public Throwable(String message,Throwable cause)Q在构造函C传入的原始异常堆栈信息将会在printStackTraceҎ(gu)中打印出来。但对于q在使用JDK1.3的程序员Q就只能自己实现打印原始异常堆栈信息的功能了。实现过E也很简单,只需要在自定义的异常cM增加一个原始异常字D,在构造函C传入原始异常Q然后重载printStackTraceҎ(gu)Q首先调用类中保存的原始异常的printStackTraceҎ(gu)Q然后再调用super.printStackTraceҎ(gu)可以打印出原始异常信息了。可以这样定义前面代码中出现的MyExceptionc:
public class MyExceptionextends Exception
{
    //构造函?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />    public SMException(Throwable cause)
    {
        this.cause_ = cause;
    }

    public MyException(String s,Throwable cause)
    {
        super(s);
        this.cause_ = cause;
    }
    //重蝲printStackTraceҎ(gu)Q打印出原始异常堆栈信息
    public void printStackTrace()
    {
        if (cause_ != null)
        {
            cause_.printStackTrace();
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintStream s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintWriter s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }
     //原始异常
     private Throwable cause_;
}

6Q?nbsp;不要使用同时使用异常机制和返回值来q行异常处理
下面是我们项目中的一D代?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try
{
    doSomething(); 
}
catch(MyException e)
{
if(e.getErrcode == -1)
{
    ……
}
if(e.getErrcode == -2)
{
   ……
}
……
}
假如在过一D|间后来看q段代码Q你能弄明白是什么意思吗Q؜合用JAVA异常处理机制和返回gɽE序的异常处理部分变?#8220;丑陋不堪”Qƈ难以理解。如果有多种不同的异常情况,定义多U不同的异常Q而不要像上面代码那样l合使用Exception和返回倹{?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />修改后的正确代码如下Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try
{
    doSomething();  //抛出MyExceptionA和MyExceptionB
}
catch(MyExceptionA e)
{
……
}
catch(MyExceptionB e)
{
    ……
}


7Q?nbsp;不要让try块过于庞?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Z省事的目的,很多Z惯于用一个庞大的try块包含所有可能生异常的代码Q?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />q样有两个坏处:
阅读代码的时候,在try块冗长的代码中,不容易知道到底是哪些代码会抛出哪些异常,不利于代码维护?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />使用try捕获异常是以E序执行效率ZLQ将不需要捕获异常的代码包含在try块中Q媄响了代码执行的效率?/p>

GavinMiao 2011-09-30 01:08 发表评论
]]>
J2EE学习|址U篏http://www.tkk7.com/GavinMiao/archive/2011/09/27/359626.htmlGavinMiaoGavinMiaoTue, 27 Sep 2011 08:29:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/27/359626.htmlhttp://www.tkk7.com/GavinMiao/comments/359626.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/27/359626.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359626.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359626.html阅读全文

GavinMiao 2011-09-27 16:29 发表评论
]]>
获得一个随机数http://www.tkk7.com/GavinMiao/archive/2011/09/23/359329.htmlGavinMiaoGavinMiaoFri, 23 Sep 2011 02:43:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/23/359329.htmlhttp://www.tkk7.com/GavinMiao/comments/359329.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/23/359329.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/359329.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/359329.html阅读全文

GavinMiao 2011-09-23 10:43 发表评论
]]>
谈谈memory leakhttp://www.tkk7.com/GavinMiao/archive/2011/09/07/358176.htmlGavinMiaoGavinMiaoWed, 07 Sep 2011 06:04:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/07/358176.htmlhttp://www.tkk7.com/GavinMiao/comments/358176.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/07/358176.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/358176.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/358176.html
参考文章:

malloc/free和new/delete必须成对出现Q以防止内存泄露

一、什么时候垃圑֛Ӟ
单说Q?br />
当一块内存被jvm通过它自q认证机制认ؓ不再被调用的时候才会在
它认为合适的时机q行回收Q?br />
具体_

The job of the garbage collector is to find objects that are no longer needed by an application and to remove them when they can no longer be accessed or referenced. The garbage collector starts at the root nodes, classes that persist throughout the life of a Java application, and sweeps through all of the nodes that are referenced. As it traverses the nodes, it keeps track of which objects are actively being referenced. Any classes that are no longer being referenced are then eligible to be garbage collected. The memory resources used by these objects can be returned to the Java virtual machine (JVM) when the objects are deleted.

So it is true that Java code does not require the programmer to be responsible for memory management cleanup, and that it automatically garbage collects unused objects. However, the key point to remember is that an object is only counted as being unused when it is no longer referenced.

垃圾攉器的工作是找到由一个应用程序不再需要的对象Q在他们不再被访问或引用其删除?/font>垃圾攉器从根节炏V在整个Java应用的生命中存在的类
开?/span>Qƈ通过扫描所有被引用的节炏V?/font>׃它遍历的节点Q它跟踪哪些对象正在U极引用?/font>M不再被引用的的类Q然后才有资D垃圾攉?div style="display: inline-block; ">当对象被删除Ӟ他们所占用的内存资源,才被Java虚拟机(JVMQ回收?br />二?a title="什么样的java代码Ҏ(gu)memory leak?" style="color: #000000; text-decoration: none; ">什么样的java代码Ҏ(gu)memory leak?
1.
首先一U情冉|collection或者是map一直被put数据Q没有机会removeQ导致OutOfMemoryError。尤其是当collection或者是map被设计成static变量的时候,它就是个global性质的变量,很可能永q不会被赋ؓnull。这也是不徏议用static变量的一个原因?/span>
2.
在listener的模式下Q如果listener一直在注册register而没有机会remove也会DOutOfMemoryError。其实listener也是一个list的结构,本质上是一L。很多listener是以匿名c被构造和注册到被监听cM面去的, 而被监听cd果也没有正确remove注册的listener的话也会DOutOfMemoryError?br />

待箋...........


GavinMiao 2011-09-07 14:04 发表评论
]]>
JSP、servlet、strutsU程安全问题分析http://www.tkk7.com/GavinMiao/archive/2011/09/02/357796.htmlGavinMiaoGavinMiaoFri, 02 Sep 2011 02:30:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/02/357796.htmlhttp://www.tkk7.com/GavinMiao/comments/357796.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/02/357796.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/357796.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/357796.html
Servlet之所以比CGI效率高就是因为Servlet是多U程的?/div>Servlet规范已经声明Servlet不是U程安全?
JSP中用声明的变量是Servlet的实例变?不是U程安全?其他都是U程安全的?/span>

那么怎样才能是Servlet安全?凡是多个U程可以׃n的就不要使用(实例变量+cd?,p么简单。也可以使用synchronized同步Ҏ(gu),但是q样效率不高,q可以用单U程模型,q样的话效率更低了,100个请求同时来的时候就要实例化100个实例?/p>

Ҏ(gu)中的临时变量是不会媄响线E安全的,因ؓ他们是在栈上分配I间,而且每个U程都有自己U有的栈I间?/p>

ȝQ线E安全问题主要是由实例变量造成?不管在Servletq是JSP,或者在Struts的Action里面,不要使用实例变量,
MҎ(gu)里面都不要出现实例变?你的E序是U程安全的?/span>


在Servlet/JSP中的几种变量cd
源自 : http://www.javaresearch.org/article/8465.htm
一、在Servlet/JSP中的几种变量cd
在编写Servlet/JSPE序Ӟ对实例变量一定要心使用。因为实例变量是非线E安全的?/div>
在Servlet/JSP中,变量可以归ؓ下面的几c:
1. cd?/div>
requestQresponseQsessionQconfigQapplicationQ以及JSP面内置的page, pageContext?/div>
其中除了application外,其它都是U程安全的?/div>
2. 实例变量
实例变量是实例所有的Q在堆中分配。在Servlet/JSP容器中,一般仅实例化一个Servlet/JSP实例Q?/div>
启动多个该实例的U程来处理请求。而实例变量是该实例所有的U程所׃nQ所以,实例变量不是U程安全的?/div>
3. 局部变?/div>
局部变量在堆栈中分配,因ؓ每一个线E有自己的执行堆栈,所以,局部变量是U程安全的?/div>
二、在Servlet/JSP中的多线E同步问?/div>
在JSP中,使用实例变量要特别}慎。首先请看下面的代码Q?/div>
// instanceconcurrenttest.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%!
    //定义实例变量
    String username;
    String password;
    java.io.PrintWriter output;
%>
<%
    //从request中获取参?/div>
    username = request.getParameter("username");
    password = request.getParameter("password");
    output = response.getWriter();
    showUserInfo();    
%>
<%!
    public void showUserInfo() {
        //ZH出q发问题Q在q儿首先执行一个费时操?/div>
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        
        output.println(Thread.currentThread().getName() + "<br>");
        output.println("username:" + username + "<br>");
        output.println("password:" + password + "<br>");
    }
%>
在这个页面中Q首先定义了两个实例变量Qusername和password?/div>
然后在从request中获取这两个参数Qƈ调用showUserInfo()Ҏ(gu)请求用L信息回显在该客户的浏览器上?/div>
在一个用戯问是Q不存在问题?/div>
但在多个用户q发讉KӞ׃出现其它用户的信息显C在另外一些用L览器上的问题。这是一个严重的问题?/div>
ZH出q发问题Q便于测试、观察,我们在回昄户信息时执行了一个模拟的Ҏ(gu)操作Q?/div>
比如Q下面的两个用户同时讉KQ可以启动两个IE览器,或者在两台机器上同时访问)Q?/div>
aQ?   http://localhost:8080/instanceconcurrenttest.jsp?username=a&password=123
bQ?   http://localhost:8080/instanceconcurrenttest.jsp?username=b&password=456
如果a点击链接后,b再点击链接,那么Qa返回一个空白屏q,b则得到a以及b两个U程的输出。请看下面的屏幕截图Q?/div>
 
从运行结果的截图上可以看刎ͼWeb服务器启动了两个U程分别来处理来自a和b的请求,但是在a却得C个空白的屏幕。这是因Z面程序中的output, username和password都是实例变量Q是所有线E共享的。在a讉K该页面后Q将output讄为a的输出,username,password分别|ؓa的信息,而在a执行printUserInfo()输出username和password信息前,b又访问了该页面,把username和password|ؓ了b的信息,q把输出output指向Cb。随后a的线E打印时Q就打印Cb的屏q了Qƈ且,a的用户名和密码也被b的取代。请参加下图所C:
而实际程序中Q由于设|实例变量,使用实例变量q两个时间点非常接近Q?/div>
所以,像本例的同步问题q没有这么突出,可能会偶出玎ͼ但这却更加具有危险性,也更加难于调试?/div>
同样Q对于Servlet也存在实例变量的多线E问题,L上面面的Servlet版:
// InstanceConcurrentTest.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.PrintWriter;
public class InstanceConcurrentTest extends HttpServlet 
{
    String username;
    String password;
    PrintWriter out;
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException,java.io.IOException
    {
        //从request中获取参?/div>
        username = request.getParameter("username");
        password = request.getParameter("password");
        System.out.println(Thread.currentThread().getName() + 
                     " | set username:" + username);
        out = response.getWriter();
        showUserInfo();    
    }
    public void showUserInfo() {
        //ZH出q发问题Q在q儿首先执行一个费时操?/div>
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        out.println("thread:" + Thread.currentThread().getName());
        out.println("username:"+ username);
        out.println("password:" + password);
    }
}
三、解x?/div>
1. 以单U程q行Servlet/JSP
在JSP中,通过讄Q?lt;%@ page isThreadSafe="false" %>Q在Servlet中,
通过实现javax.servlet.SingleThreadModelQ?/div>
此时Web容器保证JSP或Servlet实例以单U程方式q行?/div>
重要提示Q在试中发玎ͼTomcat 4.1.17不能正确支持isThreadSafe属性,
所以,指定isTheadSafe为false后,在Tomcat 4.1.17中仍然出现多U程问题Q这是Tomcat 4.1.17的Bug。在Tomcat 3.3.1和Resin 2.1.5中测试通过?/div>
2. 去除实例变量Q通过参数传?/div>
从上面的分析可见Q应该在Servlet/JSP中尽量避免用实例变量?/div>
比如Q下面的修正代码Q去除了实例变量Q通过定义局部变量,q参数进行传递?/div>
q样Q由于局部变量是在线E的堆栈中进行分配的Q所以是U程安全的?/div>
不会出现多线E同步的问题。代码如下:
<%@ page contentType="text/html;charset=GBK" %>
<%
    //使用局部变?/div>
    String username;
    String password;
    java.io.PrintWriter output;
    //从request中获取参?/div>
    username = request.getParameter("username");
    password = request.getParameter("password");
    output = response.getWriter();
    showUserInfo(output, username, password);    
%>
<%!
    public void showUserInfo(java.io.PrintWriter _output, 
         String _username, String _password) {
        //ZH出q发问题Q在q儿首先执行一个费时操?/div>
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        
        _output.println(Thread.currentThread().getName() + "<br>");
        _output.println("username:" + _username + "<br>");
        _output.println("password:" + _password + "<br>");
    }
%>
注:有的资料上指出在printUserInfo()Ҏ(gu)或者实例变量的相关操作语句上用synchronized关键字进行同步,
但这样ƈ不能解决多线E的问题。因为,q样虽然可以使对实例变量的操作代码进行同步,
但ƈ不能L一个线E用另外一个线E修改后?#8220;脏的”实例变量?/div>
所以,除了降低q行效率外,不会起到预期效果?/div>


待箋...............


GavinMiao 2011-09-02 10:30 发表评论
]]>JVMcd载初始化学习W记(转蝲)http://www.tkk7.com/GavinMiao/archive/2011/09/01/357739.htmlGavinMiaoGavinMiaoThu, 01 Sep 2011 07:09:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/01/357739.htmlhttp://www.tkk7.com/GavinMiao/comments/357739.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/01/357739.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/357739.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/357739.html阅读全文

GavinMiao 2011-09-01 15:09 发表评论
]]>
Java内存溢出的详l解x案(转蝲Q?/title><link>http://www.tkk7.com/GavinMiao/archive/2011/09/01/357737.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 01 Sep 2011 06:46:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2011/09/01/357737.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/357737.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2011/09/01/357737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/357737.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/357737.html</trackback:ping><description><![CDATA[<div>文章来源Q?a >http://developer.51cto.com/art/200906/129346.htm<br /><div style="display: inline-block; "><div><div></div><div>一、内存溢出类?/div><div></div><div>1、java.lang.OutOfMemoryError: PermGen space</div><div></div><div>JVM理两种cd的内存,堆和非堆。堆是给开发h员用的上面说的就是,是在JVM启动时创建;非堆是留lJVM自己用的Q用来存攄的信息的。它和堆不同Q运行期内GC不会释放I间。如果web app用了大量的第三方jar或者应用有太多的class文g而恰好MaxPermSize讄较小Q超Z也会Dq块内存的占用过多造成溢出Q或者tomcat热部|时侯不会清理前面加载的环境Q只会将context更改为新部v的,非堆存的内容׃来多?/div><div></div><div>PermGen space的全U是Permanent Generation space,是指内存的永久保存区域,q块内存主要是被JVM存放Class和Meta信息?Class在被Loader时就会被攑ֈPermGen space中,它和存放cd?Instance)的Heap区域不同,GC(Garbage Collection)不会在主E序q行期对PermGen spaceq行清理Q所以如果你的应用中有很CLASS的话,很可能出现PermGen space错误Q这U错误常见在web服务器对JSPq行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大超q了jvm默认的大?4M)那么׃产生此错误信息了?nbsp;</div><div>一个最佳的配置例子Q?l过本h验证Q自从用此配|之后,再未出现qtomcatL的情?</div><div></div><div>set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m</div><div></div><div>2、java.lang.OutOfMemoryError: Java heap space</div><div></div><div>W一U情冉|个补充,主要存在问题是出现在这个情况中。其默认I间(?Xms)是物理内存的1/64Q最大空?-Xmx)是物理内存的1/4。如果内存剩余不?0Q,JVM׃增大堆到Xmx讄的|内存剩余过70Q,JVM׃减小堆到Xms讄的倹{所以服务器的Xmx和Xms讄一般应该设|相同避免每ơGC后都要调整虚拟机堆的大小。假讄理内存无限大Q那么JVM内存的最大D操作pȝ有关Q一?2位机?.5g?g之间Q?4位的׃会有限制了?/div><div></div><div>注意Q如果Xms过了Xmx|或者堆最大值和非堆最大值的d过了物理内存或者操作系l的最大限刉会引h务器启动不v来?/div><div></div><div>垃圾回收GC的角?/div><div></div><div>JVM调用GC的频度还是很高的Q主要两U情况下q行垃圾回收Q?/div><div></div><div>当应用程序线E空Ԍ另一个是java内存堆不xQ会不断调用GCQ若q箋回收都解决不了内存堆不的问题时Q就会报out of memory错误。因个异常根据系l运行环境决定,所以无法预期它何时出现?/div><div></div><div>Ҏ(gu)GC的机ӞE序的运行会引vpȝq行环境的变化,增加GC的触发机会?/div><div></div><div>Z避免q些问题Q程序的设计和编写就应避免垃圑֯象的内存占用和GC的开销。显C用System.GC()只能JVM需要在内存中对垃圾对象q行回收Q但不是必须马上回收Q?/div><div></div><div>一个是q不能解军_存资源耗空的局面,另外也会增加GC的消耗?/div><div></div><div>二、JVM内存区域l成</div><div></div><div>单的说java中的堆和?/div><div></div><div>java把内存分两种Q一U是栈内存,另一U是堆内?/div><div></div><div>1。在函数中定义的基本cd变量和对象的引用变量都在函数的栈内存中分配;</div><div></div><div>2。堆内存用来存放由new创徏的对象和数组</div><div></div><div>在函敎ͼ代码块)中定义一个变量时Qjava在栈中个变量分配内存空_当超q变量的作用域后Qjava会自动释放掉变量所分配的内存空_在堆中分配的内存由java虚拟机的自动垃圾回收器来理</div><div></div><div>堆的优势是可以动态分配内存大,生存期也不必事先告诉~译器,因ؓ它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢Q?/div><div></div><div>栈的优势是存取速度比堆要快Q缺Ҏ(gu)存在栈中的数据大与生存期必L定的无灉|性?/div><div></div><div>java堆分Z个区QNew、Old和Permanent</div><div></div><div>GC有两个线E:</div><div></div><div>新创建的对象被分配到New区,当该填满时会被GC辅助U程UdOld区,当OldZ填满了会触发GCȝE遍历堆内存里的所有对象。Old区的大小{于Xmx减去-Xmn</div><div></div><div>java栈存?/div><div></div><div>栈调_参数?UseDefaultStackSize -Xss256KQ表C每个线E可甌256k的栈I间</div><div></div><div>每个U程都有他自qStack</div><div></div><div>三、JVM如何讄虚拟内存</div><div></div><div>提示Q在JVM中如?8Q的旉是用于GC且可用的Heap size 不2Q的时候将抛出此异怿息?/div><div></div><div>提示QHeap Size 最大不要超q可用物理内存的80Q,一般的要将-Xms?Xmx选项讄为相同,?Xmn?/4?Xmx倹{?/div><div></div><div>提示QJVM初始分配的内存由-Xms指定Q默认是物理内存?/64QJVM最大分配的内存?Xmx指定Q默认是物理内存?/4?/div><div></div><div>默认IZ堆内存小?0%ӞJVM׃增大堆直?Xmx的最大限ӞIZ堆内存大?0%ӞJVM会减堆直到-Xms的最限制。因此服务器一般设|?Xms?Xmx相等以避免在每次GC 后调整堆的大?/div><div></div><div>提示Q假讄理内存无限大的话QJVM内存的最大D操作pȝ有很大的关系?/div><div></div><div>单的说就32位处理器虽然可控内存I间?GB,但是具体的操作系l会l一个限Ӟ</div><div></div><div>q个限制一般是2GB-3GBQ一般来说Windowspȝ下ؓ1.5G-2GQLinuxpȝ下ؓ2G-3GQ,?4bit以上的处理器׃会有限制?/div><div></div><div>提示Q注意:如果Xms过了Xmx|或者堆最大值和非堆最大值的d过了物理内存或者操作系l的最大限刉会引h务器启动不v来?/div><div></div><div>提示Q设|NewSize、MaxNewSize相等Q?new"的大最好不要大?old"的一半,原因是old区如果不够大会频J的触发"? GC Q大大降低了性能</div><div></div><div>JVM使用-XX:PermSize讄非堆内存初始|默认是物理内存的1/64Q?/div><div></div><div>由XX:MaxPermSize讄最大非堆内存的大小Q默认是物理内存?/4?/div><div></div><div>解决Ҏ(gu)Q手动设|Heap size</div><div></div><div>修改TOMCAT_HOME/bin/catalina.bat</div><div></div><div>?#8220;echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:</div><div></div><div>JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"</div><div></div><div>四、性能查工具?/div><div></div><div>定位内存泄漏Q?/div><div></div><div>JProfiler工具主要用于查和跟踪pȝQ限于Java开发的Q的性能。JProfiler可以通过时时的监控系l的内存使用情况Q随时监视垃圑֛ӞU程q行状况{手D,从而很好的监视JVMq行情况及其性能?/div><div></div><div>1. 应用服务器内存长期不合理占用Q内存经常处于高位占用,很难回收C位;</div><div></div><div>2. 应用服务器极ZE_Q几乎每两天重新启动一ơ,有时甚至每天重新启动一ơ;</div><div></div><div>3. 应用服务器经常做Full GC(Garbage Collection)Q而且旉很长Q大U需?0-40U,应用服务器在做Full GC的时候是不响应客L交易h的,非常影响pȝ性能?/div><div></div><div>因ؓ开发环境和产品环境会有不同Q导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪pȝ的内存用情况,在有些个别情况下或许某个时刻实是用了大量内存Dout of memoryQ这时应l箋跟踪看接下来是否会有下降Q?/div><div></div><div>如果一直居高不下这肯定因为程序的原因D内存泄漏?/div><div></div><div>五、不健壮代码的特征及解决办法</div><div></div><div>1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动讄为nullQ暗C垃圾收集器来收集该对象Q防止发生内存泄霌Ӏ?/div><div></div><div>对于仍然有指针指向的实例Qjvm׃会回收该资源,因ؓ垃圾回收会将gؓnull的对象作为垃圾,提高GC回收机制效率Q?/div><div></div><div>2、我们的E序里不可避免大量用字W串处理Q避免用StringQ应大量使用StringBufferQ每一个String对象都得独立占用内存一块区域;</div><div></div><div>String str = "aaa";</div><div></div><div>String str2 = "bbb";</div><div></div><div>String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调?那它?yu)׃被放在内存中{待Java的gcd?E序内过多的出现q样的情况就会报上面的那个错?在用字W串时能使用StringBuffer׃要用String,q样可以省不开销Q?/div><div></div><div>3、尽量少用静态变量,因ؓ静态变量是全局的,GC不会回收的;</div><div></div><div>4、避免集中创建对象尤其是大对象,JVM会突焉要大量内存,q时必然会触发GC优化pȝ内存环境Q显C的声明数组I间Q而且甌数量q极大?/div><div></div><div>q是一个案例想定供大家警戒</div><div></div><div>使用jspsmartUpload作文件上?q行q程中经常出现java.outofMemoryError的错误,</div><div></div><div>查之后发现问题:lg里的代码</div><div></div><div>m_totalBytes = m_request.getContentLength();</div><div></div><div>m_binArray = new byte[m_totalBytes];</div><div></div><div>问题原因是totalBytesq个变量得到的数极大Q导致该数组分配了很多内存空_而且该数l不能及旉放。解军_法只能换一U更合适的办法Q至是不会引发outofMemoryError的方式解冟뀂参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747</div><div></div><div>5、尽量运用对象池技术以提高pȝ性能Q生命周期长的对象拥有生命周期短的对象时Ҏ(gu)引发内存泄漏Q例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块q行处理Q然后解决一块释放一块的{略?/div><div></div><div>6、不要在l常调用的方法中创徏对象Q尤其是忌讳在@环中创徏对象。可以适当的用hashtableQvector 创徏一l对象容器,然后从容器中d那些对象Q而不用每ơnew之后又丢?/div><div></div><div>7、一般都是发生在开启大型文件或跟数据库一ơ拿了太多的数据Q造成 Out Of Memory Error 的状况,q时大概要计算一下数据量的最大值是多少Qƈ且设定所需最及最大的内存I间倹{?/div></div></div><br /></a></div><img src ="http://www.tkk7.com/GavinMiao/aggbug/357737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-01 14:46 <a href="http://www.tkk7.com/GavinMiao/archive/2011/09/01/357737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 内存分配Q{载)http://www.tkk7.com/GavinMiao/archive/2011/09/01/357734.htmlGavinMiaoGavinMiaoThu, 01 Sep 2011 06:37:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/09/01/357734.htmlhttp://www.tkk7.com/GavinMiao/comments/357734.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/09/01/357734.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/357734.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/357734.htmlhttp://developer.51cto.com/art/201009/225071_1.htm

一般Java在内存分配时会涉及到以下区域Q?/p>

◆寄存器:我们在程序中无法控制

◆栈:存放基本cd的数据和对象的引用,但对象本w不存放在栈中,而是存放在堆?/p>

◆堆:存放用new产生的数?/p>

◆静态域Q存攑֜对象中用static定义的静态成?/p>

◆帔R池:存放帔R

◆非RAM存储Q硬盘等怹存储I间

Java内存分配中的?/strong>

在函C定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配?br style="clear: both; width: 0px; height: 0px; " />  
当在一D代码块定义一个变量时QJava在栈中 个变量分配内存空_当该变量退作用域后QJava会自动释放掉变量所分配的内存空_该内存空间可以立卌另作他用?/p>

Java内存分配中的?/strong>

堆内存用来存攄new创徏的对象和数组?在堆中分配的内存Q由Java虚拟机的自动垃圾回收器来理?/p>

在堆中生了一个数l或对象后,q可?在栈中定义一个特D的变量Q让栈中q个变量的取值等于数l或对象在堆内存中的首地址Q栈中的q个变量成了数l或对象的引用变量?nbsp; 引用变量q当于?为数l或对象L一个名Uͼ以后可以在E序中用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数l或者对象v的一个名U?/p>

引用变量是普通的变量Q定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数l和对象本n在堆中分配,即ɽE序 q行C?new 产生数组或者对象的语句所在的代码块之外,数组和对象本w占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用Q但?然占据内存空间不放,在随后的一个不定的时间被垃圾回收器收赎ͼ释放掉)。这也是 Java 比较占内存的原因?/p>

实际上,栈中的变量指向堆内存中的变量Q这是Java中的指针Q?br style="clear: both; width: 0px; height: 0px; " /> 
帔R?(constant pool)

帔R池指的是在编译期被确定,q被保存在已~译?class文g中的一些数据。除了包含代码中所定义的各U基本类型(如int、long{等Q和对象型(如String及数l)的常量?final)q包含一些以文本形式出现的符号引用,比如Q?/p>

◆cd接口的全限定名;

◆字段的名U和描述W;

◆Ҏ(gu)和名U和描述W?/p>

虚拟机必Mؓ每个被装载的cdl护一个常量池。常量池是该类型所用到帔R的一个有序集和,包括直接帔RQstring,integer?floating point帔RQ和对其他类型,字段和方法的W号引用?/p>

对于String帔RQ它的值是在常量池中的。而JVM中的帔R池在内存当中是以表的形式存在的, 对于StringcdQ有一张固定长度的CONSTANT_String_info表用来存储文字字W串|注意Q该表只存储文字字符串|不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了?br style="clear: both; width: 0px; height: 0px; " />在程序执行的时?帔R?会储存在Method Area,而不是堆中?/p>

堆与?/strong>

Java的堆是一个运行时数据?cȝ(对象从中分配I间。这些对象通过new、newarray?anewarray和multianewarray{指令徏立,它们不需要程序代码来昑ּ的释放。堆是由垃圾回收来负责的Q堆的优势是可以动态地分配内存 大小Q生存期也不必事先告诉编译器Q因为它是在q行时动态分配内存的QJava的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动?分配内存Q存取速度较慢?/p>

栈的优势是,存取速度比堆要快Q仅ơ于寄存器,栈数据可以共享。但~点是,存在栈中的数据大与生存期必L 定的,~Z灉|性。栈中主要存放一些基本类型的变量数据Qint, short, long, byte, float, double, boolean, charQ和对象句柄(引用)?/p>

栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定义:

  1. int a = 3;   
  2. int b = 3Q?nbsp; 

~译器先处理int a = 3Q首先它会在栈中创徏一个变量ؓa的引用,然后查找栈中是否?q个|如果没找刎ͼ将3存放q来Q然后将a指向3。接着处理int b = 3Q在创徏完b的引用变量后Q因为在栈中已经?q个|便将b直接指向3。这P出Ca与b同时均指?的情c?/p>

q时Q如果再?a=4Q那么编译器会重新搜索栈中是否有4|如果没有Q则?存放q来Qƈ令a指向4Q如果已l有了,则直接将a指向q个地址。因此a值的改变不会影响 到b的倹{?/p>

要注意这U数据的׃n与两个对象的引用同时指向一个对象的q种׃n是不同的Q因U情况a的修改ƈ不会影响到b, 它是q译器完成的,它有利于节省I间。而一个对象引用变量修改了q个对象的内部状态,会媄响到另一个对象引用变量?br />

ȝ

栈中用来存放一些原始数据类型的局部变量数据和对象的引?String,数组.对象{等)但不存放对象内容

堆中存放使用new关键字创建的对象.

字符串是一个特D包装类,其引用是存放在栈里的,而对象内容必L据创建方式不同定(帔R池和?.有的是编译期已l创建好Q存攑֜字符串常 量池中,而有的是q行时才被创?使用new关键字,存放在堆中?/p>





GavinMiao 2011-09-01 14:37 发表评论
]]>
注解参?/title><link>http://www.tkk7.com/GavinMiao/archive/2011/08/29/357524.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 29 Aug 2011 10:20:00 GMT</pubDate><guid>http://www.tkk7.com/GavinMiao/archive/2011/08/29/357524.html</guid><wfw:comment>http://www.tkk7.com/GavinMiao/comments/357524.html</wfw:comment><comments>http://www.tkk7.com/GavinMiao/archive/2011/08/29/357524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/GavinMiao/comments/commentRss/357524.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/GavinMiao/services/trackbacks/357524.html</trackback:ping><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://www.tkk7.com/GavinMiao/archive/2011/08/29/357524.html'>阅读全文</a><img src ="http://www.tkk7.com/GavinMiao/aggbug/357524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/GavinMiao/" target="_blank">GavinMiao</a> 2011-08-29 18:20 <a href="http://www.tkk7.com/GavinMiao/archive/2011/08/29/357524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讄内存大小http://www.tkk7.com/GavinMiao/archive/2011/08/29/357501.htmlGavinMiaoGavinMiaoMon, 29 Aug 2011 06:49:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/08/29/357501.htmlhttp://www.tkk7.com/GavinMiao/comments/357501.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/08/29/357501.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/357501.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/357501.html
tomcat bin catalina.bat
在最上面dq样一句:
set JAVA_OPTS=-Xms512m-Xmx1024m
set CATALINA_OPTS=-Xms512m-Xmx1024m
加入的位|在rem-----------------------q条语句之后
egQ?/div>
原语句: 
set JAVA_OPTS=%JAVA_OPTS%   -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
修改后语句: 
set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
d部分 
set JAVA_OPTS=-Xms256m -Xmx512m
在Eclipse中改tomcat JVM 内存, q行Eclipse中配|的Tomcat. 
在server配置, tomcat5.x->jdk, 在Java VM arguments 里添? 
-Xms256m -Xmx512m 辑ֈ一L效果. 

    以下{载的一文章:http://developer.51cto.com/art/201009/228062.htm

如何讄Tomcat的JVM内存大小

Tomcat本n不能直接在计机上运行,需要依赖于g基础之上的操作系l和一个JVM。JAVAE序启动时JVM都会分配一个初始JVM内存和最大JVM内存l这个应用程序。这个初始内存和最大内存在一定程度都会媄响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圑֛收的动作Q释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明Q一般的JAVAE序在运行都可以通过?Xms-Xmx来调整应用程序的初始内存和最大内?

q两个值的大小一般根据需要进行设|。初始化堆的大小执行了虚拟机在启动时向系l申L内存的大。一般而言Q这个参C重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存Q此时这个参数就是显得非帔R要,如果虚拟机启动时讄使用的内存比较小而在q种情况下有许多对象q行初始化,虚拟机就必须重复地增加内存来满使用。由于这U原因,我们一般把-Xms?Xmx设ؓ一样大Q而堆的最大值受限于pȝ使用的物理内存。一般用数据量较大的应用程序会使用持久对象Q内存用有可能q速地增长。当应用E序需要的内存出堆的最大值时虚拟机就会提C内存溢出,q且D应用服务崩溃。因此一般徏议堆的最大D|ؓ可用JVM内存的最大值的80%?/p>

Tomcat默认可以使用的内存ؓ128MBQ在较大型的应用目中,q点内存是不够的Q需要调大。有以下几种Ҏ(gu)可以选用Q?/p>

W一U方法:

Windows下,在文?bin/catalina.batQUnix下,在文?bin/catalina.sh的前面,增加如下讄Q?/p>

JAVA_OPTS='-Xms【初始化内存大小?Xmx【可以用的最大内存?

需要把q个两个参数D大。例如:

JAVA_OPTS='-Xms256m-Xmx512m'

表示初始化内存ؓ256MBQ可以用的最大内存ؓ512MB?/p>

W二U方法:环境变量中设

变量名:JAVA_OPTS

变量|-Xms512m-Xmx512m

W三U方法:前两U方法针对的是bin目录下有catalina.bat的情况(比如直接解压的Tomcat{)Q但是有些安装版的Tomcat下没有catalina.batQ这个时候可以采用如下方法,当然q个Ҏ(gu)也是最通用的方法:

打开tomcatHome/\bin/\tomcat5w.exeQ点击Java选项卡,然后会发现其中有这么两:Initialmemorypool和Maximummemorypool.Initialmemorypoolq个是初始化设|的内存的大。Maximummemorypoolq个是最大JVM内存的大设|完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了?/p>

另外需要考虑的是Java提供的垃圑֛收机制。虚拟机的堆大小军_了虚拟机p在收集垃圾上的时间和频度。收集垃圑֏以接受的速度与应用有养I应该通过分析实际的垃圾收集的旉和频率来调整。如果堆的大很大,那么完全垃圾攉׃很慢Q但是频度会降低。如果你把堆的大和内存的需要一_完全攉很快,但是会更加频J。调整堆大小的的目的是最化垃圾攉的时_以在特定的时间内最大化处理客户的请求。在基准试的时候,Z证最好的性能Q要把堆的大设大,保证垃圾攉不在整个基准试的过E中出现?/p>

如果pȝp很多的时间收集垃圾,请减堆大小。一ơ完全的垃圾攉应该不超q?-5U。如果垃圾收集成为瓶颈,那么需要指定代的大,查垃圾收集的详细输出Q研I垃圾收集参数对性能的媄响。一般说来,你应该用物理内存的80%作ؓ堆大。当增加处理器时Q记得增加内存,因ؓ分配可以q行q行Q而垃圾收集不是ƈ行的?/p>

一个要注意的地方:把内存的最高D最低值的差值羃?yu),不然会浪费很多内存的Q最低值加大,最高值可以随便设Q但是要Ҏ(gu)实际的物理内存,如果内存讄太大?比如讄?12M最大内?但如果没?12M可用内存,Tomcat׃能启动,q有可能存在内存被系l回Ӟl止q程的情c?/p>



GavinMiao 2011-08-29 14:49 发表评论
]]>
java基础知识ȝhttp://www.tkk7.com/GavinMiao/archive/2011/08/29/357491.htmlGavinMiaoGavinMiaoMon, 29 Aug 2011 05:39:00 GMThttp://www.tkk7.com/GavinMiao/archive/2011/08/29/357491.htmlhttp://www.tkk7.com/GavinMiao/comments/357491.htmlhttp://www.tkk7.com/GavinMiao/archive/2011/08/29/357491.html#Feedback0http://www.tkk7.com/GavinMiao/comments/commentRss/357491.htmlhttp://www.tkk7.com/GavinMiao/services/trackbacks/357491.html阅读全文

GavinMiao 2011-08-29 13:39 发表评论
]]>
վ֩ģ壺 ѿƷþ| ޻ɫѹۿ| ޵һɫַ| ѻ߹ۿ| ٸ̫߳ˬ߹ۿ| 99ƷƵۿ| þҹҹ³³Ƭ| Ů˽Ƶwww| ߹aѹۿ| ҹƷƬѹۿ| Ƶ97| Ƶ| Ʒһ| þѹۿ99Ʒ| һëƬѲ| òƵ߹ۿ| 97޳ҹҹ| ȫƵ߹ۿѸ嶯Ƶ | Ů׽Ƶ| þֻоƷ10| ѵӾ߹ۿ| ؼëƬ߳˹ۿ| ɫƵ| AV߹ۿ| ޳aƬ߹ۿ| Vһۿ ަvþþ | ѵĻɫվ| þþWWWѾƷ| ƷѸ߹ۿ| ձվ| Ů18ëƬˮѿ | ѹۿ߽Ƭ| ˸Ƶ| ձ޿һ| av鶹aӰ| VVA| Ʒ߹ۿ| պɫպƵվ| aëƬƵѹۿ| Ƶѹۿˬˬˬ| ׾Ʒר|