为所有小程序设置默认内存限制

时间:2012-11-13 13:09:20

标签: java memory configuration applet icedtea

短版

如何以这样的方式配置the icedtea-plugin package for ubuntu precise,默认情况下它会执行具有特定内存限制的所有applet?最好使用命令行工具而不使用图形用户界面。

长版

我正在使用java applet构建一个kiosk设置,并希望增加所有这些applet的默认内存限制。自助服务终端基于ubuntu linux,使用the icedtea-plugin package作为浏览器插件。由于构建自助服务终端是自动化和无头的,我宁愿从命令行配置它,如果可能的话。

这是我到目前为止所发现的:

  • 我可能需要指定一个-Xmx…命令行参数,该参数将在启动插件的java虚拟机时使用。
  • 可以使用HTML代码中的参数传递这些参数,即 <param name="java_arguments" value="-Xmx…">。 但这意味着修改我的所有HTML文件,我宁愿避免。而且我很有可能必须签署我的代码来完成这项工作,这在我的项目的其他地方增加了很多问题。
  • 在我的桌面系统上,使用Oracle VM,我可以使用一个应用程序ControlPanel来设置这些命令行开关。似乎配置被写入文件~/.java/deployment/deployment.properties,并与密钥deployment.javaws.jre.0.args关联。
  • the specs for that file中未说明该密钥名称。数字0似乎是指一个特定的JVM,如控制面板中表格的一行所示。对于每个JVM,除了args值之外,还有几个值,它们共享一个公共索引号。
  • 根据this wiki section,IcedTea支持位于~/.icedtea/的类似文件。不确定这是表示~/.icedtea/deployment.properties还是~/.icedtea/deployment/deployment.properties。 IcedTea似乎没有带ControlPanel

正如你所看到的,关于这个可能如何工作有很多提示,但到目前为止,我还没有看到关于工作的确切答案。还有许多悬而未决的问题:

  • 我是否必须创建此icedtea部署文件?
  • 我是否必须在路径中包含名为deployment的目录?
  • 为了使此文件按预期工作,我需要指定哪一组最小的键?
  • OpenJDK是否支持args值,即使相应的规范中没有描述它?

我想我可以尝试所有可能的组合,看看其中一个是否有效,但这样做需要相当长的时间。所以我在这里问,看看是否有人有这方面的经验,并且可以提供一个安静的答案。如果没有,我想我最终会回答自己的问题,一旦我努力尝试了事情。

2 个答案:

答案 0 :(得分:0)

正如oracle所说:http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/plugin.html

应设置以下环境变量以向applet添加其他参数:

_JPI_VM_OPTIONS=-Xmx…

此外,正如所提到的网站所说:

  

请注意,设置环境变量后需要重新启动浏览器。如果要在命令shell中设置此环境变量,则必须使用相同的命令shell启动浏览器,以便浏览器继承环境变量的值。

但是,如果您怀疑如何在ubuntu中设置环境变量,以下帖子可能会有所帮助:Make $JAVA_HOME easily changable in Ubuntu

答案 1 :(得分:0)

我刚看了一下icedtea-web插件的源代码。 The part of the code which builds the command line似乎没有任何条款可以包括自定义论证,无论其来源如何。所以我编辑哪个配置文件,HTML文件或环境变量并不重要,那里的代码将构建相同的命令行来调用java,无视我的所有细节。

因此,如果所有配置都失败了,剩下的就是hackery。一种方法是修补插件的源代码,并使其在命令行中包含其他单词。对于静态添加,即单个尺寸改变,这将是相当容易的。更一般的修复将包括某些环境变量的内容,Peter's answer建议的方式。这意味着对有问题的环境变量进行分词,并动态地为单词数组分配空间。在C级别做了相当多的工作。

作为替代方案,可以在执行的二进制级别处理此问题。该插件显然具有硬编码到其中的可执行文件的路径。就我而言,此路径为/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java。可以将该二进制文件重命名为java.orig,并将shell脚本放在其位置,其中包含以下内容:

#!/bin/bash
for i in "$@"; do
  if [[ "${i}" == sun.applet.PluginMain ]]; then
    exec "$0.orig" -Xmx512m "$@"
  fi
done
exec "$0.orig" "$@"

这种方法的一个结果是,ps将不再将这些小程序打印为java,而是打印为java.orig。在大多数情况下不应该是一个问题。