Tag: performance

非常慢的播放框架2.3请求处理代码

我面临的方法表现极慢: HttpRequestDecoder.unfoldAndFireMessageReceived() 和 Future$PromiseCompletingRunnable.run() 这两种方法使用服务器中每个事务的大约一半时间。 它发生在低营养和高使用时间。 例如,凌晨1点,只有我对应用程序的请求,我得到了新的遗物图形,如下所示: 在这个事务中,只有这两个方法消耗1秒,甚至更慢,通过hibernate访问数据库! 再一次,应用程序中只有一个用户。 如果交易较重,则需要更多时间: 在这种情况下,当我自己的代码消耗1.5秒,总共4秒时,这两种方法平均消耗2.5秒。 我觉得那个时刻可能只是误导了新的遗物标准。 也许newrelic会显示这些方法名称,但它确实是我编写的代码。 所以我决定得到一个像这样的自定义指标: playController(){ //Start timer //do the job //stop the timer() and send metric to new relic //return; } 结果是我的代码耗时1.5秒。 所以这次是真正的游戏请求处理程序。 这种行为在高负荷时会杀死我的应用。 当throghput每分钟大约500个请求(实际上不是高吞吐量!)时,这两种方法可能消耗长达20秒,但我的代码保持稳定在最多3秒。 我真的不认为这是一个线程问题,因为它甚至在有一个用户的时候就会发生,但是当有很多并发请求时它会变得很麻烦。 我尝试改变“同步应用程序”的线程数量,例如文档提及,但我没有得到任何性能改变,它甚至变得更糟。 我真的很担心这个问题,因为在两年多的游戏邮件列表中有类似的情况而没有答案!: http://grokbase.com/t/gg/play-framework/159bzf7r9p/help-to-understand-newrelic-report-for-slow-transactions-2-1-4 在StackOverflow中甚至有一个类似的问题,但对于没有回答且没有明显活动的游戏2.1: 使用Play Framework作为后端的NewRelic中的交易缓慢 什么可能导致这种行为的想法?

使用+符号进行字符串连接

今天我正在阅读Antonio的博客关于toString()的表现 ,还有一段: 曾经被认为是邪恶的昨天(“不要用+ !!!连接字符串”),已经变得很酷和高效! 今天,JVM将+符号编译为字符串构建器(在大多数情况下) 。 所以,不要犹豫,使用它。 现在我很困惑,因为他说今天JVM将+符号编译成字符串构建器(在大多数情况下) ,但我以前从未听过或看到(代码)这样​​的东西。 有人可以举例说明JVM是做什么的,它会在什么条件下发生 ?

如何在使用具有线程超时function的ExecutorService时提高性能?

我不是multithreading专家,但我发现当前使用ExecutorService代码存在一些性能问题。 我正在开发一个项目,在这个项目中我需要对我的服务器进行HTTP URL调用,如果响应时间过长则会超时。 目前它正在返回简单的JSON字符串.. 我当前的要求是10 ms 。 在10 ms它应该能够从服务器获取数据。 我猜它是可能的,因为它只是对同一数据中心内的服务器的HTTP调用。 我的客户端程序和实际服务器在同一个数据中心内,并且它们之间的ping时间延迟为0.5 ms ,所以它应该是可行的。 我正在使用RestTemplate进行URL调用。 下面是我为我编写的使用ExecutorService和Callables – public class URLTest { private ExecutorService executor = Executors.newFixedThreadPool(10); public String getData() { Future future = executor.submit(new Task()); String response = null; try { System.out.println(“Started..”); response = future.get(100, TimeUnit.MILLISECONDS); System.out.println(“Finished!”); } catch (TimeoutException e) { System.out.println(“Terminated!”); } catch (InterruptedException […]

已签名的Jar文件中的Spring Component Scan(@Autowire)速度很慢

多年前我们遇到了独立java应用程序中Spring组件扫描速度慢的问题所以我在stackoverflow中问过: 慢速弹簧组件扫描 。 多年以后我再次​​偶然发现了这个问题,我想我发现它为什么很慢:这是因为jar文件是签名的。 目前我们的应用程序中有大约170个jar文件。 我们自己和第三方。 我们签下所有人。 通常我们使用webstart,组件扫描的性能也可以。 只需执行“java -cp mainclass”即可通过庞大的类路径启动我们的app,compoennt扫描需要几分钟。 如果我只是从所有jar文件中删除MANIFEST.MF文件(只包含签名信息),再次运行应用程序,速度就像webstart一样快。 因此签名检查似乎需要花费大量时间。 我尝试在Java控制台中停用签名扫描。 没有效果。 仍然很慢。 有java运行时参数吗?

使用jersey的JAX RS的内存问题

我们目前在高效的服务器上遇到了一些麻烦,因为它消耗的内存过多。 其中一个漏洞可能来自jersey客户端。 我发现了以下两个问题以及如何: 如何正确共享JAX-RS 2.0客户端 关闭JAX RS客户端/响应 https://blogs.oracle.com/japod/entry/how_to_use_jersey_client 我从中获得了什么,我应该重用客户端,还可能重用WebTargets? 同时建议关闭响应,但是如何使用.request()执行此操作? 代码示例,每小时调用大约1000次不同的路径: public byte[] getDocument(String path) { Client client = ClientBuilder.newClient(); WebTarget target = client.target(config.getPublishHost() + path); try { byte[] bytes = target.request().get(byte[].class); LOGGER.debug(“Document size in bytes: ” + bytes.length); return bytes; } catch (ProcessingException e) { LOGGER.error(Constants.PROCESSING_ERROR, e); throw new FailureException(Constants.PROCESSING_ERROR, e); } catch (WebApplicationException […]

在CLASSPATH中使用未使用的JAR文件的影响

我在这里阅读了很多关于可用于查找未使用的 JAR的工具的问答,例如: loosejar Classpath Helper 我的问题是,在编译时或运行时在类路径中有未使用的JAR是否有任何影响(例如将类加载到内存,性能等)? 问题适用于作为独立程序运行和Web服务器(Apache Tomcat),尽管我最初只考虑独立程序。 注意:我正在运行JDK 6u32(64位)。

Java 7 Calendar.getInstance,TimeZone.getTimeZone得到同步和缓慢,任何解决方法?

在将我的运行时升级到Java 7后,我看到了令人难以置信的缓慢……我的程序将所有时间都花在SimpleDateFormat构造函数中。 正如一篇很棒的post所述: http : //coffeedriven.org/? TimeZone = 83 , TimeZone代码现在正在检查static synchronized方法getDefaultInAppContext()是否存在应用程序上下文。 对我来说问题是它是Spring Batch文件阅读器代码,它为它读取的每一行创建一个new SimpleDateFormat对象! 有人为此工作吗?

Kafka消费者配置/性能问题

我正在尝试将kafka作为AWS SQS的替代品。 动机主要是提高性能,其中kafka将消除限制,一次性提取10条消息,上限为256kb。 这是我的用例的高级场景。 我有一堆爬虫正在发送索引文件。 有效载荷的大小平均约为1mb。 爬虫调用SOAP端点,后者又运行生产者代码以将消息提交给kafka队列。 消费者应用程序获取消息并处理它们。 对于我的测试框,我已经为主题配置了30个分区和2个复制。 两个kafka实例正在运行1个zookeeper实例。 卡夫卡版本是0.10.0。 对于我的测试,我在队列中发布了700万条消息。 我创建了一个包含30个消费者线程的消费者组,每个分区一个。 我最初的印象是,与通过SQS获得的相比,这将大大加快处理能力。 不幸的是,事实并非如此。 就我而言,数据处理很复杂,平均需要1-2分钟才能完成。这导致了一系列的分区重新平衡,因为线程无法按时心跳。 我可以在日志引用中看到一堆消息 组full_group的自动偏移提交失败:由于组已经重新平衡并将分区分配给另一个成员,因此无法完成提交。 这意味着后续调用poll()之间的时间比配置的session.timeout.ms长,这通常意味着轮询循环花费了太多时间进行消息处理。 您可以通过增加会话超时或通过max.poll.records减少poll()中返回的批量的最大大小来解决此问题。 这导致多次处理相同的消息。 我尝试使用会话超时,max.poll.records和轮询时间来避免这种情况,但这会减慢整个处理时间。 这是一些配置参数。 metadata.max.age.ms = 300000 max.partition.fetch.bytes = 1048576 bootstrap.servers = [kafkahost1:9092, kafkahost2:9092] enable.auto.commit = true max.poll.records = 10000 request.timeout.ms = 310000 heartbeat.interval.ms = 100000 auto.commit.interval.ms = 1000 receive.buffer.bytes = 65536 fetch.min.bytes = 1 send.buffer.bytes […]

Java Enums – 在枚举上切换语句与访问者模式 – 性能优势?

我一直在寻找这个基于性能的问题的答案。 到目前为止,在挖掘了互联网之后,我了解到有几种方法可以在java中使用Enums, 这里有详细记载。 好吧,作为一个初学者,我希望在switch-case语句中使用Enums,这样可以提供清晰度并更好地理解代码。 但另一方面,我们还有一个访问者模式样式的Enums实现,它确保了类型的安全性和可扩展性, 这里讨论。 话虽如此,并回到这个问题背后的原始想法,到目前为止,我已经了解到如果使用Enums正确设计switch-case结构,这确保了case值不稀疏,并且Enum声明是相同的编译单元作为switch-case语句,java编译器通过实现跳转表这样的构造对生成的字节码执行一些优化(在这里和其他地方讨论过,在Sun的网站上,我丢失了链接)。 现在,与多个/嵌套的if-else构造相比,这肯定会提升性能。 我的问题是,java如何在生成的字节码中实现基于访问者模式的Enums实现,与基于switch-case的实现相比,性能提升是什么? 我应该选择哪种类型的实现,考虑到我的Enums可能在未来增长,我也热衷于性能。 目前,我的Enum中有一些19和奇数常量。 编辑 我有一个类存储有关游戏变量的一些信息。 其中一个变量是Enum类型。 public class GameObject { private Shape mShape; public Shape getShape() { return mShape; } . . . public static enum Shape { SHAPE1, SHAPE2, SHAPE3, SHAPE4, …, SHAPE20 }; public void drawShape() { switch (this.mShape) { case SHAPE1: drawShape1(); break; case […]

JavaFX TableView性能问题

我正在使用javafx表视图控件来显示我的表数据。 现在数据非常庞大,当我在控件中显示完整数据时,它会崩溃。 有没有办法这样做或者我必须缓存数据,以便我可以以块的forms显示它。 我应该使用JTable吗?