paulwong

#

JDK线程查看工具

JDK和LINUX提供的查看当前运行的线程的工具: 
  1. KILL
    kill -3 [pid]:线程相关信息会列在Console上
  2. JSTACK
    jstack [pid]:查看线程运行状况,如等锁,运行等
  3. JCONSOLE
    jconsole -pluginpath [JTop.jar]:增加一个JTOP的标签,可查看所有线程
    TthreadXMBean:在JCONSOLE中访问此BEAN即可

posted @ 2011-10-27 00:04 paulwong 阅读(1368) | 评论 (0)编辑 收藏

JDK内存管理工具比较

JDK自带了不少查看和管理内存的工具:
  1. JMAP
    jmap -heap [pid] : 文字形式查看JVM中堆内存,非堆内存等大小情况
    jmap -histo [pid] : 文字形式查看各种类占内存大小情况,但粒度只去到[C这种
    jmap -dump:format=b,file=文件名 [pid] : DUMP出内存快照,给其他工具分析内存提供依据
  2. JHAT
    jhat -J-Xms1024M 文件名:分析DUMP文件,并将结果以http://ip:7000向外提供,可具体到哪些对象
  3. MAT
    由于jhat分析大文件时速度慢,因此引入Eclipse Memory Analyzer,速度和功能强很多
  4. JSTAT
    jstat -gcutil [pid]:查看FULL GC的次数和消耗时间,统计
  5. JCONSOLE
    以图形方式查看内存、线程、类、MBEAN等信息
  6. JVISUALVM
    是JCONSOLE的升级版,可查看内存、线程、各对象占内存的大小,JMAP/JHAT能做的都可以做到

能用图形查看的就用图形方式查看,不能的就用文字形式代替。

posted @ 2011-10-26 23:51 paulwong 阅读(933) | 评论 (0)编辑 收藏

配置远程JCONSOLE

JDK自带工具JCONSOLE,可以以图形界面远程监控JVM的情况,也可作相应的一些操作。
1、修改Tomcat的启动语句,将bin/catalina.sh文件vi编辑:
将原
JAVA_OPTS="-Xmx1024M -Xms512M -Xss3M"
export JAVA_OPTS
调整为
JAVA_OPTS="-Xmx1024M -Xms512M -Xss3M -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
export JAVA_OPTS
如果是JBOSS,还需加这一行
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=10.0.122.132",如果不加就连不上

检查LINUX环境:
运行:hostname -i,如果返回127.0.0.1,则要改/etc/sysconfig/network里的HOSTNAME为NEWHOST,再在/etc/hosts里增加一行本机IP对应NEWHOST的值。
清除防火墙的所有东西:iptables -F!!
参考:http://dikar.iteye.com/blog/534109

2、修改jmx配置文件
目录切换至JAVA_HOME所在目录
/jre/lib/management下,
a、将jmxremote.access、jmxremote.password.template权限调整为读写;
chmod 600 jmxremote.password.template
chmod 600 jmxremote.access
b、jmxremote.password.template文件重命名
mv jmxremote.password.template jmxremote.password
c、vi jmxremote.password
去掉
# monitorRole QED
# controlRole R&D
的#号(Solaris下可编辑模式下,可以使用x删除光标标记处字符)
:wq 保存操作
3、启动Tomcat
./catalina.sh run

4、查看JMX启动情况
netstat -a | grep -i 9999 查看端口占有情况
如机器9999端口被其他程序占用,可调整端口-Dcom.sun.management.jmxremote.port=????

5、客户端机器可通过jconsole或visualvm对其进行监控
使用JMX方式,输入url 用户名(controlRole)、密码(R&D)即可访问
url:远程主机IP:9999
用户名及密码(参考jmxremote.password文件) monitorRole只能读,controlRole能读写

配置中的安全原因出错,由于密码是以明文的方式保存在:jmxremote.password中,所以对此文件只能有所有者都读取,其他人都不能读取。WINDOWS下的设置情况见:http://1985wanggang.blog.163.com/blog/static/77638332010731101726156/

JCONSOLE使用手册:
1.5:http://blog.sina.com.cn/s/blog_5dc29fcc0100xiex.html
1.6:http://hornetblog.sinaapp.com/?p=5

posted @ 2011-10-26 22:31 paulwong 阅读(2236) | 评论 (0)编辑 收藏

JVM参数调优

JVM中用来放NEW出来的对象的内存叫堆内存,用来放CLASS等静态的对象的内存叫非堆内存,如果不加指定,默认情况下就几十兆。当遇上一些饭量大的家伙,如POI,导出上万条数据时,就会报内存溢出。所以在生产环境要指定这些内存的大小。

-server
一定要作为第一个参数,会使JVM启动速度变慢,但会显著提升JVM性能

-Xms<size>
设置初始化时堆内存大小,有多大就设多大。设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx<size>
设置堆内存最大值,有多大就设多大

-XX:PermSize=300M
设置初始化时非堆内存大小,一般为总内存的1/8

-XX:MaxPermSize=300M 
设置非堆内存最大值,一般为总内存的1/4

-Xmn2g:设置年轻代大小为2G.整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8.

-Xss128k: 设置每个线程的堆栈大小.JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右.

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代).设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值.设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxTenuringThreshold=0: 设置垃圾最大年龄.如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论.

回收器选择
JVM给了三种选择:串行收集器,并行收集器,并发收集器,但是串行收集器只适用于小数据 量的情况,所以这里的选择主要针对并行收集器和并发收集器.默认 情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数.JDK5.0以后,JVM会根据当前系统配置进行判断.
吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等.
典型配置:

-XX:+UseParallelGC
选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.

-XX:ParallelGCThreads=20
配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收.此值最好配置与处理器数目相等.

-XX:+UseParallelOldGC
配置年老代垃圾收集方式为并行收集.JDK6.0支持对年老代并行收集.

-XX:MaxGCPauseMillis=100
设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.

-XX:+UseAdaptiveSizePolicy
设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.

参考资料


Tomcat – Java.Lang.OutOfMemoryError: PermGen Space
http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/


实例讲解JVM参数调优的八条经验
http://developer.51cto.com/art/200907/134761.htm

posted @ 2011-10-25 20:43 paulwong 阅读(402) | 评论 (0)编辑 收藏

对象池

     摘要: 如果一个B/S的应用,并发量在2000以上时,新建的对象累积会占用大量内存,当超过一定数量的时候,会报内存不够,使用享元模式就可以解决这一问题,也就是建立对象池。现在的方案可以使用Apache Commons Pool。一、基本String对象测试 Code highlighting produced by Actipro CodeHighlighter (freeware) htt...  阅读全文

posted @ 2011-10-23 17:02 paulwong 阅读(365) | 评论 (0)编辑 收藏

T60升级内存的问题

最近T60使用ECLIPSE时老报内存不够,机器原本用的是2G的内存,因此打算升级内存,看了网上的各种文章,决定采用直接换成2根2G,组成4G的内存使用,由于之前说法,32位的操作系统只能认3G的内存,有1G是没用上的,结果也是这样,但说装上RAMDISK后,可以将那1G内存转成内存硬盘,给虚拟内存用,因此也不会浪费,结果试了N多次,虚拟硬盘用的内存不是额外的那1G,最后查资料,结论如下:如果要他显示4G要满足如下条件:

1. 要在PC中使用超过4GB的内存,需要同时满足以下若干条件
(1)主板配置有支持至少8GB内存寻址的芯片组(例如Intel P965/P975)
(2)CPU支持X64指令集(例如Intel Core2处理器)
(3)BIOS支持memory remapping
(4)使用64bit的操作系统(或支持物理内存扩展技术的32bit操作系统)

2. Intel 945芯片组或更早期的芯片组,受到32bit的限制,最大只能寻址到4GB,也就是说只能访问4GB以内的地址。但是这4GB地址并不是完全留给内存使用的,与此同时,各种接口、IO设备都还需要分配大量的寻址空间(例如显卡通常就要占用数百MB),所以最后留给系统物理内存这一硬件的寻址空间,就只剩下3GB多一些。而操作系统也只能识别到这么多的物理内存。因此,如果PC系统的硬件达不到以上第一点中的(1)(2)(3)条时,即使在系统中安装超过4GB的内存,能够被识别的物理内存也只有4GB,而留给操作系统使用的只有3GB多一些。

3. 操作系统对识别的内存数也有影响。32bit的操作系统只具备4GB的寻址能力,即使硬件满足上述使用4GB内存的条件,限于操作系统的寻址空间限制,必须要保留数百MB的寻址空间给各种接口和IO设备,因此操作系统仍然最多只可以用到3GB多一些的物理内存。而64bit的操作系统下,因为把各种接口和IO设备所占用的地址空间移到更靠后的地址段,因此4GB物理内存可以完全寻址,也就是完全识别使用。再延伸一下,同理可以推断,假设某64bit操作系统的最大寻址能力是8GB,而系统安装了8GB的物理内存,那么操作系统可以识别并使用的内存也就是7GB多一些。

芯片组的问题,浪费了1G内存。

posted @ 2011-10-15 23:49 paulwong 阅读(2827) | 评论 (0)编辑 收藏

HUDSON

http://digitalsonic.iteye.com/blog/610401

posted @ 2011-10-15 01:48 paulwong 阅读(158) | 评论 (0)编辑 收藏

深入浅出JAAS

JAAS:JAVA的认证和权限系统,是JDK级的,并且属于J2EE的规范之一,容器必须要实现的。
作用就要规范外部(对于J2EE程序,外部指浏览器客户端,对于J2SE程序,外部指调用程序)如果要作用JDK里面的东西时的情况。
认证:
  1. 把验证代码写在LOGINMODULE的实现类的login()方法中
  2. 通过配置文件和加JAVA_OTPS的方式告诉JDK类全名
  3. 告诉JDK需要使用认证的地方
    如果是J2SE的程序,在需要认证的地方加上LOGINCONTEXT的login(),JDK会回调上面的login()方法,不通过则抛出excetion,通过则将客户端相关信息保存到SUBJECT中;
    如果是J2EE程序,则在WEB.XML中配置相应元素,容器会回调上面的login()方法,如果不通过则导到登录页面,通过则将客户端相关信息保存到SUBJECT中
验证权限:
  1. 写好权限策略内容:以PRINCALS为单位,列出这个PRINCALS能做的事:PERMISSION子类列表,PERMISSION子类实现了要保护的对象,关键识别参数,操作保护方法,保存为策略文件
  2. 把涉及到保护对象操作的代码放到PrivilegedAction实现类的run()方法内
  3. 通过配置文件和加JAVA_OTPS的方式告诉JDK资源文件全名,策略文件全名和需要启用SECURITY MANAGER 
  4. 在需要验证权限的地方,调用Subject.doAsPrivileged(Subject, PrivilegedAction, null),JDK或容器根据策略文件该SUBJECT是有操作要保护对象的权限,没有则则抛出excetion,有则执行
相关实例可参照http://download.oracle.com/javase/1.4.2/docs/guide/security/jaas/tutorials/GeneralAcnAndAzn.html

 

posted @ 2011-10-06 11:38 paulwong 阅读(363) | 评论 (0)编辑 收藏

淘宝面试记


最过三个星期的面试,人生的第一次转折终于尘埃落定,虽然过程很平坦,但还是颇有感慨。

有喜就有悲,其中拒了四个公司的offer,其中有一家实在是不情愿,而且自己还有些失落,不过为了自己的目标,选择去杭州淘宝。人生就是这样,很多东西是缘分注定了的。
先说下我自己的情况,本人毕业三流二本大学,非计算机专业,因 个人兴趣而走向java这条路,其中也经历过培训机构,但个人感觉培训机构教的太浅,而且更多教会大家忽悠,导致了很多人心浮气躁,学习还是靠自己,如果 不去多写和多想,肯定在技术这条路上会出现瓶颈,当然不是全针对技术这条路,这个社会本来就是浮躁的,当然一批浮躁的人也成功了。在这二年学习路上,我给 自己定无数个小目标,然后一一去实现,去研究,再加上兴趣和激情,感觉这二年对互联网及java及oo有一积累了不少知识,感觉此时时机已经成熟,所以开 始了为期三周的漫长而又煎熬的面试旅程。

面试从一个创业公司开始的,刚开始就是想积累下面试经验,毕竟 本人属于内敛型,心里虽有千言,而有时也无从娓娓向面试官道来。所以就先锤炼一番,然后再向心中的理想公司淘宝进军。第一个创业的公司面试我的人是个博 士,理论型的,他研究的分布式存储方向,正好也是我感兴趣的东西。所以聊得很高兴,然后接着让我去见公司老板。当然创业公司对我这种人来说,没有太大的吸 引力,虽然他们很有前景,但我已定下目标,所以后面就拒了这个offer。后面接而连三面了几个公司,包括复试,基本上技术面试都没有太大难度,无非就是 问的比较浅的GC,类加载,集合,线程,tomcat优化,性能,互联网在不同时候的架构,设计模式,ssh之类的,都没有太深入去问,就这样过了二周, 又先后拿到3个offer,然后就直接拒掉了一个台湾公司的,没办法,对台湾公司有阴影。其它2个offer都给了不错的待遇。这时我也通过这么多面试积 累了不少面试经验,知道如何去表达个人观点,如何去描述项目和相关技术,如何阐述思想的东西。我于是以一颗憧憬的心向淘宝投了个人简历,接下来在不经意之 间开始淘宝紧感促的面试之旅。
话说先赞下淘宝的办事效率,从我投简历的那晚上开始,第二天就接到电话面试,然后又隔了一天,接到第二轮视频面试的电话,隔天进行视频面试,视 频面试完,下个周一又接到杭州总部面试的通知,总部面试完,隔天又收到面试通过的EMail,全后经历三次5轮面试,时间刚好一周,不像有些公司,前后要 经历一到二个月的等待。
接下来说下淘宝面试的经历,淘宝面试官在技术面试时,总体上是按你简历上写的东西一直面下来,时间大概一个小时多一点点,所以在写简历时一定要 认真仔细想清楚,多了给人不诚实的感觉,少了估计面试的机会都没有。其中有几个点必问,JVMGC深层机制、类加载,包括Tomcat和Jboss的、线 程相关的如离线锁,互斥同步,java主线程和工作线程机制,concurrent包下的锁和sync关键字一些区别,然后就是concurrent包原 代码的考查、接着就是数据结构重点是hashmap的结构问题然后大到分布式缓存hash算法的一些应用、然后就是设计模式及在你们项目中的运用,你对设 计模式的理解,如一些模式之间的差别。然后就是互联网相关的东西了,如从前到后的架构,大数据量下并发同步方法,异步思想的理解,NIO的运 用,CAP/BASE思想在淘宝如订单这块的应用,还有如果你有NOSQL或Hadoop相关知识,他们可能会问Nosql中HBase中HMaster 如何保证单点,Hadoop的一些基本运用,如果你没在简历上写可能不会问的。问题可能是不同的面试官问的东西不一样,不过对java基础及思想问题都必 不可少,还有对项目的理解一定要到位,要不很容易被问得不知所措。在经历了3轮面试后,接下来就是hr的部门老大面试,这一关无非就是不按简历上来自我介 绍,优点缺点总结,职业规范,当前职位薪水,兴趣爱好等,不过最主要是的部门老大这,一般他会给你些紧张的氛围,然后故意问些你不可能不注意的领域,如你 们公司做的东西和竟争对手相比你们的优点和缺点,你对你对手公司平台的了解善等,过了这轮面试基本上就确定了你面试是否成功,然后接下来就是人品面试了, 进了一个很随和的人,谈项目,谈事业,谈人生,谈各种,反正是谈笑风声,这时基本上就确定你是否完全通过面试。大概就这样,在和最后一位面试官的谈笑风声 中,结束了所有面试,然后面试官心平气和的送我出去,并说最快明天有通知,然后大家握手告别,就这样,淘宝的面试之旅全部结束。

果真第二天收到面试通过的email,然后接下来就是等hr电话谈待遇。待遇多少就不太重要了,毕竟淘宝是我的目标,也是个做java很不错的地方,借用别人的一句话,多点不会发财,少点不会饿死,关键是兴趣就是工作,工作就是兴趣,人生也就这样,做到自己的定位很重要。
http://blog.csdn.net/dimly113/article/details/6541686

posted @ 2011-09-16 14:57 paulwong 阅读(451) | 评论 (0)编辑 收藏

分布式事务JTA,JCA,JTS

在分布式的J2EE应用中,可能会碰到以下情景:
在一个方法中,会调用到好几个数据源,如不同的DB,JMS,内容仓库等,如何使这些不同的数据操作都能处于同一事务中呢?于是便有了JTA/JCA这种标准。

  1. 数据库,JMS或内容仓库抽象为RESOURCE
  2. 在Resource之上加一层Resource Adapter(在JTA中称为Resource Manager),统一数据操作等的方法名称。在应用服务器中配置数据源驱动程序中,通常有一项可选的:XARESOURCE,即是指这一Adapter,每一RESOURCE均有一Adapter对应,如内容仓库中则有JCA RESOURCE。
  3. 在Resource Adapter之上增加一层Connector Manager(在JTA中称为Traction),负责将数据操作加入到事务队伍中。
  4. Transaction Manager(由应用服务器实现)/UserTraction(由用户控制),开始事务边界,总体对事务队列中的事务进行提交,或回滚。



J2EE则是通过此机制来达到事务的统一。

参考:http://zhongl.iteye.com/blog/317041

posted @ 2011-09-09 00:25 paulwong 阅读(998) | 评论 (0)编辑 收藏

仅列出标题
共118页: First 上一页 98 99 100 101 102 103 104 105 106 下一页 Last