少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #

          Java中是不是父線程阻塞后子線程就無法繼續執行?
          如果不是,該如何實現阻塞父線程但繼續執行子線程?
          不是,這個問題屬于線程調度。
          讓一個線程明確的給另外一個線程運行機會,采用以下方法:
          1.調整線程優先級
          2.讓處于運行狀態的線程調用Thread.sleep()方法
          3.讓處于運行狀態的線程調用Thread.yield()方法
          4.讓處于運行狀態的線程調用另外一個線程的jion()方法
          posted @ 2012-11-16 21:43 abin 閱讀(716) | 評論 (0)編輯 收藏

          spring-data-redis下載地址:
          http://www.springsource.org/download/community?project=Spring%2520Data%2520Redis&version=1.0.1.RELEASE


          //spring-redis.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
          xmlns:cache="http://www.springframework.org/schema/cache"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm"
          xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
          xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd  
              http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
              http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
          <context:annotation-config />
          <context:component-scan base-package="com.abin.lee.spring.redis"></context:component-scan>
          <context:property-placeholder location="classpath:com/abin/lee/spring/redis/redis.properties" />
          <!-- 對象池配置: -->
          <bean
          id="jedisPoolConfig"
          class="redis.clients.jedis.JedisPoolConfig">
          <property
          name="maxActive"
          value="${redis.pool.maxActive}" />
          <property
          name="maxIdle"
          value="${redis.pool.maxIdle}" />
          <property
          name="maxWait"
          value="${redis.pool.maxWait}" />
          <property
          name="testOnBorrow"
          value="${redis.pool.testOnBorrow}" />
          </bean>
          <!-- 工廠實現: -->
          <bean
          id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
          <property
          name="hostName"
          value="${redis.ip}" />
          <property
          name="port"
          value="${redis.port}" />
          <property
          name="poolConfig"
          ref="jedisPoolConfig" />
          </bean>
          <!--模板類: -->
          <bean
          class="org.springframework.data.redis.core.RedisTemplate"
          p:connection-factory-ref="jedisConnectionFactory" />
          </beans>






          //User.java
          package com.abin.lee.spring.redis.pojo;
          import java.io.Serializable;
          public class User implements Serializable {
          /**
          */
          private static final long serialVersionUID = 2668307865623183776L;
          private String uid;
          private String address;
          public User() {
          super();
          }
          public User(String uid, String address) {
          super();
          this.uid = uid;
          this.address = address;
          }
          public String getUid() {
          return uid;
          }
          public void setUid(String uid) {
          this.uid = uid;
          }
          public String getAddress() {
          return address;
          }
          public void setAddress(String address) {
          this.address = address;
          }
          @Override
          public String toString() {
          return "User [uid=" + uid + ", address=" + address + "]";
          }
          @Override
          public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result + ((address == null) ? 0 : address.hashCode());
          result = prime * result + ((uid == null) ? 0 : uid.hashCode());
          return result;
          }
          @Override
          public boolean equals(Object obj) {
          if (this == obj)
          return true;
          if (obj == null)
          return false;
          if (getClass() != obj.getClass())
          return false;
          User other = (User) obj;
          if (address == null) {
          if (other.address != null)
          return false;
          } else if (!address.equals(other.address))
          return false;
          if (uid == null) {
          if (other.uid != null)
          return false;
          } else if (!uid.equals(other.uid))
          return false;
          return true;
          }
          }






          //UserDao.java
          package com.abin.lee.spring.redis.dao;
          import com.abin.lee.spring.redis.pojo.User;
          public interface UserDao {
          /**
          * @param uid
          * @param address
          */
          void save(User user);
          /**
          * @param uid
          * @return
          */
          User read(String uid);
          /**
          * @param uid
          */
          void delete(String uid);
          }





          //UserDaoImpl.java
          package com.abin.lee.spring.redis.dao.impl;
          import java.io.Serializable;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.dao.DataAccessException;
          import org.springframework.data.redis.connection.RedisConnection;
          import org.springframework.data.redis.core.RedisCallback;
          import org.springframework.data.redis.core.RedisTemplate;
          import org.springframework.stereotype.Repository;
          import com.abin.lee.spring.redis.dao.UserDao;
          import com.abin.lee.spring.redis.pojo.User;
          @Repository("userDao")
          public class UserDaoImpl implements UserDao{
          @Autowired
          private RedisTemplate<Serializable, Serializable> redisTemplate;
          @Override
          public void save(final User user) {
          redisTemplate.execute(new RedisCallback<Object>() {
          @Override
          public Object doInRedis(RedisConnection connection)
          throws DataAccessException {
          connection.set(
          redisTemplate.getStringSerializer().serialize(
          "user.uid." + user.getUid()),
          redisTemplate.getStringSerializer().serialize(
          user.getAddress()));
          return null;
          }
          });
          }
          @Override
          public User read(final String uid) {
          return redisTemplate.execute(new RedisCallback<User>() {
          @Override
          public User doInRedis(RedisConnection connection)
          throws DataAccessException {
          byte[] key = redisTemplate.getStringSerializer().serialize(
          "user.uid." + uid);
          if (connection.exists(key)) {
          byte[] value = connection.get(key);
          String address = redisTemplate.getStringSerializer()
          .deserialize(value);
          User user = new User();
          user.setAddress(address);
          user.setUid(uid);
          return user;
          }
          return null;
          }
          });
          }
          @Override
          public void delete(final String uid) {
          redisTemplate.execute(new RedisCallback<Object>() {
          public Object doInRedis(RedisConnection connection) {
          connection.del(redisTemplate.getStringSerializer().serialize(
          "user.uid." + uid));
          return null;
          }
          });
          }
          }


          //UserDaoTest.java
          package com.abin.lee.spring.redis.dao.test;
          import static org.junit.Assert.assertEquals;
          import static org.junit.Assert.assertNull;
          import org.junit.Before;
          import org.junit.Test;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;
          import com.abin.lee.spring.redis.dao.UserDao;
          import com.abin.lee.spring.redis.pojo.User;
          public class UserDaoTest {
          private ApplicationContext app;
          private UserDao userDao;
          @Before
          public void before() throws Exception {
          app = new ClassPathXmlApplicationContext("com/abin/lee/spring/redis/spring-redis.xml");
          userDao = (UserDao) app.getBean("userDao");
          }
          @Test
          public void crud() {
          // -------------- Create ---------------
          String uid = "u123456";
          String address1 = "上海";
          User user = new User();
          user.setAddress(address1);
          user.setUid(uid);
          userDao.save(user);
          // ---------------Read ---------------
          user = userDao.read(uid);
          System.out.println("address1="+user.getAddress());
          assertEquals(address1, user.getAddress());
          // --------------Update ------------
          String address2 = "北京";
          user.setAddress(address2);
          userDao.save(user);
          user = userDao.read(uid);
          System.out.println("address2Save="+user.getAddress());
          assertEquals(address2, user.getAddress());
          // --------------Delete ------------
          userDao.delete(uid);
          user = userDao.read(uid);
          System.out.println("addressdel="+user.getAddress());
          assertNull(user);
          }
          }





          posted @ 2012-11-14 23:17 abin 閱讀(13184) | 評論 (2)編輯 收藏

          前陣子遇到幾個面試題都是關于對Java內存控制的,因此從網上找到這篇文章,希望自己對Java的內存分配有重新的認識

          /usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K -XX:PermSize=300M -XX:MaxPermSize=300M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:GCTimeRatio=19 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log

          1. 堆大小設置
            JVM 中最大堆大小有三方面限制:相關操作系統的數據模型(32-bt還是64-bit)限制;系統的可用虛擬內存限制;系統的可用物理內存限制。32位系統下,一般限制在1.5G~2G;64為操作系統對內存無限制。我在Windows Server 2003 系統,3.5G物理內存,JDK5.0下測試,最大可設置為1478m。
            典型設置:
            • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
              -Xmx3550m:設置JVM最大可用內存為3550M。
              -Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。
              -Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
              -Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
            • java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
              -XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
              -XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
              -XX:MaxPermSize=16m:設置持久代大小為16m。
              -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
          2. 回收器選擇
            JVM給了三種選擇:串行收集器、并行收集器、并發收集器,但是串行收集器只適用于小數據量的情況,所以這里的選擇主要針對并行收集器和并發收集器。默認情況下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動時加入相應參數。JDK5.0以后,JVM會根據當前系統配置進行判斷。
            1. 吞吐量優先的并行收集器
              如上文所述,并行收集器主要以到達一定的吞吐量為目標,適用于科學技術和后臺處理等。
              典型配置
              • java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
                -XX:+UseParallelGC:選擇垃圾收集器為并行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用并發收集,而年老代仍舊使用串行收集。
                -XX:ParallelGCThreads=20:配置并行收集器的線程數,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數目相等。
              • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
                -XX:+UseParallelOldGC:配置年老代垃圾收集方式為并行收集。JDK6.0支持對年老代并行收集。
              • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
                -XX:MaxGCPauseMillis=100:設置每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。
              • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100-XX:+UseAdaptiveSizePolicy
                -XX:+UseAdaptiveSizePolicy
                :設置此選項后,并行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用并行收集器時,一直打開。
          3. 響應時間優先的并發收集器
            如上文所述,并發收集器主要是保證系統的響應時間,減少垃圾收集時的停頓時間。適用于應用服務器、電信領域等。
            典型配置
            • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
              -XX:+UseConcMarkSweepGC:設置年老代為并發收集。測試中配置這個以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此時年輕代大小最好用-Xmn設置。
              -XX:+UseParNewGC:設置年輕代為并行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,所以無需再設置此值。
            • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
              -XX:CMSFullGCsBeforeCompaction:由于并發收集器不對內存空間進行壓縮、整理,所以運行一段時間以后會產生“碎片”,使得運行效率降低。此值設置運行多少次GC以后對內存空間進行壓縮、整理。
              -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片
        1. 輔助信息
          JVM提供了大量命令行參數,打印信息,供調試使用。主要有以下一些:
          • -XX:+PrintGC
            輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]

                            [Full GC 121376K->10414K(130112K), 0.0650971 secs]

          • -XX:+PrintGCDetails
            輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]

                            [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

          • -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可與上面兩個混合使用
            輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
          • -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中斷的執行時間。可與上面混合使用
            輸出形式:Application time: 0.5291524 seconds
          • -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時間。可與上面混合使用
            輸出形式:Total time for which application threads were stopped: 0.0468229 seconds
          • -XX:PrintHeapAtGC:打印GC前后的詳細堆棧信息
            輸出形式:
            34.702: [GC {Heap before gc invocations=7:
            def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
            eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
            from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
            to   space 6144K,   0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
            tenured generation   total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
            the space 69632K,   3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
            compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
               the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
                ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
                rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
            34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
            def new generation   total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
            eden space 49152K,   0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
            from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
            to   space 6144K,   0% used [0x221d0000, 0x221d0000, 0x227d0000)
            tenured generation   total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
            the space 69632K,   4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
            compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
               the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
                ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
                rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
            }
            , 0.0757599 secs]
          • -Xloggc:filename:與上面幾個配合使用,把相關日志信息記錄到文件以便分析。
        2. 常見配置匯總
          1. 堆設置
            • -Xms:初始堆大小
            • -Xmx:最大堆大小
            • -XX:NewSize=n:設置年輕代大小
            • -XX:NewRatio=n:設置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4
            • -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5
            • -XX:MaxPermSize=n:設置持久代大小
        3. 收集器設置
          • -XX:+UseSerialGC:設置串行收集器
          • -XX:+UseParallelGC:設置并行收集器
          • -XX:+UseParalledlOldGC:設置并行年老代收集器
          • -XX:+UseConcMarkSweepGC:設置并發收集器
        4. 垃圾回收統計信息
          • -XX:+PrintGC
          • -XX:+PrintGCDetails
          • -XX:+PrintGCTimeStamps
          • -Xloggc:filename
        5. 并行收集器設置
          • -XX:ParallelGCThreads=n:設置并行收集器收集時使用的CPU數。并行收集線程數。
          • -XX:MaxGCPauseMillis=n:設置并行收集最大暫停時間
          • -XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)
        6. 并發收集器設置
          • -XX:+CMSIncrementalMode:設置為增量模式。適用于單CPU情況。
          • -XX:ParallelGCThreads=n:設置并發收集器年輕代收集方式為并行收集時,使用的CPU數。并行收集線程數。
        7. 四、調優總結

          1. 年輕代大小選擇
            • 響應時間優先的應用盡可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的對象。
            • 吞吐量優先的應用:盡可能的設置大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以并行進行,一般適合8CPU以上的應用。
          2. 年老代大小選擇
            • 響應時間優先的應用:年老代使用并發收集器,所以其大小需要小心設置,一般要考慮并發會話率會話持續時間等一些參數。如果堆設置小了,可以會造成內存碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最優化的方案,一般需要參考以下數據獲得:
              • 并發垃圾收集信息
              • 持久代并發收集次數
              • 傳統GC信息
              • 花在年輕代和年老代回收上的時間比例
          3. 減少年輕代和年老代花費的時間,一般會提高應用的效率
          4. 吞吐量優先的應用:一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。
          5. 較小堆引起的碎片問題
            因為年老代的并發收集器使用標記、清除算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合并,這樣可以分配給較大的對象。但是,當堆空間較小時,運行一段時間以后,就會出現“碎片”,如果并發收集器找不到足夠的空間,那么并發收集器將會停止,然后使用傳統的標記、清除方式進行回收。如果出現“碎片”,可能需要進行如下配置:
            • -XX:+UseCMSCompactAtFullCollection:使用并發收集器時,開啟對年老代的壓縮。
            • -XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這里設置多少次Full GC后,對年老代進行壓縮
          6. jvm的內存限制

                  windows2003是1612M



          http://www.cnblogs.com/edwardlauxh/archive/2010/04/25/1918603.html
          posted @ 2012-11-14 13:48 abin 閱讀(509) | 評論 (0)編輯 收藏

          典型JVM參數設置: 
          
          java -Xmx3550m -Xms3550m -Xmn2g -Xss128k 
          
          -Xmx3550m:設置JVM最大可用內存為3550M。 
          
          -Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。 
          
          -Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。 
          
          -Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
          
          java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 
          
          -XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5 
          
          -XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6 
          
          -XX:MaxPermSize=16m:設置持久代大小為16m。 
          
          -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
          posted @ 2012-11-14 13:40 abin 閱讀(330) | 評論 (0)編輯 收藏

               摘要: 這些日子要用爪哇語言(Java)做內存數據中心。于是把用 Java 監控運行環境硬件資源的內容復習了一下。爪哇類庫提供了 java.util.Runtim 類,主要負責調用爪哇虛擬機(JavaVM)外部的基層操作系統功能、處理基于一種叫鉤子的原理的程序、獲取系統資源信息以及控制調試信息生成。本文單獨利用其獲取系統資源信息的功能。java.util.Runtim 類具有以下幾個方法和獲取系統資源信息...  閱讀全文
          posted @ 2012-11-14 13:01 abin 閱讀(514) | 評論 (0)編輯 收藏

          方法一:
          # cd $CATALINA_HOME  -> 進入到tomcat安裝目錄下(或用其他command進入)

          # more RELEASE-NOTES -> 即可看到

           上面得到的信息準確的前提:沒有打新的tuning patch

          [abin@abin tomcat]$ more RELEASE-NOTES
          ================================================================================
            Licensed to the Apache Software Foundation (ASF) under one or more
            contributor license agreements.  See the NOTICE file distributed with
            this work for additional information regarding copyright ownership.
            The ASF licenses this file to You under the Apache License, Version 2.0
            (the "License"); you may not use this file except in compliance with
            the License.  You may obtain a copy of the License at

                http://www.apache.org/licenses/LICENSE-2.0

            Unless required by applicable law or agreed to in writing, software
            distributed under the License is distributed on an "AS IS" BASIS,
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            See the License for the specific language governing permissions and
            limitations under the License.
          ================================================================================

          $Id: RELEASE-NOTES 786654 2009-06-19 20:25:01Z markt $


                               Apache Tomcat Version 6.0.29
                                      Release Notes


          =============================
          KNOWN ISSUES IN THIS RELEASE:
          =============================






          方法二:
          [abin@abin bin]$ ./version.sh
          /app/jiekou3/bin/catalina.sh: line 86: SET: command not found
          Using CATALINA_BASE:   /app/jiekou3
          Using CATALINA_HOME:   /app/jiekou3
          Using CATALINA_TMPDIR: /app/jiekou3/temp
          Using JRE_HOME:        /usr/jdk1.6
          Using CLASSPATH:       /app/jiekou3/bin/bootstrap.jar
          Server version: Apache Tomcat/6.0.29
          Server built:   July 19 2010 1458
          Server number:  6.0.0.29
          OS Name:        Linux
          OS Version:     2.6.32-71.el6.x86_64
          Architecture:   amd64
          JVM Version:    1.6.0_26-b03
          JVM Vendor:     Sun Microsystems Inc.




          方法三:
          [abin@abin bin]$ sh version.sh
          /app/jiekou3/bin/catalina.sh: line 86: SET: command not found
          Using CATALINA_BASE:   /app/jiekou3
          Using CATALINA_HOME:   /app/jiekou3
          Using CATALINA_TMPDIR: /app/jiekou3/temp
          Using JRE_HOME:        /usr/jdk1.6
          Using CLASSPATH:       /app/jiekou3/bin/bootstrap.jar
          Server version: Apache Tomcat/6.0.29
          Server built:   July 19 2010 1458
          Server number:  6.0.0.29
          OS Name:        Linux
          OS Version:     2.6.32-71.el6.x86_64
          Architecture:   amd64
          JVM Version:    1.6.0_26-b03
          JVM Vendor:     Sun Microsystems Inc.

          posted @ 2012-11-14 11:13 abin 閱讀(18785) | 評論 (1)編輯 收藏

          import java.io.*;
          import java.util.*;
          import java.util.zip.ZipOutputStream;
          import java.util.zip.ZipEntry;
          import java.util.zip.ZipFile;
          public class FileMgr {
          public FileMgr() {
          }
          /**
             * 壓縮文件
             * @param srcfile File[] 需要壓縮的文件列表
             * @param zipfile File    壓縮后的文件
             */
          public static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) {
              byte[] buf = new byte[1024];
              try {
                // Create the ZIP file
                ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
                // Compress the files
                for (int i = 0; i < srcfile.length; i++) {
                  FileInputStream in = new FileInputStream(srcfile[i]);
                  // Add ZIP entry to output stream.
                  out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                  // Transfer bytes from the file to the ZIP file
                  int len;
                  while ( (len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                  }
                  // Complete the entry
                  out.closeEntry();
                  in.close();
                }
                // Complete the ZIP file
                out.close();
                System.out.println("壓縮完成.");
              }
              catch (IOException e) {
                e.printStackTrace();
              }
          }
          /**
             * 解壓縮
             * @param zipfile File 需要解壓縮的文件
             * @param descDir String 解壓后的目標目錄
             */
          public static void UnZipFiles(java.io.File zipfile, String descDir) {
              try {
                // Open the ZIP file
                ZipFile zf = new ZipFile(zipfile);
                for (Enumeration entries = zf.entries(); entries.hasMoreElements(); ) {
                  // Get the entry name
                  ZipEntry entry = ( (ZipEntry) entries.nextElement());
                  String zipEntryName = entry.getName();
                  InputStream in = zf.getInputStream(entry);
                  // System.out.println(zipEntryName);
                  OutputStream out = new FileOutputStream(descDir + zipEntryName);
                  byte[] buf1 = new byte[1024];
                  int len;
                  while ( (len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                  }
                  // Close the file and stream
                  in.close();
                  out.close();
                  System.out.println("解壓縮完成.");
                }
              }
              catch (IOException e) {
                e.printStackTrace();
              }
          }
          }


          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Jonthanoscar/archive/2007/08/09/1733812.aspx






          測試方法(junit4測試):

          package lc.abin.lee.basic.zip.test;

          import java.io.File;

          import lc.abin.lee.basic.zip.FileMgr;

          import org.junit.AfterClass;
          import org.junit.BeforeClass;
          import org.junit.Test;

          public class testFileZip {
           @BeforeClass
           public static void init(){
            System.out.println("initialize zip");
           }
           @Test
           public void testCreateZIP(){
            File in=new File("D:\\abin.zip");
            File[] file=new File[]{in};
            File zip=new File("D:\\abin.zip");
            FileMgr mgr=new FileMgr();
            mgr.ZipFiles(file, zip);
           }
           @Test
           public void testParseZIP(){
            File in=new File("D:\\abin.zip");
            String filePath="D:/home/";
            FileMgr mgr=new FileMgr();
            mgr.UnZipFiles(in, filePath);
           }
           
           @AfterClass
           public static void destroy(){
            System.out.println("destroy zip");
           }
          }

          posted @ 2012-11-13 23:25 abin 閱讀(1550) | 評論 (0)編輯 收藏

          最近由于項目需要,需要遠程調試代碼,由于用的是tomcat7,和tomcat6的jpda 不一樣,tomcat7已經把jpda配置的屬性在catalina.sh/catalina.bat里面已經寫好了,我們不需要向tomcat6那樣去設置參數。默認的端口為8000端口。

          剛開始在網上找來想關文章,都說是在catalina文件頭加一行就是jpda 參數的代碼,其實不用,我們直接用 catalina.sh jpda start 這是xp系統,如果Linux 就是 catalina.bat jpda start命令這樣我們就可以用eclipse 遠程debug了,如果連不上,要看服務器是不是開啟防火墻了(iptables) 可以用命令 service iptables status 查看是否開啟,用service iptables stop停掉防火墻,既可以連上了。就可以開始調試了。

          寫此文是方便用到tomcat7的同行的兄弟們。
          posted @ 2012-11-13 21:25 abin 閱讀(2683) | 評論 (0)編輯 收藏

               摘要: eclipse 有啟動參數里設置jvm大小,因為eclipse運行時自己也需要jvm,所以eclipse.ini里設置的jvm大小不是具體某個程序運行時所用jvm的大小,這和具體程序運行的jvm大小無關。     那么怎么才能設置某個程序的jvm大小呢(當然控制臺運行的話不會存在這個問題,如:java -Xms256m -Xmx1024m classname,這樣就可以把當前程序的jvm...  閱讀全文
          posted @ 2012-11-13 14:14 abin 閱讀(23451) | 評論 (1)編輯 收藏

          下載的windows版本是redis-2.0.2,解壓到D盤下:

          D:\redis-2.0.2


          進到該目錄下,有下列文件:

           redis-server.exe:服務程序

             redis-check-dump.exe:本地數據庫檢查

             redis-check-aof.exe:更新日志檢查

             redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送M個 SETs/GETs 查詢 (類似于 Apache 的ab 工具).

          啟動Redis服務(conf文件指定配置文件,若不指定則默認):

          D:\redis-2.0.2>redis-server.exe redis.conf



          啟動cmd窗口要一直開著,關閉后則Redis服務關閉

          這時服務開啟著,另外開一個窗口進行,設置客戶端:

          D:\redis-2.0.2>redis-cli.exe -h 202.117.16.133 -p 6379

          然后可以開始玩了:



          --------------------------------------------------------------------------------------------------------------------------------

           

          Redis提供了多種語言的客戶端,包括Java,C++,python。

           

          Redis官網上推薦的Java包是Jedis,去下載Jedis,在Java項目中導入Jedis包,開始發現有錯誤,是因為缺少org.apache.commons這個包,

          去網上找此包,下載導入后,Jedis就沒有錯誤了。


          可以開始了,用Jedis來操作Redis:

          package test;
          import redis.clients.jedis.Jedis;
          public class Client {
              /**
               * @param args
               */
              public static void main(String[] args) {
                  // TODO Auto-generated method stub
                  Jedis jj = new  Jedis("localhost");
                  jj.set("key1", "I am value 1");
                  String ss = jj.get("key1");
                  System.out.println(ss);
              }
              
          }

          posted @ 2012-11-12 20:45 abin 閱讀(963) | 評論 (0)編輯 收藏

          僅列出標題
          共50頁: First 上一頁 21 22 23 24 25 26 27 28 29 下一頁 Last 
          主站蜘蛛池模板: 许昌市| 巴中市| 成武县| 邯郸市| 平定县| 四会市| 揭西县| 长春市| 澄江县| 商丘市| 丁青县| 铜山县| 庆阳市| 台东县| 宁城县| 逊克县| 龙泉市| 昌邑市| 西乌珠穆沁旗| 蓬安县| 武陟县| 安泽县| 元阳县| 宜州市| 龙海市| 银川市| 临沧市| 平阳县| 金沙县| 阜阳市| 积石山| 安陆市| 东乌| 磐石市| 古丈县| 临夏市| 泊头市| 德钦县| 府谷县| 读书| 文化|