AJAX 流行之后,總想好好學(xué)習(xí)一下。但是眾多的框架實(shí)在難以選擇。說明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。
剛開始學(xué)了 JQuqery, 眾多的 $get(),...等等符號(hào)早已把我搞暈了。暫時(shí)就放棄了。
后來學(xué)習(xí) ASP.NET AJAX ,在微軟的領(lǐng)導(dǎo)下,逐漸由服務(wù)器端轉(zhuǎn)向客戶端編程。 激起我客戶端編程的興趣,
才想起學(xué)習(xí)一下了 Jquery.
隨著WEB2.0及ajax思想在互聯(lián)網(wǎng)上的快速發(fā)展傳播,陸續(xù)出現(xiàn)了一些優(yōu)秀的Js框架,其中比較著名的有Prototype、YUI、jQuery、mootools、Bindows以及國(guó)內(nèi)的JSVM框架等,通過將這些JS框架應(yīng)用到我們的項(xiàng)目中能夠使程序員從設(shè)計(jì)和書寫繁雜的JS應(yīng)用中解脫出來,將關(guān)注點(diǎn)轉(zhuǎn)向功能需求而非實(shí)現(xiàn)細(xì)節(jié)上,從而提高項(xiàng)目的開發(fā)速度。
jQuery是繼prototype之后的又一個(gè)優(yōu)秀的Javascript框架。它是由 John Resig 于 2006 年初創(chuàng)建的,它有助于簡(jiǎn)化 JavaScript™ 以及Ajax 編程。有人使用這樣的一比喻來比較prototype和jQuery:prototype就像Java,而jQuery就像ruby. 它是一個(gè)簡(jiǎn)潔快速靈活的JavaScript框架,它能讓你在你的網(wǎng)頁上簡(jiǎn)單的操作文檔、處理事件、實(shí)現(xiàn)特效并為Web頁面添加Ajax交互。
它具有如下一些特點(diǎn):
1、代碼簡(jiǎn)練、語義易懂、學(xué)習(xí)快速、文檔豐富。
2、jQuery是一個(gè)輕量級(jí)的腳本,其代碼非常小巧,最新版的JavaScript包只有20K左右。
3、jQuery支持CSS1-CSS3,以及基本的xPath。
4、jQuery是跨瀏覽器的,它支持的瀏覽器包括IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+。
5、可以很容易的為jQuery擴(kuò)展其他功能。
6、能將JS代碼和HTML代碼完全分離,便于代碼和維護(hù)和修改。
7、插件豐富,除了jQuery本身帶有的一些特效外,可以通過插件實(shí)現(xiàn)更多功能,如表單驗(yàn)證、tab導(dǎo)航、拖放效果、表格排序、DataGrid,樹形菜單、圖像特效以及ajax上傳等。
jQuery的設(shè)計(jì)會(huì)改變你寫JavaScript代碼的方式,降低你學(xué)習(xí)使用JS操作網(wǎng)頁的復(fù)雜度,提高網(wǎng)頁JS開發(fā)效率,無論對(duì)于js初學(xué)者還是資深專家,jQuery都將是您的首選。
jQuery適合于設(shè)計(jì)師、開發(fā)者以及那些還好者,同樣適合用于商業(yè)開發(fā),可以說jQuery適合任何JavaScript應(yīng)用的地方,可用于不同的Web應(yīng)用程序中。
官方站點(diǎn):http://jquery.com/ 中文站點(diǎn):http://jquery.org.cn/
1.2、目的
通過學(xué)習(xí)本文檔,能夠?qū)Query有一個(gè)簡(jiǎn)單的認(rèn)識(shí)了解,清楚JQuery與其他JS框架的不同,掌握jQuery的常用語法、使用技巧及注意事項(xiàng)。
二、使用方法
在需要使用JQuery的頁面中引入JQuery的js文件即可。
例如:<script type="text/javascript" src="js/jquery.js"></script>
引入之后便可在頁面的任意地方使用jQuery提供的語法。
三、學(xué)習(xí)教程及參考資料
請(qǐng)參照《jQuery中文API手冊(cè)》和http://jquery.org.cn/visual/cn/index.xml
推薦兩篇不錯(cuò)的jquery教程:《jQuery的起點(diǎn)教程》和《使用 jQuery 簡(jiǎn)化 Ajax 開發(fā)》
四、語法總結(jié)和注意事項(xiàng)
1、關(guān)于頁面元素的引用
通過jquery的$()引用元素包括通過id、class、元素名以及元素的層級(jí)關(guān)系及dom或者xpath條件等方法,且返回的對(duì)象為jquery對(duì)象(集合對(duì)象),不能直接調(diào)用dom定義的方法。
2、jQuery對(duì)象與dom對(duì)象的轉(zhuǎn)換
只有jquery對(duì)象才能使用jquery定義的方法。注意dom對(duì)象和jquery對(duì)象是有區(qū)別的,調(diào)用方法時(shí)要注意操作的是dom對(duì)象還是jquery對(duì)象。
普通的dom對(duì)象一般可以通過$()轉(zhuǎn)換成jquery對(duì)象。
如:$(document.getElementById("msg"))則為jquery對(duì)象,可以使用jquery的方法。
由于jquery對(duì)象本身是一個(gè)集合。所以如果jquery對(duì)象要轉(zhuǎn)換為dom對(duì)象則必須取出其中的某一項(xiàng),一般可通過索引取出。
如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這些都是dom對(duì)象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下幾種寫法都是正確的:
$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;
3、如何獲取jQuery集合的某一項(xiàng)
對(duì)于獲取的元素集合,獲取其中的某一項(xiàng)(通過索引指定)可以使用eq或get(n)方法或者索引號(hào)獲取,要注意,eq返回的是jquery對(duì)象,而get(n)和索引返回的是dom元素對(duì)象。對(duì)于jquery對(duì)象只能使用jquery的方法,而dom對(duì)象只能使用dom的方法,如要獲取第三個(gè)<div>元素的內(nèi)容。有如下兩種方法:
$("div").eq(2).html(); //調(diào)用jquery對(duì)象的方法
$("div").get(2).innerHTML; //調(diào)用dom的方法屬性
4、同一函數(shù)實(shí)現(xiàn)set和get
Jquery中的很多方法都是如此,主要包括如下幾個(gè):
$("#msg").html(); //返回id為msg的元素節(jié)點(diǎn)的html內(nèi)容。
$("#msg").html("<b>new content</b>");
//將“<b>new content</b>” 作為html串寫入id為msg的元素節(jié)點(diǎn)內(nèi)容中,頁面顯示粗體的new content
$("#msg").text(); //返回id為msg的元素節(jié)點(diǎn)的文本內(nèi)容。
$("#msg").text("<b>new content</b>");
//將“<b>new content</b>” 作為普通文本串寫入id為msg的元素節(jié)點(diǎn)內(nèi)容中,頁面顯示<b>new content</b>
$("#msg").height(); //返回id為msg的元素的高度
$("#msg").height("300"); //將id為msg的元素的高度設(shè)為300
$("#msg").width(); //返回id為msg的元素的寬度
$("#msg").width("300"); //將id為msg的元素的寬度設(shè)為300
$("input").val("); //返回表單輸入框的value值
$("input").val("test"); //將表單輸入框的value值設(shè)為test
$("#msg").click(); //觸發(fā)id為msg的元素的單擊事件
$("#msg").click(fn); //為id為msg的元素單擊事件添加函數(shù)
同樣blur,focus,select,submit事件都可以有著兩種調(diào)用方法
5、集合處理功能
對(duì)于jquery返回的集合內(nèi)容無需我們自己循環(huán)遍歷并對(duì)每個(gè)對(duì)象分別做處理,jquery已經(jīng)為我們提供的很方便的方法進(jìn)行集合的處理。
包括兩種形式:
$("p").each(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
//為索引分別為0,1,2的p元素分別設(shè)定不同的字體顏色。
$("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//實(shí)現(xiàn)表格的隔行換色效果
$("p").click(function(){alert($(this).html())})
//為每個(gè)p元素增加了click事件,單擊某個(gè)p元素則彈出其內(nèi)容
6、擴(kuò)展我們需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //為jquery擴(kuò)展了min,max兩個(gè)方法
使用擴(kuò)展的方法(通過“$.方法名”調(diào)用):
alert("a=10,b=20,max="+$.max(10,20)+",min="+$.min(10,20));
7、支持方法的連寫
所謂連寫,即可以對(duì)一個(gè)jquery對(duì)象連續(xù)調(diào)用各種不同的方法。
例如:
$("p").click(function(){alert($(this).html())})
.mouseover(function(){alert('mouse over event')})
.each(function(i){this.style.color=['#f00','#0f0','#00f'][i]});
8、操作元素的樣式
主要包括以下幾種方式:
$("#msg").css("background"); //返回元素的背景顏色
$("#msg").css("background","#ccc") //設(shè)定元素背景為灰色
$("#msg").height(300); $("#msg").width("200"); //設(shè)定寬高
$("#msg").css({ color: "red", background: "blue" });//以名值對(duì)的形式設(shè)定樣式
$("#msg").addClass("select"); //為元素增加名稱為select的class
$("#msg").removeClass("select"); //刪除元素名稱為select的class
$("#msg").toggleClass("select"); //如果存在(不存在)就刪除(添加)名稱為select的class
9、完善的事件處理功能
Jquery已經(jīng)為我們提供了各種事件處理方法,我們無需在html元素上直接寫事件,而可以直接為通過jquery獲取的對(duì)象添加事件。
如:
$("#msg").click(function(){alert("good")}) //為元素添加了單擊事件
$("p").click(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
//為三個(gè)不同的p元素單擊事件分別設(shè)定不同的處理
jQuery中幾個(gè)自定義的事件:
(1)hover(fn1,fn2):一個(gè)模仿懸停事件(鼠標(biāo)移動(dòng)到一個(gè)對(duì)象上面及移出這個(gè)對(duì)象)的方法。當(dāng)鼠標(biāo)移動(dòng)到一個(gè)匹配的元素上面時(shí),會(huì)觸發(fā)指定的第一個(gè)函數(shù)。當(dāng)鼠標(biāo)移出這個(gè)元素時(shí),會(huì)觸發(fā)指定的第二個(gè)函數(shù)。
//當(dāng)鼠標(biāo)放在表格的某行上時(shí)將class置為over,離開時(shí)置為out。
$("tr").hover(function(){
$(this).addClass("over");
},
function(){
$(this).addClass("out");
});
(2)ready(fn):當(dāng)DOM載入就緒可以查詢及操縱時(shí)綁定一個(gè)要執(zhí)行的函數(shù)。
$(document).ready(function(){alert("Load Success")})
//頁面加載完畢提示“Load Success”,相當(dāng)于onload事件。與$(fn)等價(jià)
(3)toggle(evenFn,oddFn): 每次點(diǎn)擊時(shí)切換要調(diào)用的函數(shù)。如果點(diǎn)擊了一個(gè)匹配的元素,則觸發(fā)指定的第一個(gè)函數(shù),當(dāng)再次點(diǎn)擊同一元素時(shí),則觸發(fā)指定的第二個(gè)函數(shù)。隨后的每次點(diǎn)擊都重復(fù)對(duì)這兩個(gè)函數(shù)的輪番調(diào)用。
//每次點(diǎn)擊時(shí)輪換添加和刪除名為selected的class。
$("p").toggle(function(){
$(this).addClass("selected");
},function(){
$(this).removeClass("selected");
});
(4)trigger(eventtype): 在每一個(gè)匹配的元素上觸發(fā)某類事件。
例如:
$("p").trigger("click"); //觸發(fā)所有p元素的click事件
(5)bind(eventtype,fn),unbind(eventtype): 事件的綁定與反綁定
從每一個(gè)匹配的元素中(添加)刪除綁定的事件。
例如:
$("p").bind("click", function(){alert($(this).text());}); //為每個(gè)p元素添加單擊事件
$("p").unbind(); //刪除所有p元素上的所有事件
$("p").unbind("click") //刪除所有p元素上的單擊事件
10、幾個(gè)實(shí)用特效功能
其中toggle()和slidetoggle()方法提供了狀態(tài)切換功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。
11、幾個(gè)有用的jQuery方法
$.browser.瀏覽器類型:檢測(cè)瀏覽器類型。有效參數(shù):safari, opera, msie, mozilla。如檢測(cè)是否ie:$.browser.isie,是ie瀏覽器則返回true。
$.each(obj, fn):通用的迭代函數(shù)。可用于近似地迭代對(duì)象和數(shù)組(代替循環(huán))。
如
$.each( [0,1,2], function(i, n){ alert( "Item #" + i + ": " + n ); });
等價(jià)于:
var tempArr=[0,1,2];
for(var i=0;i<tempArr.length;i++){
alert("Item #"+i+": "+tempArr[i]);
}
也可以處理json數(shù)據(jù),如
$.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " + i + ", Value: " + n ); });
結(jié)果為:
Name:name, Value:John
Name:lang, Value:JS
$.extend(target,prop1,propN):用一個(gè)或多個(gè)其他對(duì)象來擴(kuò)展一個(gè)對(duì)象,返回這個(gè)被擴(kuò)展的對(duì)象。這是jquery實(shí)現(xiàn)的繼承方式。
如:
$.extend(settings, options);
//合并settings和options,并將合并結(jié)果返回settings中,相當(dāng)于options繼承setting并將繼承結(jié)果保存在setting中。
var settings = $.extend({}, defaults, options);
//合并defaults和options,并將合并結(jié)果返回到setting中而不覆蓋default內(nèi)容。
可以有多個(gè)參數(shù)(合并多項(xiàng)并返回)
$.map(array, fn):數(shù)組映射。把一個(gè)數(shù)組中的項(xiàng)目(處理轉(zhuǎn)換后)保存到到另一個(gè)新數(shù)組中,并返回生成的新數(shù)組。
如:
var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr內(nèi)容為:[4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr內(nèi)容為:[2,3]
$.merge(arr1,arr2):合并兩個(gè)數(shù)組并刪除其中重復(fù)的項(xiàng)目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):刪除字符串兩端的空白字符。
如:$.trim(" hello, how are you? "); //返回"hello,how are you? "
12、解決自定義方法或其他類庫(kù)與jQuery的沖突
很多時(shí)候我們自己定義了$(id)方法來獲取一個(gè)元素,或者其他的一些js類庫(kù)如prototype也都定義了$方法,如果同時(shí)把這些內(nèi)容放在一起就會(huì)引起變量方法定義沖突,Jquery對(duì)此專門提供了方法用于解決此問題。
使用jquery中的jQuery.noConflict();方法即可把變量$的控制權(quán)讓渡給第一個(gè)實(shí)現(xiàn)它的那個(gè)庫(kù)或之前自定義的$方法。之后應(yīng)用Jquery的時(shí)候只要將所有的$換成jQuery即可,如原來引用對(duì)象方法$("#msg")改為jQuery("#msg")。
如:
jQuery.noConflict();
// 開始使用jQuery
jQuery("div p").hide();
// 使用其他庫(kù)的 $()
$("content").style.display = 'none';
Flex License:
1307-1581-4356-2616-4951-7949 (Commercial Version)
1307-1581-4356-2939-1231-4484 (Education Version)
Charting License:
1301-4581-4356-7349-9369-3351 (Commercial Version)
Today we shipped Visual Studio 2008 and .NET 3.5. You can download the final release using one of the links below:
If you are a MSDN subscriber, you can download your copy from the MSDN subscription site (note: some of the builds are just finishing being uploaded now - so check back later during the day if you don't see it yet).
If you are a non-MSDN subscriber, you can download a 90-day free trial edition of Visual Studio 2008 Team Suite here. A 90-day trial edition of Visual Studio 2008 Professional (which will be a slightly smaller download) will be available next week. A 90-day free trial edition of Team Foundation Server can also be downloaded here.
If you want to use the free Visual Studio 2008 Express editions (which are much smaller and totally free), you can download them here.
If you want to just install the .NET Framework 3.5 runtime, you can download it here.
Visual Studio 2008 and .NET 3.5 contain a ton of new functionality and improvements. Below are links to blog posts I've done myself as well as links to videos you can watch to learn more about it:
VS 2008 Multi-Targeting Support
VS 2008 enables you to build applications that target multiple versions of the .NET Framework. This means you can use VS 2008 to open, edit and build existing .NET 2.0 and ASP.NET 2.0 applications (including ASP.NET 2.0 applications using ASP.NET AJAX 1.0), and continue to deploy these application on .NET 2.0 machines. You can learn more about how this works from my blog post here:
ASP.NET AJAX and JavaScript Support
.NET 3.5 has ASP.NET AJAX built-in (no separate download required). In addition to including all of the features in ASP.NET AJAX 1.0, ASP.NET 3.5 also now includes richer support for UpdatePanels integrating with WebParts, ASP.NET AJAX integration with controls like <asp:menu> and <asp:treeview>, WCF support for JSON, and many other AJAX improvements.
VS 2008 and Visual Web Developer 2008 also now have great support for integrating JavaScript and AJAX into your applications. You can learn more about this from my blog posts here:
You can watch some videos that discuss ASP.NET AJAX and Visual Studio 2008 support for it here.
I also highly recommend the excellent ASP.NET AJAX in Action book to learn more about ASP.NET AJAX (both client-side and server-side).
VS 2008 Web Designer and CSS Support
VS 2008 and Visual Web Developer 2008 Express includes a significantly improved HTML web designer (the same one that ships with Expression Web). This delivers support for split-view editing, nested master pages, and great CSS integration. Below are some articles I've written that discuss this more:
ASP.NET 3.5 also has a new <asp:ListView> control that provides the ability to perform rich data scenarios with total control over the markup. It works nicely with the new CSS support in VS 2008. You can learn more about it from my article here:
You can watch some videos that discuss the new Visual Studio 2008 web designer features and the new ListView/DataPager controls here.
Language Improvements and LINQ
The new VB and C# compilers in VS 2008 deliver significant improvements to the languages. Both add functional programming concepts that enable you to write cleaner, terser, and more expressive code. These features also enable a new programming model we call LINQ (language integrated query) that makes querying and working with data a first-class programming concept with .NET.
Below are some of the articles I've written that explore these new language features using C#:
Here are a few additional blog posts I've written that show off some of the new VS 2008 code editing support and some cool ways to use these new language features:
The Visual Basic team has also created some great free videos that cover LINQ. You can watch them here.
Data Access Improvements with LINQ to SQL
LINQ to SQL is a built-in OR/M (object relational mapper) in .NET 3.5. It enables you to model relational databases using a .NET object model. You can then query the database using LINQ, as well as update/insert/delete data from it. LINQ to SQL fully supports transactions, views, and stored procedures. It also provides an easy way to integrate business logic and validation rules into your data model. Below are some of the articles I've written that explore how to use it:
I think you'll find that LINQ and LINQ to SQL makes it much easier to build much cleaner data models, and write much cleaner data code. I'll be adding more posts to my LINQ to SQL series in the weeks and months ahead (sorry for the delay in finishing them earlier - so much to-do and so little time to-do it all!).
Scott Stanfield is also working on creating some great LINQ to SQL videos for the www.asp.net site based on my article series above (all videos are in both VB and C#). You can watch the first 4 videos in this series here.
Browsing the .NET Framework Library Source using Visual Studio
As I blogged a few weeks ago, we will be releasing a reference version of the .NET Framework library source code as part of this release. Visual Studio 2008 has built-in debugger support to automatically step-into and debug this code on demand (VS 2008 can pull down the source for the appropriate .NET Framework library file automatically for you).
We are deploying the source servers to enable this right now, and will be publishing the steps to turn this feature on in the next few weeks.
Lots of other improvements
The list above is only a small set of the improvements coming. For client development VS 2008 includes WPF designer and project support. ClickOnce and WPF XBAPs now work with FireFox. WinForms and WPF projects can also now use the ASP.NET Application Services (Membership, Roles, Profile) for roaming user data.
Office development is much richer - including support for integrating with the Office 2007 ribbon, and with Outlook. Visual Studio Tools for Office support is also now built-into Visual Studio (you no longer need to buy a separate product).
New WCF and Workflow projects and designers are now included in VS 2008. Unit testing support is now much faster and included in VS Professional (and no longer just VSTS). Continuous Integration support is now built-in with TFS. AJAX web testing (unit and load) is now supported in the VS Test SKU. And there is much, much more...
People often ask me for suggestions on how best to upgrade from previous betas of Visual Studio 2008. In general I'd recommend uninstalling the Beta2 bits explicitly. As part of this you should uninstall Visual Studio 2008 Beta2, .NET Framework Beta2, as well as the Visual Studio Web Authoring Component (these are all separate installs and need to be uninstalled separately). I then usually recommend rebooting the machine after uninstalling just to make sure everything is clean before you kick off the new install. You can then install the final release of VS 2008 and .NET 3.5 on the machine.
Once installed, I usually recommend explicitly running the Tools->Import and Export Settings menu option, choosing the "Reset Settings" option, and then re-pick your preferred profile. This helps ensure that older settings from the Beta2 release are no longer around (and sometimes seems to help with performance).
Note that VS 2008 runs side-by-side with VS 2005 - so it is totally fine to have both on the same machine (you will not have any problems with them on the same box).
Two popular add-ins to Visual Studio are not yet available to download for the final VS 2008 release. These are the Silverlight 1.1 Tools Alpha for Visual Studio and the Web Deployment Project add-in for Visual Studio. Our hope is to post updates to both of them to work with the final VS 2008 release in the next two weeks. If you are doing Silverlight 1.1 development using VS 2008 Beta2 you'll want to stick with with VS 2008 Beta2 until this updated Silverlight Tools Add-In is available.
PYHYP-WXB3B-B2CCM-V9DX9-VDY8T
在開始>設(shè)置>控制面版>添加或刪除程序>卸載vs.net2008>出現(xiàn)卸載界面>點(diǎn)擊Next>輸入上面CD-key ->出現(xiàn)Success畫面。。激動(dòng)ING
本人使用的是VS2008 RTM版..
Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO
ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.iso [3.83 Gb]
ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.nfo [5.8 Kb]
[ Add all 2 links to your ed2k client ]
Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO
ed2k: Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO.iso [3.31 Gb]
ed2k: Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO.nfo [5.5 Kb]
[ Add all 2 links to your ed2k client ]
Microsoft.Visual.Studio.Team.System.2008.Development.Edition
ed2k: Microsoft.Visual.Studio.Team.System.2008.Development.Edition-ZWTiSO.iso [3.81 Gb]
ed2k: Microsoft.Visual.Studio.Team.System.2008.Development.Edition-ZWTiSO.nfo [5.5 Kb]
[ Add all 2 links to your ed2k client ]
Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO
ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO.iso [1.29 Gb]
ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO.nfo [5.7 Kb]
[ Add all 2 links to your ed2k client ]
Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWT
ed2k: Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWTiSO.iso [551.01 Mb]
ed2k: Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWTiSO.nfo [5.7 Kb]
[ Add all 2 links to your ed2k client ]
注冊(cè)機(jī)下載地址
有個(gè)系統(tǒng)隱藏的文件夾System Volume Information會(huì)達(dá)到1G甚至20G,這是系統(tǒng)還原的文件夾,這個(gè)目錄是WINDOWS對(duì)于大硬盤搜索方便的索引記錄文件!會(huì)在WINDOWS空閑時(shí)自動(dòng)記錄,所以這個(gè)文件夾會(huì)越來越大,然后PF使用率不斷上升,導(dǎo)致機(jī)器卡住!&W&D.C g V b j [ a
我們可以禁用這個(gè)自動(dòng)索引功能!打開搜索功能->改變首選項(xiàng)->不使用制作索引服務(wù)->不,不要啟用制作索引服務(wù)->確定。還有一件事,就是回到剛才的地方,下面還有一個(gè)“改變制作索引服務(wù)設(shè)置(高級(jí))”,按下去,右鍵彈出的窗口中的那個(gè)索引服務(wù)->刪除,就好了!海騰數(shù)據(jù)中心服務(wù)器論壇 Y \ M z(R1{
O f ?&f t j9Y&] B ` SystemVolumeInformation\catalog.wci的文件用來存放索引文件,而且在系統(tǒng)空閑時(shí),Windows會(huì)自動(dòng)讀硬盤更新索引,安裝的文件越多,索引文件會(huì)越來越大。
D Y }&X 刪除索引服務(wù):海騰數(shù)據(jù)、服務(wù)器論壇聯(lián)盟、win服務(wù)器、代理服務(wù)器,郵件服務(wù)器、代碼、程序、游戲下載、軟件、電腦技術(shù)、設(shè)計(jì)、圖片、信息發(fā)布 N i$y l z:M }
運(yùn)行msconfig,然后選擇服務(wù)選項(xiàng),找到IndexingService,將前面的小勾去掉,再刪掉文件夾即可。 |
Changing proxy settings of IE is a frequent requirement of mine. Then I got the idea of writing a tool by myself, at last. I have not found clear instructions on this. Many articles recommend to modify registry directly, but unfortunately their instruction is not enough. Most of them direct me to modify the following values in registry :-
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"=":"
"ProxyOverride"=""
"DisablePasswordCaching"=dword:00000001
I tested it and find that it does not work at least on my computer.( I access internet by ADSL connection.) So I backed up registry and modified proxy settings via Internet Explorer, finding that [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] is also changed. So I wrote the following code snippet to change proxy settings:
void ShowError(long lerr) { LPVOID lpMsgBuf; if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, lerr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { return; } MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); } void CieproxyDlg::OnBnClickedOk() {//set proxy server UpdateData(); GetDlgItemText(IDC_EDIT1,m_sIEProxy); HKEY hk; LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", NULL,KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { TCHAR* pbuf=m_sIEProxy.GetBuffer(1); lret=RegSetValueEx( hk,"ProxyServer",NULL,REG_SZ,pbuf,m_sIEProxy.GetLength()); DWORD dwenable=1; lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD, (LPBYTE)&dwenable,sizeof(dwenable)); RegCloseKey(hk); } const TCHAR* keyname3=_T( "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"); lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL, KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwtype; char pbuf[256]; DWORD dwlen=sizeof(pbuf); constchar* valname="Connection to adsl3"; lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen); if(lret!=ERROR_SUCCESS) { ShowError(lret); } pbuf[8] = 3;//enable proxy pbuf[4]=pbuf[4]+1; constchar* p=m_sIEProxy.GetBuffer(1); memcpy(pbuf+16,p,m_sIEProxy.GetLength()); char c=0; for(int i=m_sIEProxy.GetLength();i<20;i++) pbuf[16+i]=c; m_sIEProxy.ReleaseBuffer(); lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen); RegCloseKey(hk); } DWORD dwret; SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL, SMTO_NORMAL,1000,&dwret); } void CieproxyDlg::OnBnClickedDisableProxy() { UpdateData(); GetDlgItemText(IDC_EDIT1,m_sIEProxy); HKEY hk; LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", NULL,KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwenable=0; lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD, (LPBYTE)&dwenable,sizeof(dwenable)); RegCloseKey(hk); } const TCHAR* keyname3=_T( "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"); lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3, NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwtype; char pbuf[256]; DWORD dwlen=sizeof(pbuf); constchar* valname="Connection to adsl3"; lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen); if(lret!=ERROR_SUCCESS) { ShowError(lret); } pbuf[8] = 1;//enable proxy pbuf[4]=pbuf[4]+1; lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen); RegCloseKey(hk); } DWORD dwret; SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL, 1000,&dwret); }
Problem with above code is that existing Internet Explorer instances don't know the change of settings. What is more, changing registry directly is not an elegant method. Then the following must be more attractive :
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr) { //conn_name: active connection name. //proxy_full_addr : eg "210.78.22.87:8000" INTERNET_PER_CONN_OPTION_LIST list; BOOL bReturn; DWORD dwBufSize = sizeof(list); // Fill out list struct. list.dwSize = sizeof(list); // NULL == LAN, otherwise connectoid name. list.pszConnection = conn_name; // Set three options. list.dwOptionCount = 3; list.pOptions = new INTERNET_PER_CONN_OPTION[3]; // Make sure the memory was allocated.if(NULL == list.pOptions) { // Return FALSE if the memory wasn't allocated. OutputDebugString("failed to allocat memory in SetConnectionOptions()"); return FALSE; } // Set flags. list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY; // Set proxy name. list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";// Set proxy override. list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; list.pOptions[2].Value.pszValue = "local"; // Set the options on the connection. bReturn = InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize); // Free the allocated memory.delete [] list.pOptions; InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0); return bReturn; } BOOL DisableConnectionProxy(LPCTSTR conn_name) { //conn_name: active connection name. INTERNET_PER_CONN_OPTION_LIST list; BOOL bReturn; DWORD dwBufSize = sizeof(list); // Fill out list struct. list.dwSize = sizeof(list); // NULL == LAN, otherwise connectoid name. list.pszConnection = conn_name; // Set three options. list.dwOptionCount = 1; list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount]; // Make sure the memory was allocated.if(NULL == list.pOptions) { // Return FALSE if the memory wasn't allocated. OutputDebugString("failed to allocat memory in DisableConnectionProxy()"); return FALSE; } // Set flags. list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT ; // Set the options on the connection. bReturn = InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize); // Free the allocated memory.delete [] list.pOptions; InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0); return bReturn; }
The usage is very straightforward:
//set proxy const char* connection_name="Connection to adsl3"; SetConnectionOptions(connection_name,"62.81.236.23:80"); //disable proxy DisableConnectionProxy(connection_name);
Existing Internet Explorer instances are notified by INTERNET_OPTION_SETTINGS_CHANGED
and INTERNET_OPTION_REFRESH
Written by Halatu Hubisi
約定:
1.讀者應(yīng)具備一定JAVA的知識(shí).
2.本文中的JVM選項(xiàng)均以SUN公司發(fā)布的HotSpot JVM 5為準(zhǔn)(不過大多數(shù)的選項(xiàng)在JVM1.3,JVM1.4中也是可用的).
3.以JAVA_HOME下demo/jfc/SwingSet2/SwingSet2.jar為例進(jìn)行說明.
4.閱讀本文需要一些關(guān)于GC的知識(shí),可以到附錄A中了解這些知識(shí)。
關(guān)鍵字:
JVM(java虛擬機(jī)),調(diào)優(yōu),GC(垃圾回收)
JVM GC調(diào)優(yōu)
為了能夠?qū)VM GC的調(diào)優(yōu)能夠使用在具體的實(shí)踐當(dāng)中,下面將利用若干個(gè)例子來說明GC的調(diào)優(yōu).
例1:Heap size 設(shè)置
JVM堆的設(shè)置是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
當(dāng)在JAVA_HOME下demo/jfc/SwingSet2/目錄下執(zhí)行下面的命令。
java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar
系統(tǒng)輸出為:
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space
除了這些異常信息外,還會(huì)發(fā)現(xiàn)程序的響應(yīng)速度變慢了。這說明Heap size 設(shè)置偏小,GC占用了更多的時(shí)間,而應(yīng)用分配到的執(zhí)行時(shí)間較少。
提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?/span>
將上面的命令換成以下命令執(zhí)行則應(yīng)用能夠正常使用,且未拋出任何異常。
java -jar -Xmn4m -Xms16m -Xmx32m SwingSet2.jar
提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。
例2:Young Generation(-Xmn)的設(shè)置
在本例中看一下Young Generation的設(shè)置不同將有什么現(xiàn)象發(fā)生。
假設(shè)將Young generation 的大小設(shè)置為4M ,即執(zhí)行java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)
[GC [DefNew: 3968K->64K(4032K), 0.0923407 secs] 3968K->2025K(32704K), 0.0931870 secs]
[GC [DefNew: 4021K->64K(4032K), 0.0356847 secs] 5983K->2347K(32704K), 0.0365441 secs]
[GC [DefNew: 3995K->39K(4032K), 0.0090603 secs] 6279K->2372K(32704K), 0.0093377 secs]
[GC [DefNew: 3992K->23K(4032K), 0.0057540 secs] 6325K->2356K(32704K), 0.0060290 secs]
[GC [DefNew: 3984K->27K(4032K), 0.0013058 secs] 6317K->2360K(32704K), 0.0015888 secs]
[GC [DefNew: 3981K->59K(4032K), 0.0023307 secs] 6315K->2422K(32704K), 0.0026091 secs]
將程序體制并將Young Generation的大小設(shè)置為8M,即執(zhí)行java -jar -verbose:gc -Xmn8m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)
[GC [DefNew: 7808K->192K(8000K), 0.1016784 secs] 7808K->2357K(32576K), 0.1022834 secs]
[GC [DefNew: 8000K->70K(8000K), 0.0149659 secs] 10165K->2413K(32576K), 0.0152557 secs]
[GC [DefNew: 7853K->59K(8000K), 0.0069122 secs] 10196K->2403K(32576K), 0.0071843 secs]
[GC [DefNew: 7867K->171K(8000K), 0.0075745 secs] 10211K->2681K(32576K), 0.0078376 secs]
[GC [DefNew: 7970K->192K(8000K), 0.0201353 secs] 10480K->2923K(32576K), 0.0206867 secs]
[GC [DefNew: 7979K->30K(8000K), 0.1787079 secs] 10735K->4824K(32576K), 0.1790065 secs]
那么根據(jù)GC輸出的信息(這里取第一行)做一下Minor收集的比較。可以看出兩次的Minor收集分別在Young generation中找回3904K(3968K->64K)和7616K(7808K->192K)而對(duì)于整個(gè)jvm則找回1943K(3968K->2025)和5451K(7808K->2357K)。第一種情況下Minor收集了大約50%(1943/3904)的對(duì)象,而另外的50%的對(duì)象則被移到了tenured generation。在第二中情況下Minor收集了大約72%的對(duì)象,只有不到30%的對(duì)象被移到了Tenured Generation.這個(gè)例子說明此應(yīng)用在的Young generation 設(shè)置為4m時(shí)顯的偏小。
提示:一般的Young Generation的大小是整個(gè)Heap size的1/4。Young generation的minor收集率應(yīng)一般在70%以上。當(dāng)然在實(shí)際的應(yīng)用中需要根據(jù)具體情況進(jìn)行調(diào)整。
例3:Young Generation對(duì)應(yīng)用響應(yīng)的影響
還是使用-Xmn4m 和-Xmn8m進(jìn)行比較,先執(zhí)行下面的命令
java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime SwingSet2.jar
屏幕輸出如下(節(jié)選)
Application time: 0.5114944 seconds
[GC [DefNew: 3968K->64K(4032K), 0.0823952 secs] 3968K->2023K(32704K), 0.0827626 secs]
Total time for which application threads were stopped: 0.0839428 seconds
Application time: 0.9871271 seconds
[GC [DefNew: 4020K->64K(4032K), 0.0412448 secs] 5979K->2374K(32704K), 0.0415248 secs]
Total time for which application threads were stopped: 0.0464380 seconds
Young Generation 的Minor收集占用的時(shí)間可以計(jì)算如下:應(yīng)用線程被中斷的總時(shí)常/(應(yīng)用執(zhí)行總時(shí)?L+應(yīng)用線程被中斷的總時(shí)常),那么在本例中垃圾收集占用的時(shí)?L約為系統(tǒng)的5%~14%。那么當(dāng)垃圾收集占用的時(shí)間的比例越大的時(shí)候,系統(tǒng)的響應(yīng)將越慢。
提示:對(duì)于互聯(lián)網(wǎng)應(yīng)用系統(tǒng)的響應(yīng)稍微慢一些,用戶是可以接受的,但是對(duì)于GUI類型的應(yīng)用響應(yīng)速度慢將會(huì)給用戶帶來非常不好的體驗(yàn)。
例4:如何決定Tenured Generation 的大小
分別以-Xmn8m -Xmx32m和-Xmn8m -Xmx64m進(jìn)行對(duì)比,先執(zhí)行
java -verbose:gc -Xmn8m -Xmx32m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)
111.042: [GC 111.042: [DefNew: 8128K->8128K(8128K), 0.0000505 secs]111.042: [Tenured: 18154K->2311K(24576K), 0.1290354 secs] 26282K->2311K(32704K), 0.1293306 secs]
122.463: [GC 122.463: [DefNew: 8128K->8128K(8128K), 0.0000560 secs]122.463: [Tenured: 18630K->2366K(24576K), 0.1322560 secs] 26758K->2366K(32704K), 0.1325284 secs]
133.896: [GC 133.897: [DefNew: 8128K->8128K(8128K), 0.0000443 secs]133.897: [Tenured: 18240K->2573K(24576K), 0.1340199 secs] 26368K->2573K(32704K), 0.1343218 secs]
144.112: [GC 144.112: [DefNew: 8128K->8128K(8128K), 0.0000544 secs]144.112: [Tenured: 16564K->2304K(24576K), 0.1246831 secs] 24692K->2304K(32704K), 0.1249602 secs]
再執(zhí)行java -verbose:gc -Xmn8m -Xmx64m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)
90.597: [GC 90.597: [DefNew: 8128K->8128K(8128K), 0.0000542 secs]90.597: [Tenured: 49841K->5141K(57344K), 0.2129882 secs] 57969K->5141K(65472K), 0.2133274 secs]
120.899: [GC 120.899: [DefNew: 8128K->8128K(8128K), 0.0000550 secs]120.899: [Tenured: 50384K->2430K(57344K), 0.2216590 secs] 58512K->2430K(65472K), 0.2219384 secs]
153.968: [GC 153.968: [DefNew: 8128K->8128K(8128K), 0.0000511 secs]153.968: [Tenured: 51164K->2309K(57344K), 0.2193906 secs] 59292K->2309K(65472K), 0.2196372 secs]
可以看出在Heap size 為32m的時(shí)候系統(tǒng)等候時(shí)間約為0.13秒左右,而設(shè)置為64m的時(shí)候等候時(shí)間則增大到0.22秒左右了。但是在32m的時(shí)候系統(tǒng)的Major收集間隔為10秒左右,而Heap size 增加到64m的時(shí)候?yàn)?0秒。那么應(yīng)用在運(yùn)行的時(shí)候是選擇32m還是64m呢?如果應(yīng)用是web類型(即要求有大的吞吐量)的應(yīng)用則使用64m(即heapsize大一些)的比較好。對(duì)于要求實(shí)時(shí)響應(yīng)要求較高的場(chǎng)合(例如GUI型的應(yīng)用)則使用32m比較好一些。
注意:
1。因?yàn)樵贘VM5運(yùn)行時(shí)已經(jīng)對(duì)Heap-size進(jìn)行了優(yōu)化,所以在能確定java應(yīng)用運(yùn)行時(shí)不會(huì)超過默認(rèn)的Heap size的情況下建議不要對(duì)這些值進(jìn)行修改。
2。Heap size的 -Xms -Xmn 設(shè)置不要超出物理內(nèi)存的大小。否則會(huì)提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。
例5:如何縮短minor收集的時(shí)間
下面比較一下采用-XX:+UseParNewGC選項(xiàng)和不采用它的時(shí)候的minor收集將有什么不同。先執(zhí)行
java -jar -server -verbose:gc -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
系統(tǒng)將輸出如下信息(片段〕
[GC 7807K->2641K(32576K), 0.0676654 secs]
[GC 10436K->3108K(32576K), 0.0245328 secs]
[GC 10913K->3176K(32576K), 0.0072865 secs]
[GC 10905K->4097K(32576K), 0.0223928 secs]
之后再執(zhí)行 java -jar -server -verbose:gc -XX:+UseParNewGC -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
系統(tǒng)將輸出如下信息(片段〕
[ParNew 7808K->2656K(32576K), 0.0447687 secs]
[ParNew 10441K->3143K(32576K), 0.0179422 secs]
[ParNew 10951K->3177K(32576K), 0.0031914 secs]
[ParNew 10985K->3867K(32576K), 0.0154991 secs]
很顯然使用了-XX:+UseParNewGC選項(xiàng)的minor收集的時(shí)間要比不使用的時(shí)候優(yōu)。
例6:如何縮短major收集的時(shí)間
下面比較一下采用-XX:+UseConcMarkSweepGC選項(xiàng)和不采用它的時(shí)候的major收集將有什么不同。先執(zhí)行
java -jar -verbose:gc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
系統(tǒng)將輸出如下信息(片段〕
[Full GC 22972K->18690K(262080K), 0.2326676 secs]
[Full GC 18690K->18690K(262080K), 0.1701866 secs
之后再執(zhí)行 java -jar -verbose:gc -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
系統(tǒng)將輸出如下信息(片段〕
[Full GC 56048K->18869K(260224K), 0.3104852 secs]
提示:此選項(xiàng)在Heap Size 比較大而且Major收集時(shí)間較長(zhǎng)的情況下使用更合適。
例7:關(guān)于-server選項(xiàng) 在JVM中將運(yùn)行中的類認(rèn)定為server-class的時(shí)候使用此選項(xiàng)。SUN 的Hot Spot JVM5 如果判斷到系統(tǒng)的配置滿足如下條件則自動(dòng)將運(yùn)行的類認(rèn)定為server-class,并且會(huì)自動(dòng)設(shè)置jvm的選項(xiàng)(當(dāng)沒有手工設(shè)置這選項(xiàng)的時(shí)候〕而且HOTSPOT JVM5提供了自動(dòng)調(diào)優(yōu)的功能,他會(huì)根據(jù)JVM的運(yùn)行情況進(jìn)行調(diào)整。如果沒有特別的需要是不需要太多的人工干預(yù)的。SUN形象的稱這個(gè)機(jī)制為“人體工學(xué)”(Ergonomics〕。具體可以參考http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
*.具有2個(gè)或更多個(gè)物理的處理器
*.具有2G或者更多的物理內(nèi)存
提示:此選項(xiàng)要放在所有選項(xiàng)的前面。例如:java -server 其他選項(xiàng) java類
附錄A:預(yù)備知識(shí)
.JVM中對(duì)象的劃分及管理
JVM根據(jù)運(yùn)行于其中的對(duì)象的生存時(shí)間大致的分為3種。并且將這3種不同的對(duì)象分別存放在JVM從系統(tǒng)分配到的不同的內(nèi)存空間。這種對(duì)象存放空間的管理方式叫做Generation管理方式。
1。Young Generation:用于存放“早逝”對(duì)象(即瞬時(shí)對(duì)象)。例如:在創(chuàng)建對(duì)象時(shí)或者調(diào)用方法時(shí)使用的臨時(shí)對(duì)象或局部變量。
2。Tenured Generation:用于存放“駐留”對(duì)象(即較長(zhǎng)時(shí)間被引用的對(duì)象)。往往體現(xiàn)為一個(gè)大型程序中的全局對(duì)象或長(zhǎng)時(shí)間被使用的對(duì)象。
3。Perm Generation:用于存放“永久”對(duì)象。這些對(duì)象管理著運(yùn)行于JVM中的類和方法。
.JVM選項(xiàng)的分類
JVM有這么幾種選項(xiàng)供使用.
1.供-X選項(xiàng)使用的項(xiàng)目,又稱為非標(biāo)準(zhǔn)選項(xiàng),不同廠商的此類型選項(xiàng)是有所不同的。例如:IBM的JVM用的一些選項(xiàng)在Sun的JVM中就不一定能生效。這種選項(xiàng)的使用方式如下:
java -Xmn16m -Xms64m -Xmx64m java類名
2.供-XX選項(xiàng)使用的項(xiàng)目,這種類型的選項(xiàng)可能要求有對(duì)系統(tǒng)信息訪問的權(quán)限。所以要慎用。這種選項(xiàng)的使用方式如下:
java -XX:MaxHeapFreeRatio=70 -XX:+PrintGCDetails java類名
3.java選項(xiàng)(即在命令行執(zhí)行java后提示的選項(xiàng)).
java -server -verbose:gc -d64 java類名
.垃圾收集分類
在JVM中有兩種垃圾方式,一種叫做Minor(次收集),另一種叫做Major(主收集)。其中Minor在Young Generation的空間被對(duì)象全部占用后執(zhí)行,主要是對(duì)Young Generation中的對(duì)象進(jìn)行垃圾收集。而Major是針對(duì)于整個(gè)Heap size的垃圾收集。其中Minor方式的收集經(jīng)常發(fā)生,并且Minor收集所占用的系統(tǒng)時(shí)間小。Major方式的垃圾收集則是一種“昂貴”的垃圾收集方式,因?yàn)樵贛ajor要對(duì)整個(gè)Heap size進(jìn)行垃圾收集,這會(huì)使得應(yīng)用停頓的時(shí)間變得較長(zhǎng)。
.GC信息的格式
[GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
<collector> GC為minor收集過程中使用的垃圾收集器起的內(nèi)部名稱.
<starting occupancy1> young generation 在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間.
<ending occupancy1> young generation 在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
<pause time1> minor收集使應(yīng)用暫停的時(shí)間長(zhǎng)短(秒)
<starting occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間
<ending occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
<pause time3> 整個(gè)垃圾收集使應(yīng)用暫停的時(shí)間長(zhǎng)短(秒),包括major收集使應(yīng)用暫停的時(shí)間(如果發(fā)生了major收集).
.GC信息的選項(xiàng)
-XX:+PrintGCDetails 顯示GC的詳細(xì)信息
-XX:+PrintGCApplicationConcurrentTime 打印應(yīng)用執(zhí)行的時(shí)間
-XX:+PrintGCApplicationStoppedTime 打印應(yīng)用被暫停的時(shí)間
提示:1.":"后的"+"號(hào)表示開啟此選項(xiàng),如果是"-"號(hào)那么表示關(guān)閉此選項(xiàng)。
?????2.在不同的選項(xiàng)和不同的收集方式和類型下輸出的格式會(huì)有所不同。
附錄B:HotSpot JVM 選項(xiàng)
請(qǐng)參考JavaTM HotSpot VM Options
附錄C:其他資源
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
String strs = request.getParameter("yourstrs");關(guān)于tomcat4.0配置digest認(rèn)證注意事項(xiàng):
byte b[] = strs.getBytes("ISO-8859-1");
strs = new String(b);
簡(jiǎn)潔寫法:
String convert = new String(request.getParmater("inputname").trim().getBytes("ISO8859_1"), "GBK");
????似乎是數(shù)位少年作家的嶄露頭角,讓人們開始注目“80后”。而當(dāng)在人們眼中的“80后”還是代表著浮躁和反叛時(shí),這個(gè)詞卻在悄悄地與財(cái)富畫上連接符號(hào),一批極為年輕的財(cái)富新貴的出現(xiàn)似乎是一夜之間,同時(shí)顛覆了人們心目中
企業(yè)家
的傳統(tǒng)印象。
???
???也正由于他們的年紀(jì)之輕和擁有的財(cái)富之重,這段時(shí)間來,他們不斷受到媒體和公眾的追捧。
????看看上述這些代表人物從事的行業(yè)就知道,這批“80后”財(cái)富新貴的共同特點(diǎn)是夾了一本叫“互聯(lián)網(wǎng)”的大課本匆匆上路了。互聯(lián)網(wǎng)這座虛擬時(shí)空里的“大學(xué)”,在很多層面上反叛著以一間講堂、一套書本、一種方言、一個(gè)系統(tǒng)為依托的傳統(tǒng) 教育 。
????在李想看來,這正是“80后”的一代人所具有的互聯(lián)網(wǎng)精神:完全不顧忌那些別人認(rèn)為是必須去做的傳統(tǒng),破除墨守成規(guī),只做最正確的事。
????和李想說話,你會(huì)發(fā)現(xiàn)他始終思路清晰、方向明確,回答每個(gè)問題不超過3句話,也挑不出一點(diǎn)廢話。“我的方向和目標(biāo)很明確,一開始我就知道我的事業(yè)方向就是互聯(lián)網(wǎng),然后我會(huì)確定每一個(gè)階段的目標(biāo),一個(gè)一個(gè)去實(shí)現(xiàn),所以我不會(huì)受到誘惑去燒錢,也不會(huì)因?yàn)榕龅嚼щy就放棄。”
????“像李想、戴志康這批‘80后’創(chuàng)業(yè)家的優(yōu)勢(shì)就在于他們創(chuàng)新能力很強(qiáng),敢于嘗試,想了就做。不像70年代的人干什么都思前想后,以致錯(cuò)過很多機(jī)會(huì)。”中華英才網(wǎng)總裁、著名人力資源專家張建國(guó)說:“但他們的問題是自我意識(shí)太強(qiáng),而管理企業(yè)是要靠組織體系和團(tuán)隊(duì)協(xié)作的,因此,靠一個(gè)好的創(chuàng)意可以成就一個(gè)企業(yè),但企業(yè)做大以后怎么管理好,這可能是‘80后’企業(yè)家應(yīng)該注意的問題。”
????和張建國(guó)基本同齡的戴光對(duì)于兒子戴志康也有類似的擔(dān)心,“你可以憑一項(xiàng)技術(shù)創(chuàng)業(yè),但公司做大以后,如何從一個(gè)技術(shù)天才的角色中脫離出來,完成一個(gè)管理者的轉(zhuǎn)型,是一個(gè)大問題”。
這些擔(dān)心已經(jīng)是李想們正在思考并一直著力解決的問題。
????“2003年時(shí)我的性格還是典型的‘80后’,太自我,不太考慮他人的感受。這給了我很多教訓(xùn),讓我慢慢改變,慢慢學(xué)會(huì)跳出來觀察自己,學(xué)會(huì)了解每一個(gè)員工的性格和想法。”李想說,“而且我開始嘗試用心跟別人溝通,而不是用腦子。用腦子太累,大家互相猜來猜去,我喜歡直截了當(dāng),怎么想的就怎么說。后來我發(fā)現(xiàn)其實(shí)大部分人都喜歡這種溝通方式,包括那些很有名的CEO們。所以規(guī)則不是不可以改寫的,關(guān)鍵是你去不去做。”
????這正是“80后”財(cái)富新貴的共同特點(diǎn),他們擁有與年齡不相符的成熟和老練。
????本期,我們走近“80后”財(cái)富新貴中的兩位:李想和戴志康,也走訪了其中一位的父親,希望能從父輩的教育方式上對(duì)這批財(cái)富新貴的成功緣由有所挖掘。
????一個(gè)沒有上過大學(xué),一個(gè)做了大學(xué)的“半路逃兵”,李想和戴志康都沒有受過完整的高等教育,但他們卻創(chuàng)造了奇跡。
????這批沒有接受正規(guī)高等教育卻創(chuàng)業(yè)成功的年輕企業(yè)家的崛起,再次引發(fā)對(duì)現(xiàn)行高等教育的爭(zhēng)議,中國(guó)高校究竟該培養(yǎng)什么樣人才的問題又一次被提起。
????在關(guān)注他們成長(zhǎng)的同時(shí),我們也期待他們?cè)诮窈蟮穆飞献叩酶臃€(wěn)健和長(zhǎng)久。
????見到25歲的PCPOP網(wǎng)首席執(zhí)行官李想時(shí),他的公司一片忙亂,所有的會(huì)議室都被騰出來接待面試者,李想準(zhǔn)備繼續(xù)擴(kuò)大已有的100多人的團(tuán)隊(duì),而他們2004年還顯得空蕩的公司變得擁擠不堪。李想說他已經(jīng)在中關(guān)村一個(gè)新建的寫字樓里租下了比現(xiàn)在大一倍的“新家”,馬上就要搬家了。
????作為中國(guó)第三大中文 IT 專業(yè)網(wǎng)站——PCPOP網(wǎng)的創(chuàng)始人,李想持有公司50%以上的股份,身家在1億元以上,網(wǎng)站去年的營(yíng)業(yè)額收入近兩千萬元,利潤(rùn)一千萬元,取20倍的市盈率,市場(chǎng)價(jià)值兩億元。但李想的野心決不僅限于此,“今年的營(yíng)業(yè)額要達(dá)到去年的2.5倍,明年要超過1億元,然后2008年達(dá)到一個(gè)上市的標(biāo)準(zhǔn),這是我們未來幾年發(fā)展的一個(gè)方向。”
????這個(gè)野心勃勃的年輕人8年前還是一個(gè)上不起網(wǎng)的高中生,當(dāng)時(shí)一小時(shí)8元的上網(wǎng)費(fèi)外加一小時(shí)4元的電話費(fèi)對(duì)于一個(gè)孩子來說實(shí)在昂貴,后來上網(wǎng)費(fèi)用降到只需一小時(shí)1元,他就是那時(shí)候開始接觸互聯(lián)網(wǎng)的,“我一碰互聯(lián)網(wǎng)馬上就迷上了,當(dāng)時(shí)很單純,就是因?yàn)榭梢栽诰W(wǎng)上跟志同道合的人交流、學(xué)習(xí)知識(shí)”。
李想很快就開始做自己的IT資訊網(wǎng)站,網(wǎng)站的訪問量很快就達(dá)到五六千人。當(dāng)達(dá)到一萬人時(shí),就有
廣告
商開始找他,要做廣告,訪問量一千次10元,‘我當(dāng)時(shí)想,閑著也是閑著,就給他掛上了”。
????沒有在意的李想兩個(gè)月后收到了廣告商6000元的付款,“我當(dāng)時(shí)也很吃驚,這比我父母一個(gè)月加起來掙的還多。”不經(jīng)意間挖到自己的第一桶金,本來心思就不在讀書上的李想終于在高三畢業(yè)時(shí)作出了一個(gè)大膽決定:放棄考大學(xué),自己創(chuàng)業(yè)。
????與李想同歲、同樣靠互聯(lián)網(wǎng)起家的康盛世紀(jì)科技有限公司CEO戴志康卻是個(gè)從小和電腦泡到大的人。戴志康出生在大慶一個(gè)高級(jí)知識(shí)分子家庭,父親戴光是大慶石油學(xué)院的博士后。還在上小學(xué)的戴志康沒事就去鼓搗家里的電腦,從286到586,家里的電腦一次次為他升級(jí),戴志康編程的本事也越來越高。
????2000年,戴志康竟然經(jīng)過高考前一個(gè)月的突擊準(zhǔn)備考進(jìn)一所知名大學(xué)的 通信 工程專業(yè),這讓老師同學(xué)大跌眼鏡。然而進(jìn)入大學(xué)一年級(jí)后,戴志康便很少在學(xué)校,而是自己在外創(chuàng)業(yè)。“我當(dāng)時(shí)在外面租了個(gè)月租300塊錢的房子,一天差不多15個(gè)小時(shí)都泡在電腦前面,悶頭開發(fā)Discuz!”。
????Discuz!是一套能自動(dòng)生成社區(qū)的軟件,能讓不懂技術(shù)的人也能管理自己設(shè)計(jì)的網(wǎng)絡(luò)社區(qū)。剛開始研發(fā)時(shí),戴志康并沒打算以此創(chuàng)業(yè),“我想畢業(yè)后找個(gè)好工作,所以開始研發(fā)Discuz!時(shí)只是興趣,就想證明自己的能力。但在研發(fā)過程中,當(dāng)我產(chǎn)生以此掙錢的念頭時(shí),就不再想找工作了。”
????現(xiàn)在,Discuz!已經(jīng)是社區(qū)軟件領(lǐng)域的老大,戴志康也開始進(jìn)行公司的轉(zhuǎn)型,把產(chǎn)品免費(fèi)供應(yīng)給客戶,轉(zhuǎn)而從為客戶提供服務(wù)中獲取收入。這個(gè)仍習(xí)慣于吃學(xué)校食堂、穿地?cái)傄路s開著銀灰色 寶馬 的年輕人,談起自己公司的發(fā)展方向頭頭是道,老練得讓人有些超出想像。
????寬松的家庭教育造就了創(chuàng)業(yè)素質(zhì)
????戴志康的辦公室立著一個(gè)空空的書架,“我不喜歡看書,我認(rèn)為書是用來查的,不是用來翻的,我討厭被動(dòng)地接收信息,我喜歡從生活中掘取信息”。戴志康的學(xué)習(xí)與常人理解的不同,他既不靠學(xué)校也不靠書本,而是從生活的細(xì)節(jié)中學(xué)習(xí)。
????經(jīng)常和朋友聊天到凌晨的戴志康,從中“偷學(xué)”到不少東西。
“另外,我喜歡獨(dú)立思考。只有獨(dú)立的人才會(huì)堅(jiān)強(qiáng)。當(dāng)遇到看似解決不了的困難時(shí),不獨(dú)立的人馬上想到的是尋求幫助。但在一個(gè)商業(yè)社會(huì)里如果沒有利益的關(guān)聯(lián),沒有人會(huì)幫你,你獲得了別人的幫助也就意味著自己商業(yè)利益的損失。”戴志康說,“再有,勇氣和執(zhí)著是創(chuàng)業(yè)必須的基本素質(zhì),而這兩點(diǎn)獨(dú)立的人很容易獲得。”
????戴志康把這種獨(dú)立思考能力的養(yǎng)成歸功于家庭教育,“我父母的教育方式比較西化,給我很大的空間。當(dāng)然,父母同時(shí)也要我自己負(fù)責(zé)任,什么都靠自己,不到萬不得已他們不會(huì)伸手幫忙。而且我父母都是老師,每天和年輕人接觸,心態(tài)也比較年輕。”
????戴志康的父親戴光在向筆者總結(jié)他的教育方式時(shí)說,對(duì)孩子的培養(yǎng)不能限制得太死,要給孩子建議而不是命令,孩子覺得對(duì)的要采納,要讓他自己思考,不能給現(xiàn)成的答案,這樣孩子才能有自信、有想法,不是一塊只會(huì)跟著別人的木頭。
????“我覺得戴志康之所以能取得一些成就,是他發(fā)揮了自己的特長(zhǎng),大學(xué)里就有了自己的產(chǎn)品,他的創(chuàng)造能力和創(chuàng)新思維特別強(qiáng),又有敢想敢干的冒險(xiǎn)精神,還有就是這孩子是個(gè)踏踏實(shí)實(shí)干事的人,能容得下事、容得下人。”戴光這樣評(píng)價(jià)自己的兒子。
????無獨(dú)有偶,李想同樣來自一個(gè)環(huán)境寬松的家庭,他也把自己最重要的創(chuàng)業(yè)素質(zhì)歸結(jié)為“獨(dú)立思考和總結(jié)能力強(qiáng)”以及不斷學(xué)習(xí)的能力。“我小學(xué)時(shí)父母給的是命令,初中時(shí)給的是建議,高中時(shí)是從朋友的角度提出參考,到了高中以后就是信任了。父母給了我很多獨(dú)立思考的機(jī)會(huì),我基本沒有受過什么束縛。”李想說。
????財(cái)富新貴引發(fā)教育新思考
????“因?yàn)槌隽宋覀冞@樣一批人而在社會(huì)上引起什么‘高等教育無用論’,純屬瞎扯。現(xiàn)實(shí)是大學(xué)里沒有目標(biāo)、隨波逐流的人太多了,所以我們這樣目標(biāo)明確并堅(jiān)持下來的人才顯現(xiàn)出來。
????”沒有上過大學(xué)的李想說。
????李想坦言,沒有上大學(xué)的確是自己的一個(gè)遺憾,因?yàn)槿松腥鄙倭艘环蒹w驗(yàn)。“如果你有明確的目標(biāo),大學(xué)絕對(duì)是一個(gè)非常好的學(xué)習(xí)場(chǎng)所。但相對(duì)于上學(xué)來說,更重要的是一個(gè)人要有目標(biāo)和方向。”
????李想把現(xiàn)在的大學(xué)生分為兩類:畢業(yè)后可以挑單位的和畢業(yè)后“海投”簡(jiǎn)歷也找不到工作的,“凡是可以挑單位的學(xué)生,絕對(duì)是從大一起就有明確的目標(biāo)并一直為之努力。現(xiàn)在很多大學(xué)生或者是迷茫,或者雖有目標(biāo),但一遇到困難,就‘喜新厭舊’,常立志而不立長(zhǎng)志。”
????上了重點(diǎn)大學(xué)卻半路“逃跑”的戴志康這樣看待自己4年的大學(xué)生活:“我考通信專業(yè)時(shí)本來以為會(huì)學(xué)到數(shù)字通信,接觸到一些大型的 交換機(jī) ,結(jié)果到大三才學(xué)到收音機(jī)原理,大四才學(xué)了黑白 電視 機(jī)原理。大學(xué)的課程設(shè)置太落后于時(shí)代,與用人單位的實(shí)際需求太脫節(jié)。”
????本身就是大學(xué)教授的戴光坦言,現(xiàn)在大學(xué)的課程設(shè)置的確存在滯后問題。“雖然現(xiàn)在高等教育已進(jìn)入 大眾 化時(shí)代,但很多老師和高校管理者的思維還停留在精英教育上。精英教育是細(xì)線條的,什么都要講到,是培養(yǎng)理論家的,而大眾教育是粗線條的,應(yīng)該給學(xué)生一定的空間,應(yīng)該多一些應(yīng)用性的東西。”
????清華大學(xué)科技園副主任、被譽(yù)為清華“創(chuàng)業(yè)之父”的羅建北認(rèn)為,像戴志康、李想這樣的人,在現(xiàn)有的大學(xué)體系中很難培養(yǎng)出來,因?yàn)樵趹?yīng)試教育模式下,很難把創(chuàng)業(yè)所需的一些素質(zhì)加入到教學(xué)中,“創(chuàng)業(yè)素質(zhì)的培養(yǎng)和應(yīng)試教育就是一對(duì)矛盾,因?yàn)槟阋獙W(xué)生多了解社會(huì),從而發(fā)現(xiàn)市場(chǎng)的需求和商機(jī),這都需要時(shí)間來實(shí)踐,那考試怎么辦?”
合肥留學(xué)生創(chuàng)業(yè)園 劉濤 ?對(duì)synchronized(this)的一些理解
?
一、當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
?
二、然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
?
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
?
四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞。
?
五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.
?
舉例說明:
?
一、當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
?
package ths;
public class Thread1 implements Runnable {
public void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
}
}
}
public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start();
}
}
?
結(jié)果:
?
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4
?
二、然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。
?
package ths;
public class Thread2 {
public void m4t1() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
public void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
public static void main(String[] args) {
final Thread2 myt2 = new Thread2();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt2.m4t1();
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt2.m4t2();
}
}, "t2"
);
t1.start();
t2.start();
}
}
?
結(jié)果:
?
t1 : 4
t2 : 4
t1 : 3
t2 : 3
t1 : 2
t2 : 2
t1 : 1
t2 : 1
t1 : 0
t2 : 0
?
三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
?
//修改Thread2.m4t2()方法:
public void m4t2() {
synchronized(this) {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
}
?
結(jié)果:
?
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
?
四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞。
?
//修改Thread2.m4t2()方法如下:
public synchronized void m4t2() {
int i = 5;
while( i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
?
結(jié)果:
?
t1 : 4
t1 : 3
t1 : 2
t1 : 1
t1 : 0
t2 : 4
t2 : 3
t2 : 2
t2 : 1
t2 : 0
?
五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用:
?
package ths;
public class Thread3 {
class Inner {
private void m4t1() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
private void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
}
private void m4t1(Inner inner) {
synchronized(inner) { //使用對(duì)象鎖
inner.m4t1();
}
}
private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {
final Thread3 myt3 = new Thread3();
final Inner inner = myt3.new Inner();
Thread t1 = new Thread(
new Runnable() {
public void run() {
myt3.m4t1(inner);
}
}, "t1"
);
Thread t2 = new Thread(
new Runnable() {
public void run() {
myt3.m4t2(inner);
}
}, "t2"
);
t1.start();
t2.start();
}
}
?
結(jié)果:
盡管線程t1獲得了對(duì)Inner的對(duì)象鎖,但由于線程t2訪問的是同一個(gè)Inner中的非同步部分。所以兩個(gè)線程互不干擾。
?
t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0
?
現(xiàn)在在Inner.m4t2()前面加上synchronized:
?
private synchronized void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
?
結(jié)果:
盡管線程t1與t2訪問了同一個(gè)Inner對(duì)象中兩個(gè)毫不相關(guān)的部分,但因?yàn)閠1先獲得了對(duì)Inner的對(duì)象鎖,所以t2對(duì)Inner.m4t2()的訪問也被阻塞,因?yàn)閙4t2()是Inner中的一個(gè)同步方法。
?
t1 : Inner.m4t1()=4
t1 : Inner.m4t1()=3
t1 : Inner.m4t1()=2
t1 : Inner.m4t1()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=4
t2 : Inner.m4t2()=3
t2 : Inner.m4t2()=2
t2 : Inner.m4t2()=1
t2 : Inner.m4t2()=0
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
??for (Iterator iter = cfg.getTableMappings(); iter.hasNext();) {
???Table table = (Table) iter.next();
???for (Iterator iterator = table.getColumnIterator(); iterator.hasNext();) {
????Column column = (Column) iterator.next();
????System.out.println(column.getName());
???}
??}
摘要: Spring Aop Step-By-Step 學(xué)習(xí)筆記(上) ?www.uusam.com ? 最近由于工作需要,要求掌握關(guān)于 Spring 方面的東西。所以花了兩個(gè)星期的時(shí)間來學(xué)習(xí) Spring 的基本知識(shí),主要包括 Ioc ... 閱讀全文 MRX3F-47B9T-2487J-KWKMF-RPWBY(VOL 中國(guó)工商銀行版)感謝您驗(yàn)證 Microsoft Windows 軟件。 感謝您使用 Windows 正版增值計(jì)劃 計(jì)劃。現(xiàn)在您可以訪問正版 Windows 用戶資源。 |
地址:http://tap.javalobby.org/javaee5.mp3
歌詞:
Ladies and gentlemen, this is Java EE 5!
One, two, three, four, five
There's a technology I use day and night
For my application with a web frontend
They told me to use .Net
But I really don′t wanna
So many bugs I fixed last week.
My code is neat and talk is a cheap
I like Glassfish, JSF, persistence API
And as I continue you know they′re gettin′ sweeter
So what can I do I really beg you my Lord
To me codin' it′s just like a sport
All the bad code from the past, let me dump it
Please set in the trumpet
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
Jump up and down and move your code around
Shake your head to the sound bury bad code under ground
Move one step left and one step right
One to the front and one to the side
Refactor it once and refactor it twice
If it looks like this you're doin′ it right
A little bit of injection in my life
A little bit of persistence by my side
A little bit of NetBeans is all I need
A little bit of EJB's is what I see
A little bit of standards in the sun
A little bit of XML all night long
A little bit web services here I am
A little bit of code makes me real man
This is Java EE 5!
本文來源:http://www.aygfsteel.com/Andyluo/archive/2006/06/30/javasong.html
1.下載http://www.eu.apache.org/dist/jakarta/tomcat-5/
這里注意,在jakarta-tomcat-5.0.28.exe以前是有默認(rèn)的admin模塊,在jakarta-tomcat-5.5.9.exe則沒有安裝默認(rèn)的admin模塊,這時(shí)http://127.0.0.1:8080/admin打開時(shí)則會(huì)出現(xiàn)
Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it.
因此我們現(xiàn)在需要下載"admin"package 包
把jakarta-tomcat-5.5.x.zip? 與?? jakarta-tomcat-5.5.x-compat.zip? 與? jakarta-tomcat-5.5.x-admin.zip
三個(gè)文件解壓在同一個(gè)目錄中
(如果使用jdk1.4,才需要compat.zip用jdk1.5就可以免了這個(gè)。)
2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.
添加管理員賬號(hào)lizongbo,密碼為lizongbopass.
新xml如下:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
? <role rolename="tomcat"/>
? <role rolename="role1"/>
? <role rolename="manager"/>
? <role rolename="admin"/>
? <user username="tomcat" password="tomcat" roles="tomcat"/>
? <user username="role1" password="tomcat" roles="role1"/>
? <user username="both" password="tomcat" roles="tomcat,role1"/>
? <user username="lizongbo" password="lizongbopass" roles="admin,manager"/>
</tomcat-users>
有時(shí)在%CATALINA_HOME%\server\webapps\admin\WEB-INF\web.xml里面也要做些修改
<!-- Security is active on entire directory -->
? <security-constraint>
??? <display-name>Tomcat Server Configuration Security Constraint</display-name>
??? <web-resource-collection>
????? <web-resource-name>Protected Area</web-resource-name>
????? <!-- Define the context-relative URL(s) to be protected -->
????? <url-pattern>*.jsp</url-pattern>
????? <url-pattern>*.do</url-pattern>
????? <url-pattern>*.html</url-pattern>
??? </web-resource-collection>
??? <auth-constraint>
????? <!-- Anyone with one of the listed roles may access this area -->
????? <role-name>admin</role-name>
??? </auth-constraint>
? </security-constraint>
? <!-- Login configuration uses form-based authentication -->
? <login-config>
??? <auth-method>FORM</auth-method>
??? <realm-name>Tomcat Server Configuration Form-Based Authentication Area</realm-name>
??? <form-login-config>
????? <form-login-page>/login.jsp</form-login-page>
????? <form-error-page>/error.jsp</form-error-page>
??? </form-login-config>
? </login-config>
? <!-- Security roles referenced by this web application -->
? <security-role>
??? <description>
????? The role that is required to log in to the Administration Application
??? </description>
??? <role-name>admin</role-name>
? </security-role>
無論是 Authetication ( 身份驗(yàn)證? 還是 Authorization ( 權(quán)限管控? 都只有設(shè)置相關(guān)的 admin ROLE, 當(dāng)你想要新增或修改相關(guān)的 AA, 就必須修改這一個(gè)文件, 來符合你的環(huán)境.
3.修改jakarta-tomcat-5.5.x\conf\server.xml來解決編碼問題。
(給Connector 添加URIEncoding參數(shù),參考http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx)
(可以設(shè)置成GB18030)
??? <Connector port="8080"
?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
?????????????? enableLookups="false" redirectPort="8443" acceptCount="200"
?????????????? connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"
?????????????? compression="on" compressionMinSize="2048"
????? noCompressionUserAgents="gozilla, traviata"
????? compressableMimeType="text/html,text/xml"/>
?
??? <Connector port="8009"
?????????????? enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/>
?
4.啟用支持gzip壓縮.
(http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&i=81169)
添加下列屬性
?compression="on"
????? compressionMinSize="2048"
????? noCompressionUserAgents="gozilla, traviata"
????? compressableMimeType="text/html,text/xml"
?
5.設(shè)置虛擬主機(jī)。
在jakarta-tomcat-5.5.x\下建立文件夾vhost\www.mydomain.com。
然后修改jakarta-tomcat-5.5.x\conf\server.xml
?
<Engine defaultHost="localhost" name="Catalina">
????? <Host appBase="vhost/www.mydomain.com" name="????? </Host>
????? <Host appBase="webapps" name="localhost">
????? </Host>
????? <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
??? </Engine>
?
6.添加數(shù)據(jù)庫(kù)驅(qū)動(dòng),更新mail.jar和actiovation.jar
復(fù)制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
還有javamail 1.3.2的mail.jar,jaf-1_0_2的 activation.jar
msSQl 2000 JDBC sp3,msbase.jar,msutil,jar,mssqlserver.jar
?
?
7.配置SSL
參考 http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html
D:\j2sdk1.4.2_06\bin>%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
輸入keystore密碼:? lizongbossl
您的名字與姓氏是什么?
? [tomcat5.5.x]:? tomcat5.5.x
您的組織單位名稱是什么?
? [jakarta]:? jakarta
您的組織名稱是什么?
? [apache]:? apache
您所在的城市或區(qū)域名稱是什么?
? [hzcity]:? hzcity
您所在的州或省份名稱是什么?
? [gdp]:? gdp
該單位的兩字母國(guó)家代碼是什么
? [CN]:? CN
CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正確嗎?
? [否]:? y
?
輸入<tomcat>的主密碼
??????? (如果和 keystore 密碼相同,按回車):
(必須密碼一致,因此直接回車)
然后再把userhome(例如:C:\Documents and Settings\lizongbo\)下的.keystore復(fù)制到
tomcat的conf\目錄下。
?(例如:D:\jakarta-tomcat-5.5.x\conf\.keystore
配置jakarta-tomcat-5.5.x\conf\server.xml
加上
??? <Connector port="8443"
?????????????? maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
?????????????? enableLookups="false" disableUploadTimeout="true"
?????????????? acceptCount="100" scheme="https" secure="true"
?????????????? clientAuth="false" sslProtocol="TLS"
?????????? keystoreFile="conf/.keystore"
?????????? keystorePass="lizongbossl"> <!--與先前設(shè)置的密碼一致-->
??? </Connector>
8.禁止文件目錄列表,
修改jakarta-tomcat-5.5.x\conf\web.xml,把listing設(shè)置為false
?
??? <servlet>
??????? <servlet-name>default</servlet-name>
??????? <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
??????? <init-param>
??????????? <param-name>debug</param-name>
??????????? <param-value>0</param-value>
??????? </init-param>
??????? <init-param>
??????????? <param-name>listings</param-name>
??????????? <param-value>true</param-value>
??????? </init-param>
??????? <load-on-startup>1</load-on-startup>
??? </servlet>
?
?9.指定了自己的javaEncoding
(參考 http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html?
??? <servlet>
??????? <servlet-name>jsp</servlet-name>
??????? <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
??????? <init-param>
??????????? <param-name>fork</param-name>
??????????? <param-value>false</param-value>
??????? </init-param>
??????????????? <init-param>
??????????? <param-name>javaEncoding</param-name>
??????????? <param-value>GB18030</param-value>
??????? </init-param>
??????? <init-param>
??????????? <param-name>xpoweredBy</param-name>
??????????? <param-value>true</param-value>
??????? </init-param>
??????? <load-on-startup>3</load-on-startup>
??? </servlet>
?10.添加rar,iso等的mime-type映射
避免在瀏覽器里直接打開。
<mime-mapping>
<extension>mht</extension>
<mime-type>text/x-mht</mime-type>
</mime-mapping>
<mime-mapping>
??????? <extension>rar</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>iso</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>ape</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>rmvb</extension>
??????? <mime-type>application/octet-stream</mime-type>
??? </mime-mapping>
??? <mime-mapping>
??????? <extension>ico</extension>
??????? <mime-type>image/x-icon</mime-type>
??? </mime-mapping>
10.1對(duì)html靜態(tài)頁面設(shè)置編碼
<!--? 修改下面兩行以支持靜態(tài)超文本的自動(dòng)編碼
? -->
?<mime-mapping>
? <extension>htm</extension>
? <mime-type>text/html;charset=gb2312</mime-type>
? </mime-mapping>
?<mime-mapping>
? <extension>html</extension>
? <mime-type>text/html;charset=gb2312</mime-type>
? </mime-mapping>
? </web-app>
?
11.添加welcome-file-list,并調(diào)整順序。
?<welcome-file-list>???
??????? <welcome-file>index.jsp</welcome-file>
??????? <welcome-file>index.html</welcome-file>
??????? <welcome-file>index.htm</welcome-file>
??????? <welcome-file>default.html</welcome-file>
??????? <welcome-file>default.htm</welcome-file>
??????? <welcome-file>default.jsp</welcome-file>
??? </welcome-file-list>