±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÈçºÎ½áºÏ×Ö½ÚÂëÖ¸ÁîÀí½âJavaÐéÄâ»úÕ»ºÍÕ»Ö¡£¬²¢½øÐÐÉîÈë·ÖÎöÒÔ¼°¶ÔÄÚ´æÄ£Ð͵ĽéÉܺÍÑéÖ¤,Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
1¡¢½áºÏ×Ö½ÚÂëÖ¸ÁîÀí½âJavaÐéÄâ»úÕ»ºÍÕ»Ö¡
Õ»Ö¡£ºÃ¿¸öÕ»Ö¡¶ÔÓ¦Ò»¸ö±»µ÷Óõķ½·¨£¬¿ÉÒÔÀí½âΪһ¸ö·½·¨µÄÔËÐпռ䡣
ÿ¸öÕ»Ö¡ÖаüÀ¨¾Ö²¿±äÁ¿±í(Local Variables)¡¢²Ù×÷ÊýÕ»(Operand Stack)¡¢Ö¸ÏòÔËÐÐʱ³£Á¿³ØµÄÒýÓÃ(A reference to the run-time constant pool)¡¢·½·¨·µ»ØµØÖ·(Return Address)ºÍ¸½¼ÓÐÅÏ¢¡£
¾Ö²¿±äÁ¿±í£º·½·¨Öж¨ÒåµÄ¾Ö²¿±äÁ¿ÒÔ¼°·½·¨µÄ²ÎÊý´æ·ÅÔÚÕâÕűíÖУ¬¾Ö²¿±äÁ¿±íÖеıäÁ¿²»¿ÉÖ±½ÓʹÓã¬ÈçÐèҪʹÓõϰ£¬±ØÐëͨ¹ýÏà¹ØÖ¸ÁÆä¼ÓÔØÖÁ²Ù×÷ÊýÕ»ÖÐ×÷Ϊ²Ù×÷ÊýʹÓá£
²Ù×÷ÊýÕ»£ºÒÔѹջºÍ³öÕ»µÄ·½Ê½´æ´¢²Ù×÷ÊýµÄ¡£
¶¯Ì¬Á´½Ó£ºÃ¿¸öÕ»Ö¡¶¼°üº¬Ò»¸öÖ¸ÏòÔËÐÐʱ³£Á¿³ØÖиÃÕ»Ö¡ËùÊô·½·¨µÄÒýÓ㬳ÖÓÐÕâ¸öÒýÓÃÊÇΪÁËÖ§³Ö·½·¨µ÷Óùý³ÌÖеĶ¯Ì¬Á¬½Ó(Dynamic Linking)¡£
·½·¨·µ»ØµØÖ·£ºµ±Ò»¸ö·½·¨¿ªÊ¼Ö´Ðкó£¬Ö»ÓÐÁ½ÖÖ·½Ê½¿ÉÒÔÍ˳ö£¬Ò»ÖÖÊÇÓöµ½·½·¨·µ»ØµÄ×Ö½ÚÂëÖ¸ÁһÖÖÊÇÓö¼ûÒì³££¬²¢ÇÒÕâ¸öÒ쳣ûÓÐÔÚ·½·¨ÌåÄڵõ½´¦Àí¡£

class Person{
private String name="Jack";
private int age;
private final double salary=100;
private static String address;
private final static String hobby="Programming";
public void say(){
System.out.println("person say...");
}
public static int calc(int op1,int op2){
op1=3;
int result=op1+op2;
return result;
}
public static void order(){
}
public static void main(String[] args){
calc(1,2);
order();
}
} |
Compiled from "Person.java" class Person {
...
public static int calc(int, int);
Code:
0: iconst_3 //½«intÀàÐͳ£Á¿3ѹÈë[²Ù×÷ÊýÕ»]
1: istore_0 //½«intÀàÐÍÖµ´æÈë[¾Ö²¿±äÁ¿0]
2: iload_0 //´Ó[¾Ö²¿±äÁ¿0]ÖÐ×°ÔØintÀàÐÍÖµÈëÕ»
3: iload_1 //´Ó[¾Ö²¿±äÁ¿1]ÖÐ×°ÔØintÀàÐÍÖµÈëÕ»
4: iadd //½«Õ»¶¥ÔªËص¯³öÕ»£¬Ö´ÐÐintÀàÐ͵ļӷ¨£¬½á¹ûÈëÕ»
¡¾For example, the iadd instruction (¡ìiadd) adds two int
values together. It requires that the int values to
be added be the top two values of the operand stack,
pushed there by previous instructions. Both of the int values
are popped from the operand stack.
They are added, and their sum is pushed back onto the operand stack.
Subcomputations may be nested on the operand stack,
resulting in values that can be used by the encompassing computation.¡¿
5: istore_2 //½«Õ»¶¥intÀàÐÍÖµ±£´æµ½[¾Ö²¿±äÁ¿2]ÖÐ
6: iload_2 //´Ó[¾Ö²¿±äÁ¿2]ÖÐ×°ÔØintÀàÐÍÖµÈëÕ»
7: ireturn //´Ó·½·¨Öзµ»ØintÀàÐ͵ÄÊý¾Ý
...
} |
2¡¢ÉîÈë·ÖÎö
2.1 Õ»Ö¸Ïò¶Ñ
Èç¹ûÔÚÕ»Ö¡ÖÐÓÐÒ»¸ö±äÁ¿£¬ÀàÐÍΪÒýÓÃÀàÐÍ£¬±ÈÈç Object obj=new Object()£¬Õâʱºò¾ÍÊǵäÐ͵ÄÕ»ÖÐÔªËØÖ¸Ïò¶ÑÖеĶÔÏó¡£

2.2 ·½·¨ÇøÖ¸Ïò¶Ñ
·½·¨ÇøÖÐ»á´æ·Å¾²Ì¬±äÁ¿£¬³£Á¿µÈÊý¾Ý¡£Èç¹ûÊÇÏÂÃæÕâÖÖÇé¿ö£¬¾ÍÊǵäÐ͵ķ½·¨ÇøÖÐÔªËØÖ¸Ïò¶ÑÖеĶÔÏó¡£
private static Object obj=new Object(); |

2.3 ¶ÑÖ¸Ïò·½·¨Çø
·½·¨ÇøÖлá°üº¬ÀàµÄÐÅÏ¢£¬¶ÑÖлáÓжÔÏó£¬ÄÇÔõô֪µÀ¶ÔÏóÊÇÄĸöÀà´´½¨µÄÄØ?

˼¿¼£ºÒ»¸ö¶ÔÏóÔõô֪µÀËüÊÇÓÉÄĸöÀà´´½¨³öÀ´µÄ£¿Ôõô¼Ç¼?Õâ¾ÍÐèÒªÁ˽âÒ»¸öJava¶ÔÏóµÄ¾ßÌåÐÅÏ¢¿©¡£
2.4 Java¶ÔÏóÄÚ´æ²¼¾Ö
Ò»¸öJava¶ÔÏóÔÚÄÚ´æÖаüÀ¨3¸ö²¿·Ö£º¶ÔÏóÍ·¡¢ÊµÀýÊý¾ÝºÍ¶ÔÆëÌî³ä¡£

3¡¢ÄÚ´æÄ£ÐÍ
3.1 ͼ½â
Ò»¿éÊǷǶÑÇø£¬Ò»¿éÊǶÑÇø¡£
¶ÑÇø·ÖΪÁ½´ó¿é£¬Ò»¸öÊÇOldÇø£¬Ò»¸öÊÇYoungÇø¡£ YoungÇø·ÖΪÁ½´ó¿é£¬Ò»¸öÊÇSurvivorÇø(S0+S1)£¬Ò»¿éÊÇEdenÇø¡£ Eden:S0:S1=8:1:1 S0ºÍS1Ò»Ñù´ó£¬Ò²¿ÉÒÔ½ÐFromºÍTo¡£

¸ù¾Ý֮ǰ¶ÔÓÚHeapµÄ½éÉÜ¿ÉÒÔÖªµÀ£¬Ò»°ã¶ÔÏóºÍÊý×éµÄ´´½¨»áÔÚ¶ÑÖзÖÅäÄÚ´æ¿Õ¼ä£¬¹Ø¼üÊǶÑÖÐÓÐÕâô¶àÇøÓò£¬ÄÇÒ»¸ö¶ÔÏóµÄ´´½¨µ½µ×ÔÚÄĸöÇøÓòÄØ?
3.2 ¶ÔÏó´´½¨ËùÔÚÇøÓò
Ò»°ãÇé¿öÏ£¬Ð´´½¨µÄ¶ÔÏ󶼻ᱻ·ÖÅäµ½EdenÇø£¬Ò»Ð©ÌØÊâµÄ´óµÄ¶ÔÏó»áÖ±½Ó·ÖÅäµ½OldÇø¡£
±ÈÈçÓжÔÏóA£¬B£¬CµÈ´´½¨ÔÚEdenÇø£¬µ«ÊÇEdenÇøµÄÄÚ´æ¿Õ¼ä¿Ï¶¨ÓÐÏÞ£¬±ÈÈçÓÐ100M£¬¼ÙÈçÒѾʹÓÃÁË 100M »òÕß´ïµ½Ò»¸öÉ趨µÄÁÙ½çÖµ£¬Õâʱºò¾ÍÐèÒª¶ÔEdenÄÚ´æ¿Õ¼ä½øÐÐÇåÀí£¬¼´À¬»øÊÕ¼¯(Garbage Collect)£¬ ÕâÑùµÄGCÎÒÃdzÆÖ®ÎªMinor GC£¬Minor GCÖ¸µÄÊÇYoungÇøµÄGC¡£
¾¹ýGCÖ®ºó£¬ÓÐЩ¶ÔÏó¾Í»á±»ÇåÀíµô£¬ÓÐЩ¶ÔÏó¿ÉÄÜ»¹´æ»î×Å£¬¶ÔÓÚ´æ»î×ŵĶÔÏóÐèÒª½«Æä¸´ÖƵ½Survivor Çø£¬È»ºóÔÙÇå¿ÕEdenÇøÖеÄÕâЩ¶ÔÏó¡£
3.3 SurvivorÇøÏê½â
ÓÉͼ½â¿ÉÒÔ¿´³ö£¬SurvivorÇø·ÖΪÁ½¿éS0ºÍS1£¬Ò²¿ÉÒÔ½Ð×öFromºÍTo¡£ ÔÚͬһ¸öʱ¼äµãÉÏ£¬S0ºÍS1Ö»ÄÜÓÐÒ»¸öÇøÓÐÊý¾Ý£¬ÁíÍâÒ»¸öÊǿյġ£
½Ó×ÅÉÏÃæµÄGCÀ´Ëµ£¬±ÈÈçÒ»¿ªÊ¼Ö»ÓÐEdenÇøºÍFromÖÐÓжÔÏó£¬ToÖÐÊǿյġ£ ´Ëʱ½øÐÐÒ»´ÎGC²Ù×÷£¬FromÇøÖжÔÏóµÄÄêÁä¾Í»á+1£¬ÎÒÃÇÖªµÀEdenÇøÖÐËùÓдæ»îµÄ¶ÔÏó»á±»¸´ÖƵ½ToÇø£¬
FromÇøÖл¹ÄÜ´æ»îµÄ¶ÔÏó»áÓÐÁ½¸öÈ¥´¦¡£
Èô¶ÔÏóÄêÁä´ïµ½Ö®Ç°ÉèÖúõÄÄêÁäãÐÖµ£¬´Ëʱ¶ÔÏó»á±»Òƶ¯µ½OldÇø£¬????Eden????From??ûÓдﵽãÐÖµµÄ ¶ÔÏó»á±»¸´ÖƵ½ToÇø¡£ ´ËʱEdenÇøºÍFromÇøÒѾ±»Çå¿Õ(±»GCµÄ¶ÔÏó¿Ï¶¨Ã»ÁË£¬Ã»Óб»GCµÄ¶ÔÏó¶¼ÓÐÁ˸÷×ÔµÄÈ¥´¦)¡£
ÕâʱºòFromºÍTo½»»»½ÇÉ«£¬Ö®Ç°µÄFrom±ä³ÉÁËTo£¬Ö®Ç°µÄTo±ä³ÉÁËFrom¡£ Ò²¾ÍÊÇ˵ÎÞÂÛÈçºÎ¶¼Òª±£Ö¤ÃûΪToµÄSurvivorÇøÓòÊǿյġ£
Minor GC»áÒ»Ö±ÖØ¸´ÕâÑùµÄ¹ý³Ì£¬Ö±µ½ToÇø±»ÌîÂú£¬È»ºó»á½«ËùÓжÔÏó¸´ÖƵ½ÀÏÄê´úÖС£
3.4 OldÇøÏê½â
´ÓÉÏÃæµÄ·ÖÎö¿ÉÒÔ¿´³ö£¬Ò»°ãOldÇø¶¼ÊÇÄêÁä±È½Ï´óµÄ¶ÔÏ󣬻òÕßÏà¶Ô³¬¹ýÁËij¸öãÐÖµµÄ¶ÔÏó¡£
ÔÚOldÇøÒ²»áÓÐGCµÄ²Ù×÷£¬OldÇøµÄGCÎÒÃdzÆ×÷ΪMajor GC¡£
3.5 ¶ÔÏóµÄÒ»±²×ÓÀí½â
ÎÒÊÇÒ»¸öÆÕͨµÄJava¶ÔÏó£¬ÎÒ³öÉúÔÚEdenÇø£¬ÔÚEdenÇøÎÒ»¹¿´µ½ºÍÎÒ³¤µÄºÜÏñµÄСÐֵܣ¬ÎÒÃÇÔÚEdenÇøÖÐÍæÁËͦ³¤Ê±¼ä¡£ÓÐ Ò»ÌìEdenÇøÖеÄÈËʵÔÚÊÇÌ«¶àÁË,ÎҾͱ»ÆÈÈ¥ÁËSurvivorÇøµÄ¡°From¡±Çø£¬×Ô´ÓÈ¥ÁËSurvivorÇø,ÎҾͿªÊ¼Æ¯ÁË£¬ÓÐʱºòÔÚ SurvivorµÄ¡°From¡±Çø£¬ÓÐʱºòÔÚSurvivorµÄ¡°To¡±Çø,¾ÓÎÞ¶¨Ëù¡£Ö±µ½ÎÒ18ËêµÄʱºò£¬°Ö°Ö˵ÎÒ³ÉÈËÁË£¬¸ÃÈ¥Éç»áÉÏ´³´³ÁË¡£ÓÚÊÇÎÒ¾ÍÈ¥ÁËÄêÀÏ´úÄDZß,ÄêÀÏ´úÀÈ˺ܶ࣬²¢ÇÒÄêÁ䶼ͦ´óµÄ£¬ÎÒÔÚÕâÀïÒ²ÈÏʶÁ˺ܶàÈË¡£ÔÚÄêÀÏ´úÀÎÒÉú»îÁË20Äê(ÿ´Î GC¼ÓÒ»Ëê)£¬È»ºó±»»ØÊÕ¡£

3.6 ³£¼ûÎÊÌâ
ÈçºÎÀí½âMinor/Major/Full GC
Minor GC£ºÐÂÉú´ú
Major GC£ºÀÏÄê´ú
Full GC£ºÐÂÉú´ú+ÀÏÄê´ú
ΪʲôÐèÒªSurvivorÇø?Ö»ÓÐEden²»ÐÐÂð?
Èç¹ûûÓÐSurvivor£¬EdenÇøÃ¿½øÐÐÒ»´ÎMinor GC£¬´æ»îµÄ¶ÔÏó¾Í»á±»Ë͵½ÀÏÄê´ú¡£ ÕâÑùÒ»À´£¬ÀÏÄê´úºÜ¿ì±»ÌîÂú£¬´¥·¢Major GC(ÒòΪMajor GCÒ»°ã°éËæ×ÅMinor GC£¬Ò²¿ÉÒÔ¿´×ö´¥·¢ÁËFull GC)¡£ ÀÏÄê´úµÄÄÚ´æ¿Õ¼äÔ¶´óÓÚÐÂÉú´ú£¬½øÐÐÒ»´ÎFull GCÏûºÄµÄʱ¼ä±ÈMinor GC³¤µÃ¶à¡£Ö´ÐÐʱ¼ä³¤ÓÐʲô»µ´¦£¿Æµ·¢µÄFull GCÏûºÄµÄʱ¼äºÜ³¤£¬»áÓ°Ïì´óÐͳÌÐòµÄÖ´ÐкÍÏìÓ¦ËÙ¶È¡£
¿ÉÄÜÄã»á˵£¬ÄǾͶÔÀÏÄê´úµÄ¿Õ¼ä½øÐÐÔö¼Ó»òÕß½ÏÉÙ¿©¡£¼ÙÈçÔö¼ÓÀÏÄê´ú¿Õ¼ä£¬¸ü¶à´æ»î¶ÔÏó²ÅÄÜÌîÂúÀÏÄê´ú¡£ËäÈ»½µµÍFull GCƵÂÊ£¬µ«ÊÇËæ×ÅÀÏÄê´ú¿Õ¼ä¼Ó´ó£¬Ò»µ©·¢ÉúFull GC£¬Ö´ÐÐËùÐèÒªµÄʱ¼ä¸ü³¤¡£
¼ÙÈç¼õÉÙÀÏÄê´ú¿Õ¼ä£¬ËäÈ»Full GCËùÐèʱ¼ä¼õÉÙ£¬µ«ÊÇÀÏÄê´úºÜ¿ì±»´æ»î¶ÔÏóÌîÂú£¬Full GCƵÂÊÔö¼Ó¡£
ËùÒÔSurvivorµÄ´æÔÚÒâÒ壬¾ÍÊǼõÉÙ±»Ë͵½ÀÏÄê´úµÄ¶ÔÏ󣬽ø¶ø¼õÉÙFull GCµÄ·¢Éú£¬SurvivorµÄԤɸѡ±£Ö¤£¬Ö»ÓоÀú16 ´ÎMinor GC»¹ÄÜÔÚÐÂÉú´úÖдæ»îµÄ¶ÔÏ󣬲ŻᱻË͵½ÀÏÄê´ú¡£
ΪʲôÐèÒªÁ½¸öSurvivorÇø?
×î´óµÄºÃ´¦¾ÍÊǽâ¾öÁËË鯬»¯¡£Ò²¾ÍÊÇ˵Ϊʲôһ¸öSurvivorÇø²»ÐÐ?µÚÒ»²¿·ÖÖУ¬ÎÒÃÇÖªµÀÁ˱ØÐëÉèÖÃSurvivorÇø¡£¼ÙÉ裬ÏÖÔÚÖ»ÓÐÒ»¸öSurvivorÇø,ÎÒÃÇÀ´Ä£ÄâÒ»ÏÂÁ÷³Ì£º
¸Õ¸Õн¨µÄ¶ÔÏóÔÚEdenÖУ¬Ò»µ©EdenÂúÁË£¬´¥·¢Ò»´ÎMinor GC£¬EdenÖеĴæ»î¶ÔÏó¾Í»á±»Òƶ¯µ½SurvivorÇø¡£ÕâÑù¼ÌÐøÑ»·ÏÂÈ¥£¬ÏÂÒ»´ÎEdenÂúÁ˵Äʱºò,ÎÊÌâÀ´ÁË£¬´Ëʱ½øÐÐMinor GC£¬EdenºÍSurvivor¸÷ÓÐһЩ´æ»î¶ÔÏó£¬Èç¹û´Ëʱ°ÑEdenÇøµÄ£¬´æ»î¶ÔÏóÓ²·Åµ½SurvivorÇø£¬ºÜÃ÷ÏÔÕâÁ½²¿·Ö¶ÔÏóËùÕ¼ÓеÄÄÚ´æÊDz»Á¬ÐøµÄ£¬Ò²¾Íµ¼ÖÂÁËÄÚ´æË鯬»¯¡£
ÓÀÔ¶ÓÐÒ»¸öSurvivor spaceÊǿյģ¬ÁíÒ»¸ö·Ç¿ÕµÄSurvivor spaceÎÞË鯬¡£
ÐÂÉú´úÖÐEden:S1:S2ΪʲôÊÇ8:1:1?
ÐÂÉú´úÖеĿÉÓÃÄڴ棺¸´ÖÆËã·¨ÓÃÀ´µ£±£µÄÄÚ´æÎª9:1
¿ÉÓÃÄÚ´æÖÐEden:S1ÇøÎª8:1
¼´ÐÂÉú´úÖÐEden:S1:S2 = 8:1:1
4¡¢ÑéÖ¤
4.1 ¶ÑÄÚ´æÒç³ö
³ÌÐò£º
@RestController
public class HeapController {
List list=new ArrayList();
@GetMapping("/heap")
public String heap() throws Exception{
while(true){
list.add(new Person());
Thread.sleep(1);
}
}
} |
¼ÇµÃÉèÖòÎÊý±ÈÈç-Xmx20M -Xms20M
ÔËÐнá¹û£º
Exception in thread "http-nio-8080-exec-2" java.lang.OutOfMemoryError: GC overhead limit exceeded |
4.2 ·½·¨ÇøÄÚ´æÒç³ö
±ÈÈçÏò·½·¨ÇøÖÐÌí¼ÓClassµÄÐÅÏ¢
4.2.1 asmÒÀÀµºÍClass´úÂë
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency> |
public class MyMetaspace extends ClassLoader {
public static List<Class<?>> createClasses() {
List<Class<?>> classes = new ArrayList<Class<?>>();
for (int i = 0; i < 10000000; ++i) {
ClassWriter cw = new ClassWriter(0);
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
"java/lang/Object", null);
MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
"()V", null, null);
mw.visitVarInsn(Opcodes.ALOAD, 0); mw.visitMethodInsn
(Opcodes.INVOKESPECIAL, "java/lang/Object",
"<init>", "()V"); mw.visitInsn(Opcodes.RETURN);
mw.visitMaxs(1, 1);
mw.visitEnd();
Metaspace test = new Metaspace();
byte[] code = cw.toByteArray();
Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
classes.add(exampleClass);
}
return classes;
}
} |
4.2.2 ´úÂë
@RestController
public class NonHeapController {
List<Class<?>> list=new ArrayList<Class<?>>();
@GetMapping("/nonheap")
public String nonheap() throws Exception{
while(true){
list.addAll(MyMetaspace.createClasses());
Thread.sleep(5);
}
}
} |
ÉèÖÃMetaspaceµÄ´óС£¬±ÈÈç-XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=50M
ÔËÐнá¹û£º
java.lang.OutOfMemoryError: Metaspace
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_191]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_191] |
4.3 ÐéÄâ»úÕ»
4.3.1 ´úÂëÑÝʾStackOverFlow
public class StackDemo {
public static long count=0;
public static void method(long i){
System.out.println(count++);
method(i);
}
public static void main(String[] args) {
method(1);
}
} |
ÔËÐнá¹û£º

4.3.2 Àí½âºÍ˵Ã÷
Stack SpaceÓÃÀ´×ö·½·¨µÄµÝ¹éµ÷ÓÃʱѹÈëStack Frame(Õ»Ö¡)¡£ËùÒÔµ±µÝ¹éµ÷ÓÃÌ«ÉîµÄʱºò£¬¾ÍÓпÉÄܺľ¡Stack Space£¬±¬³öStackOverflowµÄ´íÎó¡£
-Xss128k£ºÉèÖÃÿ¸öÏ̵߳ĶÑÕ»´óС¡£JDK 5ÒÔºóÿ¸öÏ̶߳ÑÕ»´óСΪ1M£¬ÒÔǰÿ¸öÏ̶߳ÑÕ»´óСΪ256K¡£¸ù¾ÝÓ¦ÓõÄÏß³ÌËùÐèÄÚ´æ´óС½øÐе÷Õû¡£ÔÚÏàͬÎïÀíÄÚ´æÏ£¬¼õСÕâ¸öÖµÄÜÉú³É¸ü¶àµÄÏ̡߳£µ«ÊDzÙ×÷ϵͳ¶ÔÒ»¸ö½ø³ÌÄÚµÄÏß³ÌÊý»¹ÊÇÓÐÏÞÖÆµÄ£¬²»ÄÜÎÞÏÞÉú³É£¬¾ÑéÖµÔÚ3000~5000×óÓÒ¡£
Ïß³ÌÕ»µÄ´óСÊǸöË«Èн££¬Èç¹ûÉèÖùýС£¬¿ÉÄÜ»á³öÏÖÕ»Òç³ö£¬ÌرðÊÇÔÚ¸ÃÏß³ÌÄÚÓеݹ顢´óµÄÑ»·Ê±³öÏÖÒç³öµÄ¿ÉÄÜÐÔ¸ü´ó£¬Èç¹û¸ÃÖµÉèÖùý´ó£¬¾ÍÓÐÓ°Ïìµ½´´½¨Õ»µÄÊýÁ¿£¬Èç¹ûÊǶàÏ̵߳ÄÓ¦Ó㬾ͻá³öÏÖÄÚ´æÒç³öµÄ´íÎó¡£
|