java.lang.OutOfMemoryError, PermGen space

‘java.lang.OutOfMemoryError, PermGen space’ http://peak.iteye.com/blog/52606 JavaTomcatJVMLinuxWeb 这个问题是我的工程中加入了Birt报表在Linux环境下运行出现的问题,从网上搜索了一下看到这文章发现并不是由于Birt的原因造成的 引用 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出: 这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 改正方法: -Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 在tomcat中redeploy时出现outofmemory的错误. 可以有以下几个方面的原因: 1,使用了proxool,因为proxool内部包含了一个老版本的cglib. 2, log4j,最好不用,只用common-logging 3, 老版本的cglib,快点更新到最新版。 4,更新到最新的hibernate3.2 这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。 一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 手动设置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.sh 在"echo “Using CATALINA_BASE: $CATALINA_BASE"“上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建议: 将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。 二、java.lang.OutOfMemoryError: Java heap space ...

2012-05-28 · 1 min · 138 words · -

进程优先级

进程优先级 linux 进程优先级 为什么要有进程优先级?这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情。因为有的进程相对重要,而有的进程则没那么重要。 本文作者: 邹立巍 Linux系统技术专家。目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架构规划设计。 曾任新浪动态应用平台系统架构师,负责微博、新浪博客等重点业务的内部私有云平台架构设计和运维管理工作。 进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的。就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。 从这个角度看,进程优先级其实也跟cgroup的cpu限制一样,都是一种针对cpu占用的QOS机制。我曾经一直很困惑一点,为什么已经有了优先级,还要再设计一个针对cpu的cgroup?得到的答案大概是因为,优先级这个值不能很直观的反馈出资源分配的比例吧? 不过这不重要,实际上从内核目前的进程调度器cfs的角度说,同时实现cpushare方式的cgroup和优先级这两个机制完全是相同的概念,并不会因为增加一个机制而提高什么实现成本。既然如此,而cgroup又显得那么酷,那么何乐而不为呢? 在系统上我们最熟悉的优先级设置方式是nice和renice命令。那么我们首先解释一个概念,什么是: NICE值 nice值应该是熟悉Linux/UNIX的人很了解的概念了,我们都知它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。我们可以通过nice命令来对一个将要执行的命令进行nice值设置,方法是: [root@zorrozou-pc0 zorro]# nice -n 10 bash 这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。我们可以通过nice命令直接查看到当前shell的nice值 [root@zorrozou-pc0 zorro]# nice 10 对比一下正常情况: [root@zorrozou-pc0 zorro]# exit 推出当前nice值为10的bash,打开一个正常的bash: [root@zorrozou-pc0 zorro]# bash [root@zorrozou-pc0 zorro]# nice 0 另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关manpage。 需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级priority这个说法。当然,nice和renice的man手册中,也说的是priority这个概念,但是要强调一下,请大家真的不要混淆了系统中的这两个概念,一个是nice值,一个是priority值,他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。 我们看这个命令: [root@zorrozou-pc0 zorro]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 6924 5776 0 80 0 - 17952 poll_s pts/5 00:00:00 sudo 4 S 0 6925 6924 0 80 0 - 4435 wait pts/5 00:00:00 bash 0 R 0 12971 6925 0 80 0 - 8514 - pts/5 00:00:00 ps 大家是否真的明白其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令: ...

2012-05-26 · 5 min · 1065 words · -

getconf

getconf, 查看系统变量 我们时常需要查询系统相关的信息,比如页面大小,整数大小之类,如果编写程序去计算会比较繁琐,这里有一个很有用的命令,可以用来获取系统相关信息。它就是 getconf。 getconf 用途将系统配置变量值写入标准输出,比如: getconf PAGE_SIZE 查看系统内存分页大小 getconf LONG_BIT 看linux是32位还是64位最简单的方法 getconf -a 查看全部系统变量 getconf INT_MAX 2147483647 getconf LONG_BIT 64 可以取得的相关信息如下(参考相关资料,在又在版本上会有些不同): _CS_PATH Value for the PATH environment variable used to find commands. ARG_MAX Maximum length, in bytes, of the arguments for one of the exec subroutines, including environment data. ARG_MAX 值 不能改, 要修改只能重新编译内核 BC_BASE_MAX Maximum value allowed for the obase variable with the bc command. BC_DIM_MAX Maximum number of elements permitted in an array by the bc command. BC_SCALE_MAX Maximum value allowed for the scale variable with the bc command. BC_STRING_MAX Maximum length of a string constant accepted by the bc command. CHARCLASS_NAME_MAX Maximum number of bytes in a character class name. CHAR_BIT Number of bits in a type character. CHAR_MAX Maximum value of a type character. CHAR_MIN Minimum value of a type character. CHILD_MAX Maximum number of simultaneous processes for each real user ID. CLK_TCK Number of clock ticks per second returned by the time subroutine. COLL_WEIGHTS_MAX Maximum number of weights that can be assigned to an entry in the LC_COLLATE locale stanza in a locale-definition file. CS_PATH Value of the PATH environment variable used to find commands. EXPR_NEST_MAX Maximum number of expressions that can be nested within parentheses by the expr command. INT_MAX Maximum value of a type int. INT_MIN Minimum value of a type int. LINE_MAX Maximum length, in bytes, of a command's input line (either standard input or another file) when the utility is described as processing text files. The length includes room for the trailing new-line character. LONG_BIT Number of bits in a type long int. LONG_MAX Maximum value of a type long int. LONG_MIN Minimum value of a type long int. MB_LEN_MAX Maximum number of bytes in a character for any supported locale. NGROUPS_MAX Maximum number of simultaneous supplementary group IDs for each process. NL_ARGMAX Maximum value of digit in calls to the printf and scanf subroutines. NL_LANGMAX Maximum number of bytes in a LANG name. NL_MSGMAX Maximum message number. NL_NMAX Maximum number of bytes in an N-to-1 collation mapping. NL_SETMAX Maximum set number. NL_TEXTMAX Maximum number of bytes in a message string. NZERO Default process priority. OPEN_MAX Maximum number of files that one process can have open at one time. PATH Sequence of colon-separated path prefixes used to find commands. RE_DUP_MAX Maximum number of repeated occurrences of a regular expression permitted when using the interval-notation parameters, such as the m and n parameters with the ed command. SCHAR_MAX Maximum value of a type signed char. SCHAR_MIN Minimum value of a type signed char. SHRT_MAX Maximum value of a type short. SHRT_MIN Minimum value of a type short. SSIZE_MAX Maximum value of an object of type ssize_t. STREAM_MAX Number of streams that one process can have open at one time. TMP_MAX Minimum number of unique path names generated by the tmpnam subroutine. Maximum number of times an application can reliably call the tmpnam subroutine. TZNAME_MAX Maximum number of bytes supported for the name of a time zone (not the length of the TZ environment variable). UCHAR_MAX Maximum value of a type unsigned char. UINT_MAX Maximum value of a type unsigned int. ULONG_MAX Maximum value of a type unsigned long int. USHRT_MAX Maximum value of a type unsigned short int. WORD_BIT Number of bits in a word or type int https://www.cnblogs.com/wjoyxt/p/4815782.html

2012-05-26 · 3 min · 547 words · -

FTP的主动模式和被动模式

FTP的主动模式和被动模式 http://space.itpub.net/14075938/viewspace-495630 FTP两种工作模式: 主动****模式(ActiveFTP) 和被动模式(PassiveFTP) 在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口 (通常是20) 来连接客户端指定的端口N+1,进行数据传输。 在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。 总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。 被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。 win 下面设置ftp模式 一、什么是PASV和PORT方式 (1) PORT其实是Standard模式的另一个名字,又称为Active模式。中文意思是"主动模式。 (2) PASV也就是Passive的简写。中文就是"被动模式。 二、两者不同 不同之处是由于PORT (主动) 这个方式需要在接上TCP 21端口后,服务器通过自己的TCP 20来发出数据。并且需要建立一个新的连接来传送档案。而PORT的命令包含一些客户端没用的资料,所以有了PASv的出现。而PASV模式拥有PORT模式的优点,并去掉一些PORT的缺点。PASV运行方式就是当服务器接收到客户端连接请求时,就会自动从端口1024到5000中随机选择一个和客户端建立连接传递数据。由于被动且自动建立连接,容易受到攻击,所以安全性差。 三、常见的FTP客户端软件PORT方式与PASV方式的切换方法 大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。 在大部分FTP客户端的设置里,常见到的字眼都是"PASV"或"被动模式",极少见到"PORT"或"主动模式"等字眼。因为FTP的登录方式只有两种: PORT和PASV,取消PASV方式,就意味着使用PORT方式。 (1) IE: 工具 -> Internet选项 -> 高级 -> “使用被动FTP” (需要IE6.0以上才支持) 。 (2) CuteFTP: Edit -> Setting -> Connection -> Firewall -> “PASV Mode” 或File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode” 。 (3) FlashGet: 工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式”。 ...

2012-05-26 · 2 min · 255 words · -

iptables防火墙与vsftpd的被动传输模式

iptables防火墙与vsftpd的被动传输模式 Linux服务器上开启了防火墙,并配置vsftpd,就出现了一些问题 可以连接,列出目录,但是无法下载/上传,经过检查,是受FTP传输模式影响导致。 iptables的配置策略往往就限制入站的目的端口,ftp服务器使用标准的21端口作为控制端口,但是数据的传输端口取决于传输模式 主动模式: 服务器以源端口20或随机端口向客户端的协商的随机端口发起链接,也就是说,这时两边防火墙的策略应该是: 服务器端应该允许目标端口为20的入站连接,允许所有随机端口的出站连接 当然,服务器是否以20为源端口连接,取决于/etc/vsftpd.conf是否设置 connect_from_port_20=YES 客户端应该允许所有源端口为20的入站连接,允许所有随机端口的出站连接 被动模式: 客户端以随机连接服务器的某个随机端口 (通过21端口协商得到) 如此, 如果客户端使用了NAT或是有防火墙,问题就变得复杂多了。 在主动模式下,服务器连接客户端 (即客户端NAT主机的公网IP) 随机端口,肯定会失败的,所以客户端使用NAT时,不能使用主动模式,同理,如果客户端使用防火墙,只允许指定的入站端口连接,那么也会失败。 如果使用被动模式呢?也有问题,因为客户端是连接服务器的随机端口(服务器只允许指定入站端口连接),也会出问题,那么对于vsftpd, 解决办法就是: 1.vsftpd 使用被动模式,并设定被动模式监听的端口范围 2.服务器防火墙允许到此范围端口的入站连接 对vsftpd的配置: pasv_enable=YES //使用被动模式,等待客户端连接 pasv_min_port=50000 //被动模式时监听的端口范围下限 pasv_max_port=50100//被动模式时监听的端口范围上限 对iptables的配置 -A RH-Firewall-1-INPUT -p tcp -m tcp -dport 50000:50100 -j ACCEPT 当然,客户端需要设置为被动方式连接 http://zhangxugg-163-com.iteye.com/blog/867422

2012-05-26 · 1 min · 42 words · -

sysv-rc-conf

sysv-rc-conf sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconfig好用。 Ubuntu运行级别 Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作。 Ubuntu 的系统运行级别: 0 系统停机状态 1 单用户或系统维护状态 2~5 多用户状态 6 重新启动 查看当前运行级别,执行命令: runlevel ( runlevel 显示上次的运行级别和当前的运行级别,"N"表示没有上次的运行级别。) 切换运行级别,执行命令: init [0123456Ss] ( 即在 init 命令后跟一个参数,此参数是要切换到的运行级的运行级代号,如: 用 init 0 命令关机;用 init 6 命令重新启动。) 三、Linux 系统主要启动步骤: 1. 读取 MBR 的信息,启动 Boot Manager Windows 使用 NTLDR 作为 Boot Manager,如果您的系统中安装多个 版本的 Windows,您就需要在 NTLDR 中选择您要进入的系统。 Linux 通常使用功能强大,配置灵活的 GRUB 作为 Boot Manager。 2. 加载系统内核,启动 init 进程 init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。 3. 进程读取 init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别, 按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 参数启 动,并指向一个系统中的程序。 通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是 /etc/rcN.d/ 目录。例如您设定的运行级别为 3,那么它对应的启动 目录为 /etc/rc3.d/ 。 4. 根据对应脚本启动服务器 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg Xwindow 为 Linux 下的图形用户界面系统。 5. 启动登录管理器,等待用户登录 Ubuntu 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中 输入用户名和密码后,便可以登录系统。(您可以在 /etc/rc3.d/ 文件夹中找到一个名为 S13gdm 的链接) 四、安装sysv-rc-conf sudo apt-get install sysv-rc-conf 五、使用sysv-rc-conf sudo sysv-rc-conf 操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。其中,"X"表示开启该服务。 六 、部分服务优化推荐及介绍 acpi-support 这个是关于电源支持的默认是1,2,3,4,5下启动,我认为你可以把它调整到s级别。 acpid acpi的守护程序,默认是2-5开启,我认为可以不用管。 alsa alsa声音子系统,应该不用开启它。 alsa-utils 这个服务似乎取代了alsa,所以开启这个就可以了,我在S级别开启它。 anacron 这是一个用于执行到时间没有执行的程序的服务,我认为它无所谓,所以关了它,这个可以随便。 apmd 也是一种电源管理,我认为电脑如果不是很老,它就没有开启的必要了。 atd 和anacron类似,我把它关了。 bluez-utiles 传说中的蓝牙服务,然后遗憾我没有,所以关了。 bootlogd 似乎使用来写log的,安全期间开着他也许比较好。 cron 指定时间运行程序的服务,所以开着比较好的。 cupsys 打印机服务,所以如果你有,就开启吧。 dbus 消息总线系统,非常重要,一定要开。 dns-clean 拨号连接用的,如果不用,就关了它。 evms 企业卷管理系统,由于我并不明白什么叫做企业卷,所以我关了它。 fetchmail 用于邮件守护,我关了它。 gdm gnome桌面管理器,我关了它,然后用startx启动gnome。 halt 关机用的,不要更改 hdparm 这个我刚才有讲,如果没有ide硬盘也就不用开启它了。 hotkey-setup 这个是给某些品牌笔记本设计的热键映射,台式机用户请关了它 hotplug 这个是用于热插拔的,我已经测试过了,在某些电脑上关闭它会使声卡无效,请在S级别开启它。 hplip hp打印机专用的,应该可以关了它。 ifrename 网络接口重命名,好像没用,关了。 ifupdown 这个使用来打开网络的,开着它。 ifupdown-clean 同上。 klogd linux守护程序,接受来自内核和发送信息到syslogd的记录,并记录为一个文件,所以请开着它。 linux-restricted-modules-common 这个使用来使用受限制的模块的,你可以从/lib/linux-restricted-modules下查看,如果没有什么,你可以关掉它。 lvm 逻辑卷管理器,如果你没有请关了它。 makedev 用来创建设备到/dev/请不要动他。 mdamd 管理raid用,如果你没有请关闭它。 module-init-tools 从/etc/modules 加在扩展模块的,这个一般开着。 networking 增加网络接口和配置dns用,将它开启。 ntp-server 与ubuntu时间服务器进行同步的,关了。 pcmcia 激活pcmica设备,遗憾我有生以来都没有见过这样的设备,关了它。 powernowd 用于管理cpu的客户端程序,如果有变频功能,比如amd的quite' cool 那么就开启它吧。 ppp 拨号用的,我关了它。 ppp-dns 一样,也关了。 readahead 预加载服务,让我想起了win的预读,当然他们不同,它会使启动变慢3-4妙,所以我关了它。 reboot 重启用的,不要动。 rmnologin 如果发现nologin,就去除它,在笔记本上不用开启。 rsync rsync协议守护,请视情况而定。 screen-cleanup 一个清除开机屏幕的脚本,随便。 sendsigs 重启和关机时向所有进程发送消息。所以不要管它。 single 激活但用户模式,不用管它。 stop-bootlogd 从2,3,4,5级别停止bootlogd,不用管它。 sudo 这个不用说吧,不用管它。 sysklogd 用于记录系统日志信息,不用管它。 udev 用户空间dev文件系统,不用管它。 udev-mab 同上。 umountfs 用来卸载文件卷的,不用管它。 urandom 生成随即数的,不知道怎么用,不用管它。 usplash 那个漂亮的启动画面,但是我关了它,它也存在,所以想关他需要把内核起动参数中的splash一句删掉。 vbesave 显卡bios配置工具,不用管它。 xorg-common 设置x服务ice socket。不用管它。 ...

2012-05-26 · 2 min · 230 words · -

ubuntu vsftpd

ubuntu vsftpd sudo apt-get install vsftpd 查看是否打开21端口 $ sudo netstat -npltu | grep 21 VSFTPD的菜鸟篇 作者: 龙磊 这是我这个菜鸟学习LINUX所写的第一篇文章,是比较基础的FTP架设的应用,如果我写有什么问题请大家多指教,我后续会陆续出进阶篇把FTP中各种详细的配置跟大家一起进行探讨。 我所用的是LINUX AS+VSFTPD-1.2.0-4的系统架构,在这里说明的是如果对配置文件不是很熟悉,最好做个备份,以免误操作: 1. 匿名服务器的连接 (独立的服务器) 在/etc/vsftpd.conf配置文件中添加如下几项: Anonymous_enable=yes (允许匿名登陆) Dirmessage_enable=yes (切换目录时,显示目录下.message的内容) Local_umask=022 (FTP上本地的文件权限,默认是077) Connect_form_port_20=yes (启用FTP数据端口的数据连接) * Xferlog_enable=yes (激活上传和下传的日志) Xferlog_std_format=yes (使用标准的日志格式) Ftpd_banner=XXXXX (欢迎信息) Pam_service_name=vsftpd (验证方式) * Listen=yes (独立的VSFTPD服务器) * 功能: 只能连接FTP服务器,不能上传和下传 注: 其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项 2. 开启匿名FTP服务器上传权限 在配置文件中添加以下的信息即可: Anon_upload_enable=yes (开放上传权限) Anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件) Write_enable=yes (开放本地用户写的权限) Anon_other_write_enable=yes (匿名帐号可以有删除的权限) 3. 开启匿名服务器下传的权限 在配置文件中添加如下信息即可: Anon_world_readable_only=no 注: 要注意文件夹的属性,匿名帐户是其它 (other) 用户要开启它的读写执行的权限 (R) 读–下传 (W) 写–上传 (X) 执行–如果不开FTP的目录都进不去 ...

2012-05-25 · 3 min · 513 words · -

Java读取properties, getResourceAsStream

Java读取properties, getResourceAsStream http://lavasoft.blog.51cto.com/62575/62174 Java读取properties文件的方法比较多,网上我最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过java.lang.Class类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干: // java object InputStream in = getClass().getResourceAsStream("资源Name"); // static method Class.class.getClassLoader().getResourceAsStream("foo.toml"); 这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static (静态) 方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。 问题是: 假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。 那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--取所有类的父类Object,用Object.class难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。 import java.util.Properties; import java.io.InputStream; import java.io.IOException; /** * 读取Properties文件的例子 * File: TestProperties.java * User: leizhimin * Date: 2008-2-15 18:38:40 */ public final class TestProperties { private static String param1; private static String param2; static { Properties prop = new Properties(); InputStream in = Object.class.getResourceAsStream("/test.properties"); try { prop.load(in); param1 = prop.getProperty("initYears1").trim(); param2 = prop.getProperty("initYears2").trim(); } catch (IOException e) { e.printStackTrace(); } } /** * 私有构造方法,不需要创建对象 */ private TestProperties() { } public static String getParam1() { return param1; } public static String getParam2() { return param2; } public static void main(String args[]){ System.out.println(getParam1()); System.out.println(getParam2()); } } 运行结果: ...

2012-05-25 · 1 min · 163 words · -

JAVA 随机数

JAVA 随机数 在Java中,随机数的概念从广义上将,有三种。 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。 通过Math.random()返回一个0到1之间的double值。 通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。 int nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 int nextInt(int n) 返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0 (包括) 和指定值 (不包括) 之间均匀分布的 int值。 在Java中我们可以使用java.util.Random类来产生一个随机数发生器。它有两种形式的构造函数,分别是Random()和Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子。 随机数发生器(Random)对象产生以后,通过调用不同的method: nextInt()、nextLong()、nextFloat()、nextDouble()等获得不同类型随机数。 1>生成随机数 Random random = new Random(); Random random = new Random(100);//指定种子数100 random调用不同的方法,获得随机数。 如果2个Random对象使用相同的种子 (比如都是100) ,并且以相同的顺序调用相同的函数,那它们返回值完全相同。如下面代码中两个Random对象的输出完全相同 import java.util.*; class TestRandom { public static void main(String[] args) { Random random1 = new Random(100); System.out.println(random1.nextInt()); System.out.println(random1.nextFloat()); System.out.println(random1.nextBoolean()); Random random2 = new Random(100); System.out.println(random2.nextInt()); System.out.println(random2.nextFloat()); System.out.println(random2.nextBoolean()); } } 2>指定范围内的随机数 ...

2012-05-25 · 2 min · 285 words · -

readelf

readelf 功能:用于查看ELF格式的文件信息,常见的文件如在 Linux 上的可执行文件,动态库(.so) 或者静态库 (.a) 等包含 ELF 格式的文件。 示例: 查看静态库定义的函数 readelf -c xxx.a 查看静态库定义的函数 readelf -A xxx.so 版权声明:本文为CSDN博主「mayue_csdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/mayue_web/article/details/103879976 ELF (Executable and Linkable Format) 即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。当你使用 file 命令发现某个文件是 ELF 文件时,你就可以使用 readelf 命令来读取这个文件的信息。 readelf -h /bin/pwd readelf 命令 用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档 (这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。 这个程序和 objdump 提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。 运行 readelf 的时候,除了 -v和 -H之外,其它的选项必须有一个被指定。 ELF文件类型 3种类型的ELF文件: 可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。 可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。 共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 ELF文件作用: ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件: 如果用于编译和链接 (可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。 如果用于加载执行 (可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。 如果是共享文件,则两者都含有。 ELF文件总体组成: elf文件头描述elf文件的总体信息。包括:系统相关,类型相关,加载相关,链接相关。 系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。 类型相关就是前面说的那个类型。 加载相关:包括程序头表相关信息。 链接相关:节头表相关信息。 选项 -a –all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. ...

2012-05-24 · 13 min · 2732 words · -

go benchmark

go benchmark 稳定的测试环境 当我们尝试去优化代码的性能时,首先得知道当前的性能怎么样。Go 语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,能让我们很容易地对某一段代码进行性能测试。 性能测试受环境的影响很大,为了保证测试的可重复性,在进行性能测试时,尽可能地保持测试环境的稳定。 机器处于闲置状态,测试时不要执行其他任务,也不要和其他人共享硬件资源。 机器是否关闭了节能模式,一般笔记本会默认打开这个模式,测试时关闭。 避免使用虚拟机和云主机进行测试,一般情况下,为了尽可能地提高资源的利用率,虚拟机和云主机 CPU 和内存一般会超分配,超分机器的性能表现会非常地不稳定。 超分配是针对硬件资源来说的,商业上对应的就是云主机的超卖。虚拟化技术带来的最大直接收益是服务器整合,通过 CPU、内存、存储、网络的超分配(Overcommitment)技术,最大化服务器的使用率。例如,虚拟化的技能之一就是随心所欲的操控 CPU,例如一台 32U(物理核心)的服务器可能会创建出 128 个 1U(虚拟核心)的虚拟机,当物理服务器资源闲置时,CPU 超分配一般不会对虚拟机上的业务产生明显影响,但如果大部分虚拟机都处于繁忙状态时,那么各个虚拟机为了获得物理服务器的资源就要相互竞争,相互等待。Linux 上专门有一个指标,Steal Time(st),用来衡量被虚拟机监视器(Hypervisor)偷去给其它虚拟机使用的 CPU 时间所占的比例。 # 运行当前 package 内的用例, 只运行 test, 不运行 benchmark # go test 命令默认不运行 benchmark 用例 go test # 只运行 benchmark go test -bench=. -run=none go test -bench . -run none # 运行 test 和 benchmark go test -bench . # -bench 参数支持传入一个正则表达式,匹配到的用例才会得到执行,例如,只运行以 Fib 结尾的 benchmark 用例 go test -bench=Fib$ . go test -bench='Fib$' . https://geektutu.com/post/hpg-benchmark.html ...

2012-05-23 · 2 min · 242 words · -

各种文件系统的文件夹数量与容量限制

各种文件系统的文件夹数量与容量限制 http://blog.csdn.net/leonwei/article/details/3980179 今天写程序时,打算不断的将生成的图片文件放入一个文件夹中,但是每次当放入65534个文件后就无法再存入了,起初一位是程序的bug,后来才发现原来是文件系统对文件数目有限制。经过查阅发现 FAT16 对于FAT16文件系统,可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);卷的最大体积是4GB;每个卷上最多可以保存的文件数量是65,536个 (2^16);根目录下可以保存的文件和文件夹数量最大值是512个 (如果使用了长文件名,该数字还会减小) 对于FAT32文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte);Windows自带的工具可以创建的卷的最大体积是32GB;每个卷中最多可以保存的文件数量是4,177,920个;一个特定文件夹中最多可以保存的子文件夹和文件的数量是65,534 (如果使用了长文件名,那么该数字会减小) 对于NTFS文件系统,可以保存的文件的大小的最大值,理论上是16EB - 1 KB (2^64 bytes - 1 KB)(1EB=1024PB=1024TB=1024GB) ,实际实现过的最大值是16TB - 64 KB (2^44 bytes - 64 KB);卷的体积最大值,理论上可以达到2^64个簇 - 1个簇,实际实现过的最大值是2^56 TB - 64 KB ( 2^32 个簇 - 1个簇);每个卷可以包含的文件个数的最大值是4,294,967,295个 (2^32 - 1) 其中长文件和短文件名文件是指过去的DOS操作系统下,因为8.3格式的限制,文件主档名超过8字节或扩展名超过3字节的文件名,都被称为"长文件名",一般在Windows下正常的文件名在DOS下会显示不正常。 (如"Program files"资料夹可能会显示成"Progra~1") 在微软的Windows NT3.5出来之后,“长文件名"问题得以解决,现在的Windows XP系统一般可以输入400多个字符作为文件名,或者400个字符扩展名。{fact} 而我用的是FAT32系统,里面最多就允许65534个文件,了解了这些,我就知道了应该对这种大批量的文件系统上的文件存储要适度的建立子文件夹。

2012-05-20 · 1 min · 69 words · -

debian 修改无线网卡的信道

debian 修改无线网卡的信道 查看无线网卡支持的信道 sudo iwlist channel #这个是我的thinkpad x60s, !!!不支持channel 12,13,14, #最后面有列出当前信道Current Frequency=xxx lo no frequency information. eth0 no frequency information. wlan0 24 channels in total; available frequencies : Channel 01 : 2.412 GHz Channel 02 : 2.417 GHz Channel 03 : 2.422 GHz Channel 04 : 2.427 GHz Channel 05 : 2.432 GHz Channel 06 : 2.437 GHz Channel 07 : 2.442 GHz Channel 08 : 2.447 GHz Channel 09 : 2.452 GHz Channel 10 : 2.457 GHz Channel 11 : 2.462 GHz Channel 36 : 5.18 GHz Channel 40 : 5.2 GHz Channel 44 : 5.22 GHz Channel 48 : 5.24 GHz Channel 52 : 5.26 GHz Channel 56 : 5.28 GHz Channel 60 : 5.3 GHz Channel 64 : 5.32 GHz Channel 149 : 5.745 GHz Channel 153 : 5.765 GHz Channel 157 : 5.785 GHz Channel 161 : 5.805 GHz Channel 165 : 5.825 GHz Current Frequency=2.462 GHz (Channel 11) tap0 no frequency information. 修改当前信道 ...

2012-05-19 · 1 min · 167 words · -

无线WI-FI路由器的信道选择

无线WI-FI路由器的信道选择 http://blog.solrex.org/articles/wifi-channel-choosing.html 很多人从来没有注意过路由器的 wifi 频道,以为只要笔记本电脑能连上,无线路由就没问题。但有个问题是很多移动设备不能支持全频道,其中即有功耗考虑,也有销售目标国家考虑。因此有条件时最好检测一下信噪比,选择一个最适合自己的频道,而不是让路由器启动时自己去选择。 但接着又有朋友说: "求普及..."。参考 Avinash Kaushik 在他的网站统计博客"Occam's Razor"成立 5 周年时的感慨 (这篇文章很值得一读,very inspiring) ,我想即使我不是专家,分享一下自己知道的这点儿事也不错。 切入正题,现在很多家庭都有了自己的无线 Wi-Fi 路由器,也有了各种接入互联网的移动设备: 笔记本、上网本、手机、平板电脑、电纸书、MID (已没落) 。很多移动设备联网时都会出现诡异问题,这篇文章仅仅关注其中一种诡异问题: 错误的信道 (Channel,也译为频道、频段) 配置导致无法联网或者信号较差。 精确的技术知识我就不解释了,感兴趣的同学可以去读 Wikipedia Wi-Fi 或者 IEEE 802.11 等词条。下面主要说明为什么需要配置无线信道以及如何选择无线信道。 为什么需要配置无线信道? 相信大家都使用过收音机。使用收音机时,都有一个选台的问题,无论你是用旋钮、按键或者触摸,你总要选定某个台,才能收听该台的节目。无线路由也一样。你家里的无线路由器会广播一个 SSID (就是你看到的无线连接名) ,点击该连接,就会使你的电脑调制到该连接所在信道进行通信。 但是使用收音机时,可能会有这样的问题: 1. 有些台根本收不到,比如你的收音机不是全波段的;2. 有些台杂音太大听不清,比如某些唢呐电台。同理到你的无线环境上,问题 1 转化为"笔记本电脑 (全波段收音机) 能连接无线路由器,但平板电脑 (非全波段收音机) 却无法连接";问题 2 转化为"能连接到无线路由器,但干扰太多,达不到最大的网速 (这个网速指 Wi-Fi 连接速度,与 ADSL 网速无关) "。 如果没有手动配置过,无线路由器会自动选择一个默认或者随机的信道进行广播和连接建立。在设备没有联网问题和周围没有别人使用时,这是 OK 的。 但如果你周围的人家都有无线设备,且大家用的都是同一款运营商赠送的无线路由器 (或无线猫) 时,那么极有可能所有人都选择了同一个信道进行通信。这就会造成很大的信号干扰,这一般影响不到网速——除非你家用的 ADSL 大于 4M,但会造成家里两台设备之间数据传输速度极慢,例如用豌豆荚往手机上无线发送视频文件时。 如果不巧的是你家无线路由器会随机选择信道,那么它极有可能选择到一个你设备不支持的信道。我就曾经遇到过爱国者某型号 MID 只支持信道 1-9 但无线路由器自己选择了信道 11 的情况,那是死活也连不上啊!移动设备出于降低功耗或其它考虑,不支持某些信道是很正常的;再加上不同国家对无线信道管制情况不同 (参见 List of WLAN Channels) ,其它国家的水货设备到了国内可能也会水土不服。 幸运的是,你不能控制广播电台的波段,却可以控制自家无线路由器的无线信道。修改无线信道的方法请参考各路由器厂商的帮助文档,或者在网上寻求帮助。不过在修改之前,你还面临着,我该改到哪个信道呢? 如何选择无线信道? 首先,要选择自己通信设备都支持的信道。不过在此之前,首先确认所有设备都支持同一协议,比如你移动终端不支持 IEEE 802.11n,你非得在路由器上用 802.11n 协议,这就是找不自在了。这些知识要参考设备的手册,或者自己尝试。在 Linux 系统中,可以用 iwlist channel 列出移动终端支持的所有信道,比如 Kindle 支持的信道就是 (看到这里我基本可以肯定那哥们 Kindle 问题不是因为信道了,除非他用的是日本产路由器) : [root@kindle root]# iwlist channel lo no frequency information. ...

2012-05-19 · 2 min · 245 words · -

jautodoc

jautodoc http://jautodoc.sourceforge.net/update/ ctrl+alt+j

2012-05-15 · 1 min · 3 words · -

java static import

java static import http://blog.csdn.net/ygc87/article/details/7371254 import static (静态导入) 是JDK1.5中的新特性,一般我们导入一个类都用 import com…..ClassName;而静态导入是这样: import static com…..ClassName.*;这里多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名的方式来调用。 例如,你在某个类中定义了一些简便的打印方法: print? package com.ygc.print; public class Print { // 打印,换行 public static void print(Object obj) { System.out.println(obj); } // 换行 public static void print() { System.out.println(); } // 打印 public static void printnb(Object obj) { System.out.print(obj); } } 然后你想在其他的类里面使用这些方法: print? package com.ygc; import static com.ygc.print.Print.*; class Test { public void println(String s) { print(s); } } java static import jdk1.5 static import static import static import就是允许在代码中直接引用别的类的static变量和方法 (当然,在权限许可范围内) ,我们可以简单的把它当成import的延续。 它的语法如下: import static CLASS_NAME.MEMBER_NAME; 或者 import static CLASS_NAME.×; 事实上,Tiger引入static import最主要考虑到两个需要,第一个就是对一些工具性的,常用的静态方法进行直接引用。 比如,java.lang.Math里的一大堆数学方法abs,exp等。 第二个就是对常数变量进行直接引用,其中也包扩对enum的直接引用 (参考上一篇文章Season的例子) [code] //StaticImportTest.java import static java.lang.Math.*; ...

2012-05-14 · 1 min · 174 words · -

SCADA

SCADA http://baike.baidu.com/view/51065.htm SCADA(Supervisory Control And Data Acquisition)系统,即数据采集与监视控制系统。SCADA系统的应用领域很广,它可以应用于电力系统、给水系统、石油、化工等领域的数据采集与监视控制以及过程控制等诸多领域。在电力系统以及电气化铁道上又称远动系统。SCADA系统是以计算机为基础的生产过程控制与调度自动化系统。它可以对现场的运行设备进行监视和控制,以实现数据采集、设备控制、测量、参数调节以及各类信号报警等各项功能。由于各个应用领域对SCADA的要求不同,所以不同应用领域的SCADA系统发展也不完全相同。 电力系统应用 在电力系统中,SCADA系统应用最为广泛,技术发展也最为成熟。它作为能量管理系统 (EMS系统) 的一个最主要的子系统,有着信息完整、提高效率、正确掌握系统运行状态、加快决策、能帮助快速诊断出系统故障状态等优势,现已经成为电力调度不可缺少的工具。它对提高电网运行的可靠性、安全性与经济效益,减轻调度员的负担,实现电力调度自动化与现代化,提高调度的效率和水平中方面有着不可替代的作用。 SCADA在铁道电气化远动系统上的应用较早,在保证电气化铁路的安全可靠供电,提高铁路运输的调度管理水平起到了很大的作用。在铁道电气化SCADA系统的发展过程中,随着计算机的发展,不同时期有不同的产品,同时我国也从国外引进了大量的SCADA产品与设备,这些都带动了铁道电气化远动系统向更高的目标发展。 SCADA在石油管道工程中占有重要的地位,如用在系统管理石油管道的顺序控制输送、设备监控、数据同步传输记录,监控管道沿线及各站控系统运行状况等。各站场的站控系统作为管道自动控制系统的现场控制单元,除完成对所处站场的监控任务外,同时负责将有关信息传送给调度控制中心并接受和执行其下达的命令,并将所有的数据记录储存。除此之外的基本功能,现在的SCADA管道系统还具备泄露检测、系统模拟、水击提前保护等新功能。 石油方面应用 目前,国外已广泛采用SCADA系统来实现对城市燃气管道的自动监控和自动保护,并已发展成为燃气管道自动控制系统的基本模式。SCADA系统的工作原理是: 根据数据采集系统获得的系统运行工况参数与设计工况参数的比较结果,然后通过由调节阀和与之配套的电动、气动、电液联动或气液联动执行机构以及检测被调参数的仪表等组成的自动调节系统对某些偏离设计工况的运行参数进行自动纠偏调节。 发展历程 SCADA (Supervisory Control and Data Acquisition) 系统,全名为数据采集与监视控制系统。SCADA系统自诞生之日起就与计算机技术的发展紧密相关。SCADA系统发展到今天已经经历了三代。 第一代是基于专用计算机和专用操作系统的SCADA系统,如电力自动化研究院为华北电网开发的SD176系统以及在日本日立公司为我国铁道电气化远动系统所设计的H-80M系统。这一阶段是从计算机运用到SCADA系统时开始到70年代。 第二代是80年代基于通用计算机的SCADA系统,在第二代中,广泛采用VAX等其它计算机以及其它通用工作站,操作系统一般是通用的UNIX操作系统。在这一阶段,SCADA系统在电网调度自动化中与经济运行分析,自动发电控制 (AGC) 以及网络分析结合到一起构成了EMS系统 (能量管理系统) 。第一代与第二代SCADA系统的共同特点是基于集中式计算机系统,并且系统不具有开放性,因而系统维护,升级以及与其它联网构成很大困难。 90年代按照开放的原则,基于分布式计算机网络以及关系数据库技术的能够实现大范围联网的EMS/SCADA系统称为第三代。这一阶段是我国SCADA/EMS系统发展最快的阶段,各种最新的计算机技术都汇集进SCADA/EMS系统中。这一阶段也是我国对电力系统自动化以及电网建设投资最大的时期,国家计划未来三年内投资2700亿元改造城乡电网可见国家对电力系统自动化以及电网建设的重视程度。 第四代SCADA/EMS系统的基础条件已经或即将具备,预计将与21世纪初诞生。该系统的主要特征是采用Internet技术、面向对象技术、神经网络技术以及JAVA技术等技术,继续扩大SCADA/EMS系统与其它系统的集成,综合安全经济运行以及商业化运营的需要。 SCADA系统在电气化铁道远动系统的应用技术上已经取得突破性进展,应用上也有迅猛的发展。由于电气化铁道与电力系统有着不同的特点,在SCADA系统的发展上与电力系统的道路并不完全一样。在电气化铁道远动系统上已经成熟的产品有由我所自行研制开发的HY200微机远动系统以及由西南交通大学开发的DWY微机远动系统等。这些系统性能可靠、功能强大,在保证电气化铁道供电安全,提高供电质量上起到了重要的作用,对SCADA系统在铁道电气化上的应用功不可没。 发展瞻望 SCADA系统在不断完善,不断发展,其技术进步一刻也没有停止过。当今,随着电力系统以及铁道电气化系统对SCADA系统需求的提高以及计算机技术的发展,为SCADA系统提出新的要求,概括地说,有以下几点: 1.SCADA/EMS系统与其它系统的广泛集成 SCADA系统是电力系统自动化的实时数据源,为EMS系统提供大量的实时数据。同时在模拟培训系统,MIS系统等系统中都需要用到电网实时数据,而没有这个电网实时数据信息,所有其它系统都成为"无源之水"。所以在这今十年来,SCADA系统如何与其它非实时系统的连接成为SCADA研究的重要课题;现在在SCADA系统已经成功地实现与DTS (调度员模拟培训系统) 、 企业MIS系统的连接。SCADA系统与电能量计量系统,地理信息系统、水调度自动化系统、调度生产自动化系统以及办公自动化系统的集成成为SCADA系统的一个发展方向。 2.变电所综合自动化 以RTU、微机保护装置为核心,将变电所的控制、信号、测量、计费等回路纳入计算机系统,取代传统的控制保护屏,能够降低变电所的占地面积和设备投资,提高二次系统的可靠性。变电所的综合自动化已经成为有关方面的研究课题,我国东方电子等公司已经推出相应的产品,但在铁道电气化上还处于研究阶段。 3.新技术研究与应用 专家系统、模糊决策、神经网络等新技术研究与应用 利用这些新技术模拟电网的各种运行状态,并开发出调度辅助软件和管理决策软件,由专家系统根据不同的实际情况推理出最优化的运行方式或出来故障的方法,以达到合理、经济地进行电网电力调度,提高运输效率的目的。 4.面向对象、Internet、及JAVA的应用 面向对象技术 (OOT) 是网络数据库设计、市场模型设计和电力系统分析软件设计的合适工具,将面向对象技术 (OOT) 运用于SCADA/EMS系统是发展趋势。 随着Internet技术的发展,浏览器界面已经成为计算机桌面的基本平台,将浏览器技术运用于SCADA/EMS系统,将浏览器界面作为电网调度自动化系统的人机界面,对扩大实时系统的应用范围,减少维护工作量非常有利;在新一代的SCADA/EMS系统中,传统的MMI界面将保留,主要供调度员使用,新增设的Web服务器供非实时用户浏览,以后将逐渐统一为一种人机界面。 JAVA语言综合了面向对象技术和Internet技术,将编译和解释有机结合,严格实现了面向对象的四大特性: 封装性、多态性、继承性、动态联编,并在多线程支持和安全性上优于C++,以及其它诸多特性,JAVA技术将导致EMS/SCADA系统的一场革命。 5.3D scada 3D组态软件,全称3D组态监控软件系统软件。英文简写3DSCADA (3D Supervisory Control and Data Acquisition(三维数据采集与监视控制),它处于自动化控制系统的最高一级平台,一般包括开发环境和应用环境两部分。3D组态能够以灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的、通用层次的组态软件工具。3D组态软件通过三维立体监控设备达到用户如身临其景的感觉,使得人机界面控制更加逼真,更具人性化。3D组态软件的应用领域很广,可以应用于电力系统、给水系统、石油、化工、冶金等领域的数据采集与监视控制以及过程控制等诸多领域。 态神3DSCADA 也将更多的应用在各个领域! 随着工业自动化水平的迅速提高, 传统的组态软件已经日益不能满足人们的需求,程序员和操作员期待更先进的自动化软件出现,3D是这个时代产物,3D被应用在组态软件领域也就顺利成章。 3D利用DirectX/OpenGL开发,程序员可以通过简单的方法组态3D立体画面,将所有需要监测的部位放置于3D画面上,达到多方位立体监测的功能。 泄漏监测系统 SCADA泄漏监测系统 (以一条管线为例) 由变送器,服务器,远程客户端,通信网络等部分组成,如图A 所示。目前安装在长输管线上的变送器主要有压力变送器、温度变送器和流量变送器几种。需要指出的是,国内大部分管线两端都未安装流量变送器。 通信网络是系统内部信息传输的物理途径。F9G与上层服务器进行通信及数据传输、远程客户端对服务器数据库的访问以及对服务器的0') 访问均是通过通信网络进行的。该系统可基于局域网、光纤及电话线、微波等不同类型的通信方式,具有良好的适应能力。此外,系统提供了0') 访问功能,使得任何一台与服务器建立了网络连接并且安装有ST 或其他网络浏览器的计算机均可成为系统的0') 客户。 该系统应用在某油田输油管线上取得了显著的成效,系统的使用大大提高了油田生产和管理的自动化水平,为油田创造了明显的经济效益和社会效益。

2012-05-10 · 1 min · 79 words · -

SOA

SOA 面向服务的体系结构 (Service-Oriented Architecture,SOA) 是一个组件模型,它将应用程序的不同功能单元 (称为服务) 通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。 SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸。 SOA将能够帮助软件工程师们站在一个新的高度理解企业级架构中的各种组件的开发、部署形式,它将帮助企业系统架构者以更迅速、更可靠、更具重用性架构整个业务系统。较之以往,以SOA架构的系统能够更加从容地面对业务的急剧变化。 面向服务的体系结构 松耦合的系统 这种具有中立的接口定义 (没有强制绑定到特定的实现上) 的特征称为服务之间的松耦合。松耦合系统的好处有两点,一点是它的灵活性,另一点是,当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时,它能够继续存在。而另一方面,紧耦合意味着应用程序的不同组件之间的接口与其功能和结构是紧密相连的,因而当需要对部分或整个应用程序进行某种形式的更改时,它们就显得非常脆弱。 对松耦合的系统的需要来源于业务应用程序需要根据业务的需要变得更加灵活,以适应不断变化的环境,比如经常改变的政策、业务级别、业务重点、合作伙伴关系、行业地位以及其他与业务有关的因素,这些因素甚至会影响业务的性质。我们称能够灵活地适应环境变化的业务为按需 (On demand) 业务,在按需业务中,一旦需要,就可以对完成或执行任务的方式进行必要的更改。 虽然面向服务的体系结构不是一个新鲜事物,但它却是更传统的面向对象的模型的替代模型,面向对象的模型是紧耦合的,已经存在二十多年了。虽然基于 SOA 的系统并不排除使用面向对象的设计来构建单个服务,但是其整体设计却是面向服务的。由于它考虑到了系统内的对象,所以虽然 SOA 是基于对象的,但是作为一个整体,它却不是面向对象的。不同之处在于接口本身。SOA 系统原型的一个典型例子是通用对象请求代理体系结构 (Common Object Request Broker Architecture,CORBA) ,它已经出现很长时间了,其定义的概念与 SOA 相似。 然而,现在的 SOA 已经有所不同了,因为它依赖于一些更新的进展,这些进展是以可扩展标记语言 (eXtensible Markup Language,XML) 为基础的。通过使用基于 XML 的语言 (称为 Web 服务描述语言 (Web Services Definition Language,WSDL) ) 来描述接口,服务已经转到更动态且更灵活的接口系统中,非以前 CORBA 中的接口描述语言 (Interface Definition Language,IDL) 可比了。 Web 服务并不是实现 SOA 的惟一方式。前面刚讲的 CORBA 是另一种方式,这样就有了面向消息的中间件 (Message-Oriented Middleware) 系统,比如 IBM 的 MQseries。但是为了建立体系结构模型,您所需要的并不只是服务描述。您需要定义整个应用程序如何在服务之间执行其工作流。您尤其需要找到业务的操作和业务中所使用的软件的操作之间的转换点。因此,SOA 应该能够将业务的商业流程与它们的技术流程联系起来,并且映射这两者之间的关系。例如,给供应商付款的操作是商业流程,而更新您的零件数据库,以包括进新供应的货物却是技术流程。因而,工作流还可以在 SOA 的设计中扮演重要的角色。 此外,动态业务的工作流不仅可以包括部门之间的操作,甚至还可以包括与不为您控制的外部合作伙伴进行的操作。因此,为了提高效率,您需要定义应该如何得知服务之间的关系的策略,这种策略常常采用服务级协定和操作策略的形式。 最后,所有这些都必须处于一个信任和可靠的环境之中,以同预期的一样根据约定的条款来执行流程。因此,安全、信任和可靠的消息传递应该在任何 SOA 中都起着重要的作用。 体系结构作用 我可以用面向服务的体系结构做什么? 对 SOA 的需要来源于需要使业务 IT 系统变得更加灵活,以适应业务中的改变。通过允许强定义的关系和依然灵活的特定实现,IT 系统既可以利用现有系统的功能,又可以准备在以后做一些改变来满足它们之间交互的需要。 下面举一个具体的例子。一个服装零售组织拥有 500 家国际连锁店,它们常常需要更改设计来赶上时尚的潮流。这可能意味着不仅需要更改样式和颜色,甚至还可能需要更换布料、制造商和可交付的产品。如果零售商和制造商之间的系统不兼容,那么从一个供应商到另一个供应商的更换可能就是一个非常复杂的软件流程。通过利用 WSDL 接口在操作方面的灵活性,每个公司都可以将它们的现有系统保持现状,而仅仅匹配 WSDL 接口并制订新的服务级协定,这样就不必完全重构它们的软件系统了。这是业务的水平改变,也就是说,它们改变的是合作伙伴,而所有的业务操作基本上都保持不变。这里,业务接口可以作少许改变,而内部操作却不需要改变,之所以这样做,仅仅是为了能够与外部合作伙伴一起工作。 另一种形式是内部改变,在这种改变中,零售组织现在决定它还将把连锁零售商店内的一些地方出租给专卖流行衣服的小商店,这可以看作是采用店中店 (store-in-store) 的业务模型。这里,虽然公司的大多数业务操作都保持不变,但是它们现在需要新的内部软件来处理这样的出租安排。尽管在内部软件系统可以承受全面的检修,但是它们需要在这样做的同时不会对与现有的供应商系统的交互产生大的影响。在这种情况下,SOA 模型保持原封不动,而内部实现却发生了变化。虽然可以将新的方面添加到 SOA 模型中来加入新的出租安排的职责,但是正常的零售管理系统继续如往常一样。 为了延续内部改变的观念,IT 经理可能会发现,软件的新配置还可以以另外的一种方式加以使用,比如出租粘贴海报的地方以供广告之用。这里,新的业务提议是通过在新的设计中重用灵活的 SOA 模型得出的。这是来自 SOA 模型的新成果,并且还是一个新的机会,而这样的新机会在以前可能是不会有的。 垂直改变也是可能的,在这种改变中,零售商从销售他们自己的服装完全转变到专门通过店中店模型出租地方。如果垂直改变完全从最底层开始的话,就会带来 SOA 模型结构的显著改变,与之一起改变的还可能有新的系统、软件、流程以及关系。在这种情况下,SOA 模型的好处是它从业务操作和流程的角度考虑问题而不是从应用程序和程序的角度考虑问题,这使得业务管理可以根据业务的操作清楚地确定什么需要添加、修改或删除。然后可以将软件系统构造为适合业务处理的方式,而不是在许多现有的软件平台上常常看到的其他方式。 正如您可以看到的,在这里,改变和 SOA 系统适应改变的能力是最重要的部分。对于开发人员来说,这样的改变无论是在他们工作的范围之内还是在他们工作的范围之外都有可能发生,这取决于是否有改变需要知道接口是如何定义的以及它们相互之间如何进行交互。与开发人员不同的是,架构师的作用就是引起对 SOA 模型大的改变。这种分工,就是让开发人员集中精力于创建作为服务定义的功能单元,而让架构师和建模人员集中精力于如何将这些单元适当地组织在一起,它已经有十多年的历史了,通常用统一建模语言 (Universal Modeling Language,UML) ,并且描述成模型驱动的体系结构 (Model-Driven Architecture,MDA) 。 对于面向同步和异步应用的,基于请求/响应模式的分布式计算来说,SOA是一场革命。一个应用程序的业务逻辑 (business logic) 或某些单独的功能被模块化并作为服务呈现给消费者或客户端。这些服务的关键是他们的松耦合特性。例如,服务的接口和实现相独立。应用开发人员或者系统集成者可以通过组合一个或多个服务来构建应用,而无须理解服务的底层实现。举例来说,一个服务可以用.NET或J2EE来实现,而使用该服务的应用程序可以在不同的平台之上,使用的语言也可以不同。 SOA与互联网 Service-Oriented Device Architecture (SODA),即"面向服务的设备架构",是一个由IBM和美国Florida大学发起的倡议(Initiative)和联盟(Alliance),通过引入基于服务 (SOA) 的编程模型,以规范和简化智能设备 (Devices) 与企业应用的集成。SODA致力于充分利用嵌入式系统和IT领域已有的标准,为智能设备与SOA技术的融合提供一个标准平台。 SODA的目标是让软件开发者能够像用SOA技术实现IT业务集成那样在诸如远程医疗、军事、以及RFID等物联网系统中实现与传感器和执行器的集成[1]。 具体来说,SODA提供标准接口,把硬件设备功能转换成与硬件无关的可调用的软件服务,实现如下目标: 1. 实现应用集成商与设备和传感器制造商的无缝对接; 2. Integrate once, deploy everywhere, 使用户专注于整体应用方案而不是陷于设备连接工作; 3. 在应用和众多 (泛在) 设备协议之间建立一个通用接口和DDL,形成统一数据交换标准; 4. 作为一个中间件平台,为众多行业应用提供应用支持。 SODA架构 ...

2012-05-10 · 3 min · 505 words · -

Maven OutOfMemory

Maven OutOfMemory http://juvenshun.iteye.com/blog/240257 当Maven项目很大,或者你运行诸如 mvn site 这样的命令的时候,maven运行需要很大的内存,在默认配置下,就可能遇到java的堆溢出。如: [INFO] Building jar: /home/dl9pf/svn/mindquarry/mindquarry-jcr/mindquarry-jcr-changes/target/mindquarry-migration-with-dependencies.jar [INFO] ———————— [ERROR] FATAL ERROR [INFO] ———————— [INFO] Java heap space [INFO] ———————— [INFO] Trace java.lang.OutOfMemoryError: Java heap space at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:518) … at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) at org.codehaus.classworlds.Launcher.main(Launcher.java:375) [INFO] ———————— [INFO] Total time: 7 minutes 14 seconds [INFO] Finished at: Wed Sep 05 07:44:55 CEST 2007 [INFO] Final Memory: 37M/63M [INFO] ———————— 解决的方法是调整java的堆大小的值。 Windows环境中 找到文件%M2_HOME%binmvn.bat ,这就是启动Maven的脚本文件,在该文件中你能看到有一行注释为: @REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE... 它的意思是你可以设置一些Maven参数,我们就在注释下面加入一行: set MAVEN_OPTS= -Xms128m -Xmx512m 之后,当你运行Maven命令如 mvn -version 的时候,你会看到如下的输出: E:test>mvn -versionE:test>set MAVEN_OPTS= -Xms128m -Xmx512m Maven version: 2.0.9 Java version: 1.6.0_07 OS name: “windows 2003” version: “5.2” arch: “x86” Family: “windows” ...

2012-05-08 · 1 min · 148 words · -

Java 运算符

Java 运算符 三目运算符(又称条件运算符) 三元运算符一般用的很少,因为它在程序段中的可读性很差,所以笔者建议不要经常使用三元运算符,但很少使用并不代表不使用,所以还是要掌握好它的用法,三元运算符的表达形式如下: 布尔表达式?值 0 : 值 1 它的运算过程是: 如果布尔表达式的结果是 true,就返回值 0,如果布尔表达式的结果是 false,就返回值 1,例如下面的程序段。 public class data21{ public static void main(String[] args){ int a=10; int b=20; System.out.println(“此三元运算式结果是: “+((a>b)?‘A’:‘B’)); } } 分析上面程序段: 因为"a"是小于"b”,所以"a>b"这个关系运算符的结果是"false”,既然是"false",那么选择值 1,即这个三元运算符的结果是"B"。 总结: 条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。 variable x = (expression) ? value if true : value if false 实例 public class Test { public static void main(String args[]){ int a , b; a = 10; b = (a == 1) ? 20: 30; System.out.println( “Value of b is : " + b ); ...

2012-05-03 · 1 min · 180 words · -