1

我正在尝试调试 pl/java 的问题,这是 PostgreSQL 的一种过程语言。我在 Linux 服务器上运行这个堆栈。

本质上,每个 Postgres 后端(连接进程)都必须启动自己的 JVM,并使用 JNI 来启动。这通常是 pl/java 的一个主要限制,但它有一个特别讨厌的表现。

如果本机内存耗尽(我意识到这实际上可能不是由于 malloc() 返回 NULL,但效果大致相同),则此故障处理得相当差。由于“本机内存耗尽”,它会导致 OutOfMemoryError。这会导致 Postgres 后端的段错误,源自 libjvm.so 和一个 javacore 文件,内容如下:

0SECTION       TITLE subcomponent dump routine
NULL           ===============================
1TISIGINFO     Dump Event "systhrow" (00040000) Detail "java/lang/OutOfMemoryError" "Failed to create a thread: retVal -1073741830, errno 11" received
1TIDATETIME    Date:                 2012/09/13 at 16:36:01
1TIFILENAME    Javacore filename:    /var/lib/PostgreSQL/9.1/data/javacore.20120913.104611.24742.0002.txt
***SNIP***

现在,有一些定义合理的方法可以改善 Java 的这些类型的问题,如下所述:

http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

我认为如果我可以将最大堆大小设置为远低于默认值的值,那将特别有效。通常,可以按照以下方式做一些事情:

堆的大小由 Java 命令行使用 -Xmx 和 -Xms 选项控制(mx 是堆的最大大小,ms 是初始大小)。尽管逻辑堆(积极使用的内存区域)可以根据堆上的对象数量和在 GC 中花费的时间量增长和缩小,但使用的本机内存量保持不变,并且由 - Xmx 值:最大堆大小。大多数 GC 算法依赖于将堆分配为连续的内存板,因此当堆需要扩展时,不可能分配更多的本机内存。所有堆内存必须预先保留。

但是,我不知道如何遵循这些步骤以使 pl/java 的 JNI 初始化初始化具有较小堆的 JVM;我不能很好地将这些命令行参数传递给 Postgres。所以,我的问题是,如何设置最大堆大小或在这种情况下专门控制这些问题?这似乎是 pl/java 的一个普遍问题,所以我希望能够与 Postgres 社区分享我最终得到的任何解决方案。

请注意,我对 JVM 内部没有经验,并且通常不熟悉 Java。

谢谢

4

1 回答 1

1

根据本演示文稿中的幻灯片 19, postgresql.conf 可以具有参数 pljava.vmoptions,您可以在其中将参数传递给 JVM。

于 2012-09-13T14:56:10.073 回答