日期:2014-05-16 浏览次数:20653 次
??? 项目里有这样的要求,用户通过浏览器配制一部分信息,这部分信息不存在数据库而存在LINUX下磁盘文件中。对我来说倒是没有什么区别,不就是数据嘛,怎么存不用我管,我只要能塞进去取出来就可以了。然而在运行的时候出现了两个问题
?
??? 1.中文信息出现了乱码
??? 2.file too many open
?
??? 一、分析:
?????????? 1.出现乱码就只能是编码的问题了,有可能有两种情况,一种是编码不一致,另一种是不支持设置的编码,因为我在项目里面都是用UTF8的编码,所以不存在设置了不支持的编码的问题,因此推断出是系统编码引起的。linux 下输入export |grep LANG 结果是en 果然如此。
?
?????????? 2.上网查找资料得到结果是文件打开数太多超过了系统的默认值1024,但是我怎么可能同时打开1024个文件呢,这就和JVM有关了,我们都知道,JAVA的资源是靠GC来回收的,这样一来我们JAVA程序员不用处理大量有关资源回收的问题了,内存泄露的机会也少了很多,但是却不能强制GC回收,JVM给了建议回收的方法,但是处理不处理可不是我们说了算的,事情都有两面性,我们得到GC便利的同事也受到了其限制。网上说把文件打开数量增大就可以了。可能是内存里面有1千个你GC不回收但是如果你有5千个呢,你还不回收?呵呵,改过8K之后是没有出现问题了,当然网上还有同志说改1W多的。我的逻辑是用多少我就给多少再多点,呵呵。linux 下用 ulimit? -n 就可以看到你设置的数目了。
?
?
??? 二、初步解决方式:
????????? 1.Runtime 系统命令 ulimit -n 8196
????????? 2.Runtime 系统命令 export LANG="en_US.UTF-8"
????????? 本来以为解决了,但是问题依然存在为什么呢?程序里面设置完之后马上又查询了一遍,竟然没有设置上?奇怪?没出现问题呀,问了下公司搞linux开发的同事原来这些是进程相关的,我也没有启动新的进程呀,哦,一定是Runtime.getRuntime().exec() 它启动了一个新的进程。查资料如下:
?
???????? 在单独的进程中执行指定命令和变量。(jdk api 1.6.0 中文版exec()方法说明)
?
???????? 看样子在程序中解决问题是不现实了,那么只能修改配置文件了。修改那个文件了,google下看看,哇,修改好多文件都可以呀,为什么修改这多种类文件的方法都有呢?既然他们都写出来了说明都曾经解决过相应的问题。那么到底哪个才能适合我目前的问题呢?没有思路继续找资料,知道看到一篇关于linux 读取配置文件的顺序的文章才明白。
?
??????? 下面是的部分拷贝:
?
???????? 执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) ->
~/.bashrc -> /etc/bashrc -> ~/.bash_logout
关于各个文件的作用域,在网上找到了以下说明:
?????? (1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置。
?????? (2)/etc/bashrc: 为每一个运行bash
shell的用户执行此文件.当bash shell被打开时,该文件被读取。
??????? (3)~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
??????? (4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
??????? (5)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc
/profile中的变量,他们是"父子"关系。
???????? (6)~/.bash_profile 是交互式、login 方式进入 bash
运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
?
???????? 感谢博主整理,上面内容来源地址是:http://zcdxzsz.iteye.com/blog/280774
?
??????? 三、最终解决方案:
?
???????????? 根据执行的顺序我们从后面往前面查找,发现有设置lang 和ulimit 的地方改过来就可以了,如果没有就在配文件中添加一个,我是在 ~/.bash_profile?? 中更改的
???????????? ulimit -n 8196
???????????? export LANG="en_US.UTF-8"
?
???????????? 有人说在 /etc/sysconfig/i18n 里面更改编码方式,当然这样也可以,只是需要注意一点的是,不要被后面读取的配置文件的同样的属性把我们自己的设置的变量给覆盖了就好了。这也是为什么网上有那么多解决方法的原因了。