paulwong

#

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 阅读(899) | 评论 (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 阅读(2216) | 评论 (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 阅读(361) | 评论 (0)编辑 收藏

对象池

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

posted @ 2011-10-23 17:02 paulwong 阅读(330) | 评论 (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 阅读(2804) | 评论 (0)编辑 收藏

HUDSON

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

posted @ 2011-10-15 01:48 paulwong 阅读(144) | 评论 (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 阅读(327) | 评论 (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 阅读(416) | 评论 (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 阅读(948) | 评论 (0)编辑 收藏

分布式事务简述

  随着系统越来越大,不断的模块化和SOA化,你的系统可能被分散于不同的机器上,这时候,你原先的单机本地事务可能已经无法满足你的需求,你可能要跨系统跨资源的去使用事务。这就是分布式事务。
  事务有四个特性:
  1.    原子性
  2.    一致性
  3.    隔离性
  4.    持久性
  具体就不多介绍了,相信大家都能明白ACID特性的基本含义。

事务模型

而一个具体的事务需要涉及到的模型(无论哪种模型)一般由下面几部分组成:
  1. AP 应用程序
  2. RM 资源管理器
  3. TM 事务管理器
这里的资源管理器一般指数据库资源,而事务管理器,大多是由数据库厂商提供。
那么其实在分布式事务中,也应该符合以上事务的特性和模型,只是资源管理器(RM)变得多了起来.

分布式事务介绍

分布式事务最大的问题在于如何确定资源的状态,以及保证一致性,原子性
一般来说分布事务由
  1. 原子提交协议 
  2. 协调器
  3. 参与者
  4. 事务恢复器
  5. 死锁检测器
五部分组成。

原子提交协议指的是如何保证原子提交,一般分为单阶段原子提交协议两阶段原子提交协议三阶段原子提交协议

对于单阶段原子提交协议来说,根本没有办法保证分布式事务的原子性,所以不适用于分布式事务中。

两阶段原子提交协议则是 各种分布式事务实现中使用最广泛的一种原子提交协议:它主要是交事务提交的过程分为二阶段,投票和最终提交。事务由协调者发起一个事务,参与者加入到事务 中后,第一阶段时候,所有的参与者准备资源,并将资源hold住,协调者询问所有的参与者是否可以提交?所有的参与者向协调者响应结果YES/NO,当所 有的协调者都响应YES的时候,协调者才会发起第二阶段,向所有的参与者通知提交事务,当所有的参与者都提交确认会会再通知协调者。至此事务处理完毕。

三阶段提交协议由于协调者与参与者多次进行沟通所以代价很大,一般不会使用。但是它能缩小事务处理“不确定”状态的延迟时间。

所谓“不确定”状态就是指当参与者向协调者反馈可以提交的时候,长时间没有收到协调者的通知,这时候参与者没有办法确定事务最终需要如何处理,所以状态为不确定状态。

协调者,参与者一般通过如下动作来进行通信:
  1. join:由协调者提供,用来注册新的参与者
  2. canCommit:协调者询问参与者是否能够提交
  3. doCommit :协调者通知参与者提交事务
  4. doAbort:协调者通知参与者放弃事务
  5. haveCommit:参与者向协调者确认已经提交事务
  6. getDecision:当处于“不确定”状态时,参与者用来询问协调者事务的目前状态。
对于haveCommit特别说明一下,是当第一阶段的时候,协调者发现长时间参与者没有向协调者反馈事务状态,则协调者会主动调用该接口事务的情况,如果仍然无响应,则会通知所有的参与者放弃该事务。

任何事情都会有意外产生,特别是对于跨系统间的通信更容易产生问题,比如网络异常,机器down机,这个时候就需要事务恢复器来作相应的处理。

对于处于第一阶段的事务,
如果参与者发生意外,则协调者会通知所有的参与者进行事务放弃,但是如果协调者出生故障时,就必须要能 够就行事务恢复,所以协调者必须在开始事务的时候,产生唯一的事务ID,并且对事务进行持久化,在协调者恢复的时候,参够让人参与者继续进行事务。

而对于第二阶段出现的故障,
由于第一阶段进行了资源的个决,则事务认为是必然能成功的,这个事候,如果这个时候参与者发生故障,则协调者需要一套重试机制,让参与者在恢复过来后,能够将事务进行完成或者人工介入。

关于死锁检测器这里就不多描述了,以后有机会再描述。

posted @ 2011-08-22 13:22 paulwong 阅读(255) | 评论 (0)编辑 收藏

仅列出标题
共112页: First 上一页 92 93 94 95 96 97 98 99 100 下一页 Last