由于项目中出现用java的getHostName很慢的问题,而且在多线程中也有问题
一种解决方式是不用getHostName,用IP来代替
另一种解决方式是在网上搜到的,如下
转自:http://tech.watchstor.com/backup-and-archiving-113031.htm
环境
产品:WebSphere Application Server
平台:AIX
版本:5.1,6.0
问题
当发现WAS挂起或响应慢的时候,通过 kill -3 产生 javacore 文件,在 javacore 文件中发现大部分的线程堆栈都在执行java.net.InetAddress.getLocalHost,如下:
at java.net.Inet6AddressImpl.getLocalHostName(Native Method)
at java.net.InetAddress.getLocalHost(InetAddress.java:1186)
at org.apache.soap.util.mime.MimeUtils.getUniqueValue(Unknown Source)
at org.apache.soap.rpc.SOAPContext.setRootPart(Unknown Source)
...............................................
解答
在Java 2 SDK 1.4中,JVM在获得HostName的时候会同时进行IPv4和IPv6查询。如果Domain Name System (DNS) 服务没有配置接受IPv6查询,JVM可能返回Unknown Host异常,如果Domain Name System (DNS) 服务没有正确配置接受IPv6查询,JVM需要等待IPv6查询返回结果,直到超时。这就引起了JVM挂起或响应慢。
这个问题有以下解决方案:
1.Java解决方案
如果是一般的Java应用程序,可以在启动JVM的时候加入
-Djava.net.preferIPv4Stack=true
参数。
如果是WebSphere Application server,执行如下步骤:
a.登录管理控制台,打开“服务器 > 应用服务器 > 服务名称 > 进程定义 > JVM虚拟机 > 定制属性” 页面。
b.在页面中添加如下定制属性
名称: java.net.preferIPv4Stack
值: true
c.点击“确定”,并保存配置。
d.重新启动应用服务器
2.AIX解决方案
a.安装以下APAR:
AIX V520: IY47908
AIX V510: IY48783
要确认这个补丁是否已经安装,可以用如下命令:
instfix -ik IY#####
b.在确认以上APAR已经安装后,编辑/etc/netsvc.conf文件,在其中加入:
hosts=bind4,local
或者在启动WebSphere Application Server前,设置系统环境变量:
export NSORDER=bind4,local
3.Domain Name System(DNS)解决方案
配置DNS服务器忽略IPv6查询请求
4.Network Information Service (NIS) 解决方案
如果系统使用NIS来解析Hostname,可以通过修改/etc/hosts和/etc/netsvc.conf文件来移除NIS。
具体请参考以下文档:http://www-1.ibm.com/support/docview.wss?uid=swg21170467
另注意:
现在才知道是IP地址的问题,在FC4中默认的是IPv6 socket,JDK1.4支持的应该是IPv4,具体原因可以查看SUN公司给出的解释.
解决办法是在运行JAVA程序时加上 -Djava.net.preferIPv4Stack=true 如:
java -Djava.net.preferIPv4Stack=true application.
详悉信息请查看下面的连接,如果那位朋友有更好的解决办法盼告知.
http://java.sun.com/j2se/1.4.2/docs/...roperties.html
发现禁用IPV6,是比较好的解决方法.
--------------------------------------------------------------------------------
修改 /etc/modprobe.conf 文件,增加
alias net-pf-10 off
alias ipv6 off
这样就不用增加参数 "-Djava.net.preferIPv4Stack=true ",重起即可.
---------------------------------------------
补充:
在 Java 应用中JVM 也会缓存DNS 的解析结果,这个缓存是在InetAddress 类中完成
的,而且这个缓存时间还比较特殊,它有两种缓存策略:一种是正确解析结果缓存,另一
种是失败的解析结果缓存。这两个缓存时间由两个配置项控制,配置项是在%JAVA_
HOME%\lib\security\java.security 文件中配置的。两个配置项分别是networkaddress.cache. ttl
和networkaddress.cache.negative.ttl,它们的默认值分别是-1(永不失效)和10(缓存10 秒)。
要修改这两个值同样有几种方式,分别是:直接修改java.security 文件中的默认值、
在Java 的启动参数中增加-Dsun.net.inetaddr.ttl=xxx 来修改默认值、通过InetAddress 类动
态修改。
在这里还要特别强调一下,如果我们需要用InetAddress 类解析域名时,一定要是单
例模式,不然会有严重的性能问题,如果每次都创建InetAddress 实例,每次都要进行一
次完整的域名解析,非常耗时,这点要特别注意。
相关推荐
解决linux找不到hostname的处理文档UnknownHostException
Linux操作系统的hostname是一个kernel变量,可以使用如下两种方式查看 # hostname 和 # cat /proc/sys/kernel/hostname 临时修改hostname 通过hostname命令可以设置系统的hostname # hostname newname new...
hostname命令用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。 在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名...
网络ip扫描工具,根据hostname也可以
自己写的可以将本机机器名、ip、mac信息上传至指定ftp的程序 210K
hostname是个很不错的改网络环境工具
ArcGisServer 跨网段访问问题及解决 在 ArcGisServer 中,跨网段访问问题是一个常见的问题,该问题的解决方案对许多开发者和管理员来说都是非常重要的。今天,我们将详细讨论 ArcGisServer 跨网段访问问题及解决...
当我觉得对Linux系统下修改hostname已经非常熟悉的时候,今天碰到了几个个问题,这几个问题给我好好上了一课,很多知识点,当你觉得你已经掌握的时候,其实你了解的还只是皮毛。技术活,切勿浅尝则止! 实验环境:...
这些工具对于 Java 程序员来说是必备的,能够帮助我们解决各种 JVM 性能问题,如 OutOfMemoryError、内存不足、线程死锁、锁争用、高 CPU 消耗等问题。 一、jps(Java Virtual Machine Process Status Tool) jps ...
Zabbix 常见问题解决方案 Zabbix 是一款功能强大且灵活的监控工具,但是在实际使用中,总会遇到一些问题。下面我们将对 Zabbix 常见问题进行解决,并对解决方案进行详细的解释。 问题一:查看 zabbix_server.log,...
还提供gethostname() ,但从2019年起将。此板条箱改善了。 执照 版权所有2019 Sebastian Wiesner 根据Apache许可证2.0版(“许可证”)获得许可; 除非遵守许可,否则您不得使用此文件。 您可以在处获得许可证的...
VC 获取计算机名和IP地址,基于MFC的,是一...具体来说是使用gethostname获取主机名(计算机名),使用GetIPAddress来获取IP地址的字符串,然后再经过字符转换成IP格式,这个例子挺简单,对研究MFC的朋友,或许有帮助。
用于IP与HOSTNAME的java awt编程
官方离线安装包,亲测可用
离线安装包,亲测可用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
配置tornado的必备脚本,远程服务器下载不容易,所以放在这里,可以安装在win7下,支持python2.7
HOSTNAME.EXE
Windows.Networking.HostName
解决C#广播,很简单 C#中发送广播消息的过程如下,注意要调用SetSockOption函数,不然要抛出异常: Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint ...