Articles of Java的

Java程序运行一段时间后变慢了

我有一个java程序,这是一个典型的机器学习algorithm,通过一些方程更新一些参数的值: for (int iter=0; iter<1000; iter++) { // 1. Create many temporary variables and do some computations // 2. Update the value for the parameters } 更新参数的计算相当复杂,我必须创build很多临时对象,但是它们不会被引用到循环之外。 循环中的代码是CPU密集型的,不能访问磁盘。 这个程序加载了一个相对较大的训练数据集,因此,我向JVM授予了10G内存(-Xmx10G),远远大于它所需要的(“top”命令或窗口任务pipe理器在〜6G的峰值)。 我在几台安装了Sun热点JDK / JRE 1.8的Linux机器(centos 6,24G内存)和一台窗口机器(win7,12G)上进行了testing。 我没有指定除-Xmx之外的其他JVM参数。 这两台机器都专门用于我的程序。 在Windows中,我的程序运行良好:每次迭代使用非常相似的运行时间。 但是,在所有的centos机器上运行的时间是奇怪的。 它最初运行正常,但是在第7次/第8次迭代时会显着减慢(减慢〜10倍),然后在每次迭代中保持减速〜10%。 我怀疑这可能是由Java的垃圾收集器造成的。 因此,我使用jconsole来监视我的程序。 次要GC在两台机器上都经常发生,这是因为程序在循环中创build了许多临时variables。 此外,我使用“jstat -gcutil $ pid $ 1s”命令并捕获了统计信息: Centos: https ://www.dropbox.com/s/ioz7ai6i1h57eoo/jstat.png ? dl = 0 […]

.m2,Ubuntu中的settings.xml

在Windows环境中,您将在C:\ Users \ user_name位置中具有.m2文件夹,并且将您的settings.xml文件复制到它以便设置您的代理设置和连接库存储位置等。 所以,在Ubuntu环境下安装Maven之后,我必须要做类似的设置。

Java Runtime.exec在Linux上遇到困难

大家好。 我正在开发一个Java程序,用于Linux环境,创build一个运行另一个Java类的新Java程序,但是我遇到了麻烦。 我终于解决了所有的问题。 调用 Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 在我的Java程序中返回 /bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory 在stdout / stderr中。 如果我尝试 Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 我得到一个Javaexception Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or […]

运行自定义TextSecure(信号)服务器

我试图启动我的自定义TextSecure(信号)服务器。 我希望将它用于Signal的所有function(包括SMS和电话)。 我相信我也需要redphone服务器来运行电话。 我发现只有https://github.com/WhisperSystems/TextSecure-Server的 TextSecure服务器的github仓库,但是没有redphone服务器的仓库。 我想我也需要运行这个服务器https://github.com/WhisperSystems/PushServer来正确操作Signal。 我曾尝试从github下载整个TextSecure服务器,并将其作为maven存储库添加到intelijidea,但它不允许我运行它,因此编译它。 任何人都有运行一个cusotm TextSecure服务器的经验? 我需要一个小指南,因为我总是卡在这个。 感谢前进

Java语音识别

有没有人有任何开源的经验,或相对便宜的语音识别API的Java? 我非常想找一些能把说出来的单词变成文字的东西。 从Sun的Java语音识别页面看来,这似乎是一个相当死亡的东西。 我的要求是至less在Linux上运行的东西。 谁能推荐一些东西? 纯Java将是一个奖金,否则基于Linux的解决scheme可以考虑。 因为这是一个家庭项目…越便宜越好。 编辑 CMU狮身人面像As Amit指出CMU狮身人面像http://cmusphinx.sourceforge.net/html/cmusphinx.php我的问题是一个巨大的字错误率。 培训本身就像一个项目,我希望能在这个周末有所收获。 IBM ViaVoice “ Via Voice”开放源代码在2004年有消息公布。 新闻发布似乎不成熟,而且从未发生。 威盛语音是在某个时候发布的Linux ,但似乎他们停了下来。 似乎在IBM网站上留下的所有内容都是ViaVoiceembedded式的 。 IBM Websphere Voice 我想这就是为什么ViaVoice(桌面)似乎停止。 IBM创build了这个商业解决scheme,这个解决scheme将花费更多的成本。 而使用它将会把你剩下的,至less在我的websphere和他们的IDE的经验之后。 Nuance的 看来他们仍然可能为linux创build产品。 但是我认为他们迷了路,并且跟随IBM进入了服务器市场。 我不太确定这个,他们的网站在寻找有用的信息方面并不友善。 开放的心灵/言论自由 这些人不断改变他们的项目名称。 可能有些钱饥饿的公司一直在威胁他们,但我不知道。 该项目看起来有点死。 我可能会尝试在这周末训练狮身人面像,看看它是否想成为朋友。 否则,更糟糕的情况是,我会考虑使用微软的语音解决scheme。 它在过去一直很好,但它不是一个好的Linux解决scheme。 我可以通过酒来使用它,但是我会有两个独立的服务器…凌乱的凌乱。 哦,什么似乎是一个很好的地方访问语音/语音SpeechTechMag 。 他们有一个“Anual Reference”,其中包含一些与语音/语音有关的公司名单。

如何在linux的classpath中添加多个jar文件

好的,我对linux和命令行非常陌生,对于java来说也是相当新的。 我有一个build立一个Java程序的实习。 我终于完成了我的机器(Windows),现在我必须迁移到一台Linux机器进行testing,然后将其作为可执行文件运行。 我在linux上做了很多的阅读和研究,对classpath有所了解,但是还是很难完全理解。 这只是不为我点击。 任何人都可以用例子简单地解释classpath的目的吗? 其中一个最令人困惑的方面是实际上定义了jar子的物理path。 我是从usr开始的,还是只需要从jvm文件夹开始? 如果有关系,我的java程序不在jvm文件夹中。 任何人都可以为我揭开一些光明吗? 编辑:非常感谢你们的帮助,我不能说我完全清楚,但是我对我的处境的了解要好得多。

列出多个jar文件的内容

我在一堆jar子里search一个.class文件。 jar tf abc.jar 适用于一个文件。 我试过了 find -name "*.jar" | xargs jar tf 什么也不印。 我能想到的唯一解决方法是解压所有,然后search。 有没有更好的办法? 我在LUnix。 编辑 :当扫描很多jar文件时,打印jar文件名和类是很有用的。 这种方法效果很好: find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done 产生的样本输出: 1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 1718 Wed Jul 25 10:20:18 EDT […]

在Docker容器中运行的JVM的驻留集大小(RSS)和Java总承诺内存(NMT)之间的差异

场景: 我有一个运行在Docker容器中的JVM。 我做了一些内存分析,使用两个工具:1) 顶部 2) Java本机内存跟踪 。 数字看起来令人困惑,我试图找出造成差异的是什么。 题: Java进程报告RSS为1272MB,总Java内存报告为790.55 MB。 我怎样才能解释其余的内存1272 – 790.55 = 481.44 MB去哪里? 为什么我要在SO上看到这个问题之后继续保持这个问题: 我确实看到了答案,解释是有道理的。 但是,从Java NMT和pmap -x获得输出后, 我仍然无法具体映射哪些java内存地址实际上是驻留和物理映射的 。 我需要一些具体的解释(详细的步骤)来找出导致RSS和Java Total Commit内存之间的区别的原因。 顶部输出 Java NMT Docker内存统计信息 图表 我有一个docker集装箱运行超过48小时。 现在,当我看到一个包含以下内容的图: 提供给docker集装箱的总内存= 2 GB Java最大堆= 1 GB 总提交(JVM)=始终小于800 MB 使用的堆(JVM)=始终小于200 MB 使用非堆(JVM)=始终小于100 MB。 RSS =大约1.1 GB。 那么,在1.1 GB(RSS)和800 MB(Java Total Commit内存)之间吃什么呢?

如何重现一个默默丢弃的TCP / IP连接?

我有一种情况,一个Java程序build立一个长期运行的TCP / IP连接到一个服务器,并且所说的连接的function与文档完全一样,除了在我的控制之外的环境中的一件事。 每个星期六,服务器都重新启动,但由于某种原因,这不能正确传达给我的客户端,所以连接只是挂起来等待响应。 这与使用过时的JDBC连接看到的行为完全相同,在服务器和客户端之间的某个路由器发现连接处于空闲状态并在没有通知的情况下将其删除。 我需要能够重现这种情况能够创build一个适当的修复。 因此,我需要知道是否有一个很好的方法来模拟路由器在我的控制下默默地放下连接? 我可以在我的开发环境和服务器之间放置一个Linux机器或Mac。 我可以在虚拟机(vmware播放器)中运行JVM,如果我可以在那里下载的话。 build议是非常受欢迎的。 编辑2012-12-18:为我工作的解决scheme是使用本地的基于Java的SOCKS5代理,可以用Ctrl-Z任意暂停,并告诉我的应用程序通过它。

从Linux内核/ libc版本是什么Java Runtime.exec()安全的内存方面?

在工作中,我们的目标平台之一是运行Linux的内核资源受限的小型服务器(内核2.6.13,基于旧的Fedora Core的自定义分发)。 该应用程序是用Java编写的(Sun JDK 1.6_04)。 Linux OOM杀手被configuration为在内存使用超过160MB时终止进程。 即使在高负载的情况下,我们的应用程序也不会超过120MB,并且与其他一些活动的本地进程一起,我们仍然能够保持在OOM限制之内。 但是,事实certificate,Java Runtime.getRuntime()。exec()方法是从Java执行外部进程的标准方法, 在Linux上有一个特别不幸的实现 ,导致派生subprocess(临时)需要相同数量的内存作为父进程,因为地址空间被复制。 最终的结果是我们的应用程序在我们执行Runtime.getRuntime()。exec()时被OOM杀手所杀害。 我们目前通过一个独立的本地程序来执行所有外部命令,并通过套接字与该程序进行通信。 这不是最佳的。 在网上发布这个问题后,我得到了一些反馈,指出这不应该发生在Linux的“更新”版本上,因为它们使用copy-on-write实现了posix fork()方法,这大概意味着它只会复制它需要的页面在需要的时候修改而不是立即整个地址空间。 我的问题是: 这是真的? 这是内核,libc实现还是其他地方? 从什么版本的内核/ libc /无论是copy-on-write for fork()可用?