Tag: 性能

使用JMX以及如何使用现有应用程序

我们已经分发了几年前在JDK 5上开发的Web应用程序。 JMX将如何帮助这个应用程序? 1)它会帮助我监控性能(内存,CPU和网络和磁盘IO)吗? 2)如果是,那么应用程序部署在多个服务器中,如何在一个仪表板中进行监控? 3)我是否必须对现有应用程序进行任何新的代码更改,还是可以在不更改代码的情况下进行监视? 4)除性能监控外,我们还能做些什么? 因为name是Management Extensions(MX)我们可以管理什么以及如何管理? 看来主要目标不是监控,而是管理? 我从Oracle网站http://docs.oracle.com/javase/tutorial/jmx/overview/why.html中提供的教程中了解了很多关于JMX的知识。 似乎一些商业代表准备本教程而不是技术人员。 任何人都可以帮助我理解这个JMX的东西,您的努力是真诚的感谢。 谢谢,你的朋友。

我可以强制JVM本地编译给定的方法吗?

当我的应用程序启动时,我经常调用一个性能关键的方法。 最终,它被JIT编译,但是在解释器中运行了一些明显的时间之后。 有没有什么办法可以告诉JVM我想从一开始就编译这个方法(没有用-XX:CompileThreshold类的东西调整其他内部-XX:CompileThreshold )?

Java中有多少个JDBC连接?

我有一个由大约15种方法组成的Java程序。 而且,这些方法在程序执行期间经常被调用。 目前,我正在每个方法中创建一个新连接并在其上调用语句(数据库在网络上的另一台机器上设置)。 我想知道的是:我应该在main方法中只创建一个连接,并将其作为参数传递给需要连接对象的所有方法,因为它会显着减少程序中连接对象的数量,而不是创建并且在每种方法中经常关闭连接。 我怀疑我没有在当前设计中非常有效地使用资源,并且考虑到该程序将来可能会增长很多,因此还有很大的改进余地。

如何制作无网段代码?

与此答案相关: https : //stackoverflow.com/a/11227902/4714970 在上面的答案中,提到了如何通过避免分支来避免分支预测失败。 用户通过替换以下内容来演示: if (data[c] >= 128) { sum += data[c]; } 附: int t = (data[c] – 128) >> 31; sum += ~t & data[c]; 这两个是等价的(对于特定的数据集,不是严格等同的)? 在类似的情况下,我可以采取哪些一般方法来做类似的事情? 它总是通过使用>>和~ ?

调整Java套接字的性能

我已经创建了一个远程桌面控制应用程序。 显然,它由客户端和服务器部分组成: 服务器: 从客户端接收鼠标/键盘操作; 将桌面截图发送给客户端。 客户: 从服务器接收屏幕截图; 发送鼠标/键盘动作; 考虑发送屏幕截图。 当我使用家用PC作为服务器时 – 我最终获得了1920×1080的屏幕截图尺寸。 通过使用JAI Image I / O Tools并将其编码为PNG,我能够为这样一个大图像获得以下统计数据: 写时间~0.2秒; (不是插入套接字,而是进入某些“常规”输出流, 即编码时间 ) 读取时间~0.05秒; (不是来自套接字,而是来自某些“常规”输入流, 即解码时间 ) 大小~250 KB; 完美的品质。 因此,根据#1 – 理想的可能FPS应为~5。 不幸的是,我甚至无法达到~5 FPS,甚至不能达到2 FPS。 我搜索了瓶颈,发现对套接字I / O流的写入/读取需要大约2秒( 参见附录1和2以进行说明 )。 当然这是不可接受的。 我对这个主题进行了一些研究 – 并在两侧增加了对套接字I / O流(使用BufferedInputStream和BufferedOutputStream )的BufferedOutputStream 。 我从64 KB大小开始。 这确实提高了性能。 但仍然不能拥有至少2个FPS! 另外,我已经尝试过Socket#setReceiveBufferSize和Socket#setSendBufferSize并且速度有一些变化,但我不知道它们的行为究竟如何,因此我不知道要使用哪些值。 看初始化代码: 服务器: […]

为什么HashMap比HashSet更快?

我一直在阅读/研究HashMap比HashSet更快的原因。 我不太了解以下陈述: HashMap比HashSet更快,因为值与唯一键相关联。 在HashSet ,成员对象用于计算哈希码值,对于两个对象,哈希码值可以相同,因此使用equals()方法检查是否相等。 如果返回false ,则表示两个对象不同。 在HashMap ,使用密钥对象计算哈希码值。 使用密钥对象计算HashMap哈希码值。 这里,成员对象用于计算哈希码,对于两个对象可以是相同的,因此使用equals()方法来检查相等性。 如果返回false ,则表示两个对象不同。 总结我的问题: 我认为HashMap和HashSet以相同的方式计算哈希码。 他们为什么不同? 你能提供一个具体的例子, HashSet和HashMap如何以不同的方式计算哈希码? 我知道什么是“关键对象”,但是“成员对象”是什么意思? HashMap可以做与HashSet相同的事情,并且速度更快。 为什么我们需要HashSet ? 例: HashMap = new HashMap(); map.put(“obj1”,true); => exist map.get(“obj1”); =>if null = not exist, else exist

用Java设计高性能状态机

我正在开始编写Java库来实现高性能的有限状态机。 我知道那里有很多库,但是我想从头开始编写自己的库,因为几乎所有的库都构建了自动机,这些自动机被优化为一次只能处理一个。 我想知道SO社区中涉及状态机设计的人员在实现像这样的高性能库时最重要/最好的设计原则是什么。 注意事项 生成的自动机通常不是很大的。 (~100-500州)。 实现应该能够扩展 。 实现应该能够实现快速转换 (最小化,确定等)。 希望实施DFA,NFA,GNFA,PDA和可能的Tree Automata。 希望在可能的情况下在单一界面下。 应该在内存使用和性能之间取得良好的平衡。 目前关于设计的当前问题是: 应该定义State , Symbol和Transition类吗? 或者应该使用“隐藏的”内部结构。 就个人而言,我觉得使用类本会浪费大量内存,因为相同的信息可以以更加浓缩的forms存储。 但是,这是否可以实现更快的转换? 它是否有任何其他优点/缺点? 在内部存储数据的最佳方法是什么? 使用像HashMap和HashSet这样的数据结构可以实现分摊的常量时间查找,但是存在涉及开销的元素。 这是最好的方法吗? 将转换信息存储为原始(或非)数组似乎浪费了相当多的内存。 特别是当库需要一次处理很多自动机时。 不同数据结构的优缺点是什么? 我很感激任何意见。 谢谢!

TreeMap或HashMap更快

我正在编写一个字典,它大量使用String作为Map 。 我关心的是HashMap和TreeMap哪一个会在搜索地图中的键时产生更好(更快)的性能?

Java ByteBuffer性能问题

在处理多个千兆字节的文件时,我注意到一些奇怪的事情:似乎从使用文件通道的文件读取到使用allocateDirect分配的重用ByteBuffer对象比从MappedByteBuffer读取要慢得多,实际上它比读取字节更慢使用常规读取调用的数组! 我希望它(几乎)与从mappedbytebuffers读取一样快,因为我的ByteBuffer分配了allocateDirect,因此读取应该直接在我的bytebuffer中结束,没有任何中间副本。 我现在的问题是:我做错了什么? 或者bytebuffer + filechannel是否比常规io / mmap慢? 我下面的示例代码我还添加了一些代码,将读取的内容转换为long值,因为这是我的真实代码不断执行的操作。 我希望ByteBuffer getLong()方法比我自己的字节shuffeler快得多。 测试结果:mmap:3.828 bytebuffer:55.097常规i / o:38.175 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.MappedByteBuffer; class testbb { static final int size = 536870904, n = size / 24; static public long byteArrayToLong(byte [] in, int offset) { return ((((((((long)(in[offset + […]

性能说明:预热后代码运行速度较慢

下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字)。 前两个块的运行速度比第三个块快约10倍。 我已经运行了这个测试程序超过10次,结果显示非常小的差异。 如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是: 35974537 36368455 296471550 有人能解释一下发生了什么吗? (为了清楚起见,我不是要在这里修改任何东西,只是想更好地了解发生了什么) 注意: 程序期间没有运行GC(使用-XX:+PrintGC ) 使用Oracle JDK版本1.6.0_30,1.7.0_02和1.7.0_05进行测试 还使用以下参数进行测试: -XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m =>相同结果 它将块放入循环中,所有运行都很快 如果将块提取到方法,则所有运行都很快(无论方法被调用3次还是循环都没有区别) public static void main(String… args) { //three identical blocks { long start = System.nanoTime(); CountByOne c = new CountByOne(); int sum = 0; for (int i = 0; i < 100000000; i++) { […]