少年阿宾

那些青春的岁月

  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 阅读(706) | 评论 (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 阅读(13174) | 评论 (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:打开对年老代的压缩。可能会影响性能,但是可以消除碎片
  • 辅助信息
    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:与上面几个配合使用,把相关日志信息记录到文件以便分析。
  • 常见配置汇总
    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:设置持久代大小
  • 收集器设置
    • -XX:+UseSerialGC:设置串行收集器
    • -XX:+UseParallelGC:设置并行收集器
    • -XX:+UseParalledlOldGC:设置并行年老代收集器
    • -XX:+UseConcMarkSweepGC:设置并发收集器
  • 垃圾回收统计信息
    • -XX:+PrintGC
    • -XX:+PrintGCDetails
    • -XX:+PrintGCTimeStamps
    • -Xloggc:filename
  • 并行收集器设置
    • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
    • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  • 并发收集器设置
    • -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
    • -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
  • 四、调优总结

    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 阅读(501) | 评论 (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 阅读(323) | 评论 (0)编辑 收藏

         摘要: 这些日子要用爪哇语言(Java)做内存数据中心。于是把用 Java 监控运行环境硬件资源的内容复习了一下。爪哇类库提供了 java.util.Runtim 类,主要负责调用爪哇虚拟机(JavaVM)外部的基层操作系统功能、处理基于一种叫钩子的原理的程序、获取系统资源信息以及控制调试信息生成。本文单独利用其获取系统资源信息的功能。java.util.Runtim 类具有以下几个方法和获取系统资源信息...  阅读全文
    posted @ 2012-11-14 13:01 abin 阅读(508) | 评论 (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 阅读(18776) | 评论 (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 阅读(1541) | 评论 (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 阅读(2679) | 评论 (0)编辑 收藏

         摘要: eclipse 有启动参数里设置jvm大小,因为eclipse运行时自己也需要jvm,所以eclipse.ini里设置的jvm大小不是具体某个程序运行时所用jvm的大小,这和具体程序运行的jvm大小无关。     那么怎么才能设置某个程序的jvm大小呢(当然控制台运行的话不会存在这个问题,如:java -Xms256m -Xmx1024m classname,这样就可以把当前程序的jvm...  阅读全文
    posted @ 2012-11-13 14:14 abin 阅读(23443) | 评论 (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 阅读(956) | 评论 (0)编辑 收藏

    仅列出标题
    共50页: First 上一页 21 22 23 24 25 26 27 28 29 下一页 Last