2

我试图在 Oracle JVM 中执行一些 java 代码,但得到 java.lang.OutOfMemoryError。

所以我想为 Oracle JVM 分配更多内存。我们应该怎么做?

提前致谢。

4

3 回答 3

5

似乎您超出了 OJVM 的堆大小。

首先,您需要了解您现在总共有多少可用的堆大小:看看您的初始化参数JAVA_POOL_SIZE。如果为 0,那么您正在使用自动内存管理(10g 或 11g)并且堆大小由 Oracle 服务器“自动”确定。然后可以以sga_target(10g)或memory_target(11g)为上限。

每个会话的最大堆大小受参数限制java_max_sessionspace_size(值 0 表示默认为 4GB)。

有了这两个值,取较小的一个并检查由代码引起的内存需求/堆大小是否应该适合这个内存量。

  • 如果是:您的 java 代码中有内存泄漏。
  • 如果不是:增加java_pool_size, sga_target/memory_targetjava_max_sessionspace_size.

请参阅http://docs.oracle.com/cd/B28359_01/java.111/b31225/chnine.htm#BABGFDAE(Java内存使用)和http://docs.oracle.com/cd/B28359_01/server.111/ b28320/initparams099.htm#REFRN10074 + http://docs.oracle.com/cd/B28359_01/server.111/b28320/initparams100.htm#REFRN10075(参数)获取详细文档。

关于您在主题中的问题“如何查看分配给 Oracle JVM 的内存”:

select * from v$sgastat where pool = 'java pool';
于 2012-07-12T12:54:23.567 回答
0

您可以使用http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html,特别是 -XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio

于 2012-07-12T11:23:19.203 回答
0

上述建议对我不起作用。您可以使用

select getMaxMemorySize() from dual

显示这一点。然后,您可以使用以下方法进行设置:

create or replace function setMaxMemorySize(num number) return number
is language java name
'oracle.aurora.vm.OracleRuntime.setMaxMemorySize(long) returns long';

然后调用这个函数:

select setMaxMemorySize(1024*1024*1024) from dual;

注意:这仅设置会话的最大内存。您需要为每个新会话调用它。

于 2018-07-05T15:11:46.370 回答