Articles of pipe理员

Java 8与Jetty在Linux内存问题

你能帮我解决以下问题吗? 语境: 我们正试图将我们现有的运行在Java6(Glassfish)上的应用程序迁移到Java8(在Jetty9上)。 之前,我们能够在Java7上成功迁移相同的设置(在jetty9上)。 但客户决定现在就用Java 8。 在这个过程中,我们遇到了一些内存问题,下面是细节: 问题描述: 启动Jetty服务器后,java进程的初始(RES)内存使用量约为5.5克。 在运行应用程序一段时间后,内存使用缓慢上升,并消耗机器上最大的可用物理内存(8g),最终导致服务器/系统崩溃。 这个问题只在linux环境下遇到。 在Windows环境中找不到这样的问题。 Profiler发现: 使用VisualVM和jconsole监视服务器。 在两个分析器中,JVM的内存(堆和非堆)使用率都低于分配的限制。 环境详情: Java Version : 8 Server : Jetty 9.2.10 OS : linux on a virtual machine(Linux version 2.6.32-279.14.1.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Tue Nov 6 23:43:09 UTC 2012 Java Options : -Xms3072M […]

Linux堆结构和malloc()和free()

我有一个Linux 2.6内核的Debian,我试图理解堆是如何工作/行为与malloc()和free() 。 我试图searchmalloc()和free()algorithm和堆结构,但我找不到任何有用的东西。 不幸的是,我对Linux和内存工作原理知之甚less,无法理解free()和malloc()的源代码。 这是一个示例代码: int main(int argc, char **argv) { char *a, *b, *c; a = malloc(32); b = malloc(32); c = malloc(32); strcpy(a, argv[1]); strcpy(b, argv[2]); strcpy(c, argv[3]); free(c); free(b); free(a); } 使用gdb并run AAAA BBBB CCCC我可以检查堆。 这是strcpys之后,但在frees之前的状态: (gdb) x/32x 0x804c000 0x804c000: 0x00000000 0x00000029 0x41414141 0x00000000 0x804c010: 0x00000000 0x00000000 0x00000000 0x00000000 0x804c020: 0x00000000 […]

如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道?

如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道? 今天我可以从Qt程序的fifo中打开和读取,但是我不能让程序逐行读取数据。 Qt读取整个文件,意味着等待“发件人”closures会话。 让我们以一些shell命令为例来展示我想要的应用程序。 先创build一个fifo mkfifo MyPipe 然后我们可以用猫从fifo读取 cat MyPipe 然后我们发送一些数据与另一只猫 cat > MyPipe 然后开始input一些东西,每次你input它就会到达读者。 然后用Ctrl + Dclosures它,双方结束。 现在,发送者很容易用QTextStream创build,你只需要在发送时刷新。 QFile file("MyPipe"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); for(int i=0; i<3; i++) { out << "Hello…: " << i << "\n"; out.flush(); sleep(2); } file.close(); 但是,然后写一个逐行阅读的小读者是我现在卡在哪里,我所有的Qt库的尝试结束了,我得到的数据,但直到发件人在fifo上使用file.close() 。 不是当他冲水时,就像我用猫读书时发生的那样。 像这样的例子: QFile […]

在现有代码中replace新内存分配器的最佳解决scheme是什么?

在过去的几天中,我已经获得了有关除标准malloc()之外的内存分配器的一些信息。 对于有很multithreading的应用程序来说,有些实现似乎比malloc()好得多。 例如,似乎tcmalloc和ptmalloc有更好的性能。 我有一个C ++应用程序,在许多地方同时使用malloc和new操作符。 我认为用ptmalloc等replace它们可能会提高它的性能。 但是我想知道在运行在Linux上的C ++应用程序中, new操作符是如何操作的? 它使用malloc或其他的标准行为吗? 在代码中用旧代码replacenew内存分配器的最好方法是什么? 有没有什么办法来覆盖的行为或new malloc或我是否需要逐一replace所有的电话?

在进程之间进行通信时,队列对pipe道有什么优势?

使用pipe道上的2个队列在进程之间进行通信的好处是什么(如果有的话)? 我打算使用multiprocessing python模块。

在C中实现pipe道

我正在尝试在C中实现pipe道,例如 – $ ls | wc | wc $ ls | wc | wc 我写了下面的代码 – #include<stdio.h> #include<stdlib.h> #include <unistd.h> void run_cmd(char *cmd, int* fd_in, int* fd_out) { int c = fork(); if (c==0) { if (fd_in != NULL) { close(fd_in[1]); dup2(fd_in[0], 0); } if (fd_out != NULL) { close(fd_out[0]); dup2(fd_out[1],1); } execlp(cmd, cmd, NULL); […]

Linux命令输出作为另一个命令的参数

我想传递一个命令元素的输出列表作为另一个命令的参数。 我发现了其他一些网页: 如何在stdout上显示一个Linux命令的输出,并将其输出到另一个命令? 使用bash命令的输出(使用pipe道)作为另一个命令的参数 但他们似乎更复杂。 我只是想将一个文件复制到每个调用Linux find命令的结果。 这里有什么问题? find . -name myFile 2>&1 | cp /home/myuser/myFile $1 谢谢

Linux的拼接(2)在从TCP套接字拼接时是否工作?

我一直在写一个有趣的小程序,在Linux上用C语言通过TCP传输文件。 程序从套接字读取文件并将其写入文件(反之亦然)。 我最初使用读/写和程序正常工作,但后来我了解拼接,并试图试一试。 我用splice编写的代码在从stdin(redirect文件)读取并写入TCP套接字时工作正常,但是从套接​​字读取并写入stdout时,将拼接设置errno立即失败到EINVAL,从而立即失败。 手册页指出,当任何一个描述符都不是pipe道时,EINVAL被设置(不是这种情况),为无法search的stream传递一个偏移量(没有偏移量通过),或者文件系统不支持拼接,这导致我对我的问题:这是否意味着TCP可以从pipe道拼接,但不是? 我包含了下面的代码(减去error handling代码),希望我做了一些错误的事情。 它很大程度上基于维基百科拼接的例子 。 static void splice_all(int from, int to, long long bytes) { long long bytes_remaining; long result; bytes_remaining = bytes; while (bytes_remaining > 0) { result = splice( from, NULL, to, NULL, bytes_remaining, SPLICE_F_MOVE | SPLICE_F_MORE ); if (result == -1) die("splice_all: splice"); bytes_remaining -= result; } } […]

在pipe道的命令行中创build文件时,如何指定压缩文件中的文件名?

我试图创build一个压缩文件的文件内容正在pipe道,例如 mysql [params and query] | zip -q output.zip – 这会正确写入压缩文件,但是当您打开压缩文件时,其中的文件被称为“ – ”。 有什么办法指定什么文件中的pipe道数据应该在压缩?

Linux乐观的malloc:当内存不足时总是会抛出新的东西?

我一直在阅读有关Linux上的内存不足的情况,手册页中的以下段落让我想到: 默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL时,不能保证内存真的可用。 这是一个非常糟糕的错误。 如果事实certificate系统内存不足,一个或多个进程将被臭名昭着的OOM杀手杀死。 […] 考虑到操作者的新实现最终会在某个时候调用malloc,有没有什么保证新的实际上会扔在Linux上呢? 如果没有,如何处理这个明显无法察觉的错误情况?