我在运行OSX 10.9.4、1.7GHz i7、8GB内存的Macbook Air上运行以下Java程序。我安装了Java加密扩展(JCE)。
import javax.crypto.Mac;
public class Main {
public static void main(String[] args) throws Exception {
Mac.getInstance("HmacSHA1");
}
}
运行这个简单的程序会导致运行时间超过5秒!
$ javac -version
javac 1.7.0_45
$ javac Main.java
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
$ time java Main
real 0m5.326s
user 0m0.390s
sys 0m0.033s
我做了很多搜索,但在变通方法或解释方面没有找到太多。
>
Mac.get实例()用于HmacSHA1执行时间
这听起来与我的问题相似,但我读过的所有资料都表明,OSX上的/dev/random
和/dev/uradom
是相同的。
如何使用Java SecureRandom解决性能问题?
同样,关于SecureRandom随机性来源的讨论似乎不适用于OSX。
以前有人听说过这个问题吗?或者知道一种让我调试的方法吗?到目前为止,单元测试一直是瞬时的,但却要受到5秒的惩罚,这真是令人沮丧。
编辑:以下是程序内部的时间和安全提供程序列表:
import java.security.Provider;
import java.security.Security;
import javax.crypto.Mac;
public class Main {
public static void main(String[] args) throws Exception {
for (Provider p: Security.getProviders()) {
System.out.println(p.getName() + " " + p.getVersion() + " " + p.getInfo());
}
long start = System.currentTimeMillis();
Mac.getInstance("HmacSHA1");
System.out.println(System.currentTimeMillis() - start + "ms");
}
}
$ java Main
SUN 1.7 SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
SunRsaSign 1.7 Sun RSA signature provider
SunEC 1.7 Sun Elliptic Curve provider (EC, ECDSA, ECDH)
SunJSSE 1.7 Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE 1.7 SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
SunJGSS 1.7 Sun (Kerberos v5, SPNEGO)
SunSASL 1.7 Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
XMLDSig 1.0 XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
SunPCSC 1.7 Sun PC/SC provider
Apple 1.1 Apple Provider
5224ms
编辑2:
想出了如何在代码上运行HPROF。
$ java -agentlib:hprof=cpu=times Main
$ cat java.hprof.txt
...
TRACE 308670:
java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:Unknown line)
java.net.InetAddress.getAddressesFromNameService(InetAddress.java:Unknown line)
java.net.InetAddress.getLocalHost(InetAddress.java:Unknown line)
javax.crypto.JarVerifier.getSystemEntropy(JarVerifier.java:Unknown line)
...
CPU TIME (ms) BEGIN (total = 6680) Sat Aug 16 05:59:39 2014
rank self accum count trace method
1 74.87% 74.87% 1 308670 java.net.InetAddress$1.lookupAllHostAddr
...
因此,似乎出于某种原因,JarVerifier试图从系统中获取熵,这导致程序在InetAddress$1中花费5秒。lookupAllHostAddr。。。
编辑三:
将Java更新为“1.7.067”并不能解决这个问题。
我找到了解决办法。如编辑2所示,Mac。getInstance()
似乎在调用javax。加密。贾维尔。getSystemEntropy()
,它最终会调用java。网我的地址。getLocalHost()
。根据本文,Java7改变了InetAddress
查找本地主机的方式。出于某种原因,这会导致我的机器lookupAllHostAddr
,这需要约5秒钟才能完成。
文章中的一条评论列出了对我有效的解决方案,即将我的主机名添加到/etc/hosts
。以下是:
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
对的更改
127.0.0.1 localhost <replace-me>.local
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
更改到主机文件后,我的时间回到了合理的200ms。
$ time java Main
real 0m0.242s
user 0m0.379s
sys 0m0.034s
当我将Java EE应用程序部署到Glassfish时,我有一个非常奇怪的问题。我有一个Eclipse EAR项目,它引用了一个Web项目(包含一个servlet),一个EJB项目(有一个EJB)和一个JPA项目(有一个@Entity)。在我的 servlet 中,我调用 EJB,它又执行以下查询: 在上面代码的第三行,我得到了一个异常: 我已经调试了上面提到的Hibernate类,即Metamo
本文向大家介绍基于spring实现websocket实时推送实例,包括了基于spring实现websocket实时推送实例的使用技巧和注意事项,需要的朋友参考一下 基于spring框架来写的,websocket实时推送例子,具体内容如下 第一步:自己搭建一个springmvc项目,很简单,网上百度都有;pom文件添加以下: 我的spring版本是4.2.4的,所以websocket也是4.2.4的
主要内容:实现自动搜索,滚动滑动条,实现翻页抓取,完整程序代码本节讲解 Python Selenium 爬虫实战案例,通过对实战案例的讲解让您进一步认识 Selenium 框架。 实战案例目标:抓取京东商城( https://www.jd.com/)商品名称、商品价格、评论数量,以及商铺名称。比如输入搜索“Python书籍”,则抓取如下数据: Selenium 框架的学习重点在于定位元素节点,关于如何定位,我们已经介绍了 8 种方法,其中 Xpath 表达式
本文向大家介绍AngularJS实现路由实例,包括了AngularJS实现路由实例的使用技巧和注意事项,需要的朋友参考一下 1、首先我们要引进angular.js和angular-route.js文件 2、然后我们要在html中创建锚点和容器(ng-view) 3、在模块中注入ngRoute依赖 4、配置路由 效果展示: 完整代码: 接下来我们做一个模拟项目路由 1、首先我们看一下我们所需要的文件
本文向大家介绍js实现简单实用的AJAX完整实例,包括了js实现简单实用的AJAX完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现简单实用的AJAX的方法。分享给大家供大家参考,具体如下: 更多关于ajax相关内容感兴趣的读者可查看本站专题:《JavaScript中ajax操作技巧总结》及《jquery中Ajax用法总结》 希望本文所述对大家ajax程序设计有所帮助。
负载均衡实例是一个运行的负载均衡服务,通过设置的虚拟IP接收流量并将其转发分配给后端服务器。 负载均衡服务即为了保证业务的高可用,将多台业务虚拟机或服务器等虚拟成一个逻辑的应用服务池,通过虚拟IP向外提供服务,用户访问虚拟IP时,负载均衡服务将监听指定端口将来自用户的请求分发给后端的虚拟机或服务器处理。 一个完整的负载均衡主要包括3部分,负载均衡实例、监听和后端服务器组。用户在配置负载监听服务时需