Articles of Java的

Java内存的奥秘(我有泄漏)?

我有一个独立的Java问题在Linux服务器上运行。 我用-Xmx256m开始了jvm。 我附加了一个JMX监视器,可以看到堆永远不会真的通过256Mb。 但是,在我的Linux系统上运行顶层命令时,我可以看到: 1)首先,这个过程的RES内存使用量约为350Mb。 为什么? 我想这是因为堆外的记忆? 2)其次,这个过程的VIRT内存使用量正在不断增长和增长。 它永远不会停止! 现在显示在2500Mb! 所以我有泄漏? 但堆不增加,它只是循环! 最终,这会造成一个问题,因为系统交换不断增长,最终导致系统死亡。 任何想法是怎么回事? 我想问的一个重要问题是,这可能是我的代码的结果,而不是JVM,内核等的一些情况。例如,如果线程的数量不断增加,那么是否符合我的观察的描述? 任何类似的东西,你可以build议我留意?

Netty 4在Linux上接收多播数据包

我写了一个应用程序接收发件人发送的组播数据包(包含audio)。 我已经使用Netty 4,并已经在Windows上运行该应用程序,但是在Linux(Debian Wheezy(raspi)和Ubuntu 12)上运行时,它不会收到多播数据包。 我创build了一些可以发送和接收多播数据包的testing代码,结果是: 发送Windows到Windows的作品。 发送Linux到Windows的作品。 发送Windows到Linux,数据包发送但没有收到。 我以root身份运行该应用程序,并将SO_BROADCAST设置为true。 我错过了什么? 如果我使用标准的Java MulticastSocket而不是Netty,那么这个应用程序就可以工作,但是我更喜欢使用Netty,因为它很容易使用并且大大简化了代码。 testing代码是: public class TestMulticast { private int port = 51972; private Logger log = Logger.getLogger(this.getClass()); private InetAddress remoteInetAddr = null; private InetSocketAddress remoteInetSocket = null; private InetAddress localInetAddr = null; private InetSocketAddress localInetSocket = null; private DatagramChannel ch = null; private EventLoopGroup […]

Java Runtime.getRuntime()。exec()带引号

我试图通过在Linux上的EXEC调用运行ffmpeg。 但是我必须在命令中使用引号(ffmpeg需要它)。 我一直在寻找通过java文档的processbuilder和执行和问题在stackoverflow,但我似乎无法find一个解决scheme。 我需要跑步 ffmpeg -i "rtmp://127.0.0.1/vod/sample start=1500 stop=24000" -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv 我需要在下面的参数string中插入引号。 注意,由于processbuilderparsing和运行命令的本质,简单地在反斜杠之前添加单引号或双引号不起作用。 String argument = "ffmpeg -i rtmp://127.0.0.1/vod/" + nextVideo.getFilename() + " start=" + nextVideo.getStart() + " stop=" + nextVideo.getStop() + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv"; 任何帮助将不胜感激。

在生产环境中保护密码

我们有一个运行在JBoss和Linux上的Java Web应用程序。 生产环境数据库连接参数来自只存在于生产环境应用程序服务器上的configuration文件。 该configuration文件只能由运行应用程序的用户ID读取(我们称之为用户appuser),唯一可以login到生产环境服务器的人员以及sudo到appuser是我们运营团队的成员。 生产环境本身被所有其他环境所阻挡。 我们想让这个更安全。 具体而言,我们希望防止操作团队读取configuration文件中当前的数据库连接密码和其他密钥。 另一个需要记住的因素是操作团队负责构build和部署应用程序。 我们有什么select? 该解决scheme需要支持手动重启应用程序,以及在操作系统重启时自动启动应用程序。 更新 我现在正在调查的解决scheme(向Adamski提出他的build议,大致转化为步骤1): 编写一个setuid包装器可执行文件给启动/停止应用程序的用户,并拥有JBoss目录树中的configuration文件和所有内容。 build造后使用jarsigner来签署WAR。 战争的build设将通过发展来完成。 setuid包装将validation签名,validationWAR没有被篡改。 将部署过程更改为仅部署已签署的WAR。 setuid包装器也可以将WAR移动到JBoss deploy目录中。

ant:warning:编码UTF8的不可映射字符

我看过很多像我这样的问题,但是他们不回答我的问题,因为我使用的是ant,而且我没有使用eclipse。 我运行这个代码: ant clean dist ,它告诉我无数次warning: unmappable character for encoding UTF8 。 我看到在Java命令中有一个-encoding选项,但是这并不能帮助我因为我使用的是ant。 我在Linux上,我试图运行Sentrick的开发版本; 我没有做任何修改,我只是下载它,并按照他们的指示 ,这不是没有什么区别。 我发邮件给开发者,他们告诉我这是个问题,但是我怀疑这个问题实际上是在这个错误的结尾: BUILD FAILED /home/daniel/sentricksrc/sentrick/build.xml:22: The following error occurred while executing this line: /home/daniel/sentricksrc/sentrick/ant/common-targets.xml:83: Test de.denkselbst.sentrick.tokeniser.components.DetectedAbbreviationAnnotatorTest failed 我不知道我现在要做什么,因为我真的需要它的工作

如何在Linux中签署Mac OS X应用程序?

对于OS X,我将我的Java应用程序分发到DMG中。 自Mountain Lion发布以来,打开应用程序给出了以下错误信息: [应用程序名称]已损坏,无法打开。 您应该popup磁盘映像。 显然,修复是签署.app文件,所以我阅读了代码签名指南 。 除了如何将这个function集成到我的一键构build过程这个重要的问题之外,一切似乎都很简单。 在所有平台上构build我的产品发生在我的Linux开发机器上。 我运行一个Ant脚本,并安装了Windows安装程序,初学者EXE,Linux安装程序,OS X应用程序和DMG。 所以我想将代码签名集成到这个过程中。 是否有相当于Linux的“codesign”?

SocketInputStream.socketRead0()中CPU占用率高的原因

在分析本土networking应用程序的时候,我发现下面非常奇怪(至less对我来说)是观察的。 几乎所有的时间都花在SocketInputStream类的socketRead0()方法中。 这并不奇怪,因为我的应用程序在每个请求上都与远程服务联网。 奇怪的是,这种方法不仅壁挂时钟使用率高, CPU时钟时间也很高。 我不明白为什么CPU时间很长,因为如果我的应用程序等待远程服务来回复(实际上这不是很快),那么应用程序本身就没有什么可做的了。 所以CPU时间应该显然很低。 还有一些观察: 在采样模式下的VisualVM显示,方法SocketInputStream.socketRead0()正在消耗高达95%的时间(挂钟时间和 CPU时间); mpstat (我们使用Linux作为操作系统)显示约90%的用户时间和约1-3%的系统时间(其余为空闲时间); 应用程序部署在专用服务器上; 远程服务也是HTTP Web应用程序。 平均响应时间约为100ms。 平均响应大小约为2Kb。 我的应用程序使用spring RestTemplate与远程服务交互,而不是直接与SocketInputStream交互。 现在我只有一个想法 – 也许这是在JVM中调用本地方法的开销( SocketInputStream.socketRead0()是本地的)? 你怎么看? 有没有其他的原因呢?

截断内存映射文件

我正在使用内存映射IO的索引文件,但问题是,我不能resize为空的文件。 某处之前: MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30); raf.close(); // use map map.force(); map = null; 调整: for (int c = 0; c < 100; c++) { RandomAccessFile raf = new RandomAccessFile(indexFile, "rw"); try { raf.setLength(newLen); if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer"); return; […]

在Linux中运行时如何在Java中创build符号链接?

在Linux中运行时如何在Java / JVM中创build符号链接? 除了使用Java本地接口(JNI)或者java.lang.Runtime.exec("/bin/ln -s /some/path symlink")什么方法吗? 创build一个符号链接是非常依赖于平台的,但是我主要关心在Linux上运行,如果在Windows中创build一个快捷方式,那么奖励就会很大。

即使端口未被占用,也无法启动Glassfish 3.1

在新安装的Debian“Squeeze”服务器上启动Glassfish 3.1时出现问题。 这是一个已经安装的testing服务器, Glassfish安装从一个工作服务器复制到另一个服务器。 我试过跑步: # ./asadmin start-domain There is a process already using the admin port 4848 — it probably is another instance of a GlassFish server. Command start-domain failed. 我也尝试重新启动域,因为我想也许它正在运行: # ./asadmin restart-domain Server is not running, will attempt to start it… There is a process already using the admin port 4848 — […]