2010-05-28 136 views
26

我们有一个PHP webapp,它调用一个java二进制文件来生成pdf报告(带有jasperreport),java二进制outpus pdf到标准输出和退出,然后将php发送到浏览器。这个java命令持续大约3到6秒,我认为当它持续6秒时,这是因为GC启动了,所以我想禁用它,因为无论如何当命令退出所有内存时都会返回。如何禁用Java垃圾收集器?

我想知道如何禁用它为Java 1.4.2和Java 1.6.0,因为我们目前正在测试两个JVM,看看哪些执行得更快..

感谢

+7

只是暗示其他方法(因为流程启动也需要时间):http://github。com/hudora/pyJasper包含一个(java)服务器,它可以根据请求运行jasperreports,而不需要启动/关闭进程。 – ZeissS 2010-05-28 08:16:44

+0

相关的具体对象:http://stackoverflow.com/questions/1329926/how-to-prevent-an-object-from-getting-garbage-collected – 2015-03-04 08:08:24

回答

25

没有办法完全禁用垃圾收集。垃圾收集只在JVM空间不足时运行,因此您可以为程序提供更多内存。添加这些命令行选项Java命令

-Xmx256M -Xms256M 

这给RAM的程序的256Mb(默认为64MB)。垃圾收集对于默认大小的JVM不会花费3秒,因此您可能想要更仔细地调查程序正在执行的操作。 Yourkit profiler对于弄清楚需要很长时间的事情非常有用。

24

GC只踢当JVM是短暂的记忆,所以你要么GC或死。尝试打开详细的GC并查看它是否确实需要大量时间。

java -verbose:gc 
+1

嗯,那么也许我可以使用命令行开关给它更多内存,因此增加了GC未启动的机会。 – Nelson 2010-05-28 08:00:47

+1

是的,在分析verbose:gc的输出后,您会知道是否需要执行此操作。这是第一步。 – unbeli 2010-05-28 08:01:58

+6

+1为“测试,不要猜测”。时间差异可能是完全不相关的东西,比如I/O争用或某些CPU繁重进程。 – gustafc 2010-05-28 08:08:32

1

您确定它是垃圾回收导致放缓吗?你用-verbose:gc运行java来看看发生了什么?

您无法禁用JVM上的垃圾回收。但是,您可以查看tuning垃圾收集器以获得更好的性能。

2

您可以使用-Xmx选项设置最大堆大小;使用更大的堆应该防止虚拟机运行内存不足,从而需要尽快进行垃圾收集。

+2

只需设置-Xmx就不会有任何区别。您实际上也需要设置-Xms,因为您要控制初始堆大小。 – 2010-05-28 08:14:00

33

听起来好像你正在努力节省时间,但是却以错误的方式前进。与启动和关闭java进程所用的时间相比,禁用垃圾回收所节省的时间将是微不足道的(对于单个任务)。如果运行时间性能是您的目标,您可能需要考虑进行java进程启动,您可以多次提问以执行所需的工作。

+1

好的一个......我想,它也可以节省碧玉的初始化。 – helios 2010-05-28 08:15:20

+0

是的,这是一个很好的方法,虽然需要做更多的工作,但我必须编写一种守护进程来监听套接字,等等......除了这个“守护进程”之外,还必须在X天内重新启动一次。 (从我的经验)泄漏内存.. – Nelson 2010-05-28 08:20:55

+0

@Nelson考虑看看您是否可以使用像Mule这样的东西来托管您的Java进程并让它为您处理所有通信。这个想法就是你只需要将你的JasperReports作为一种服务嵌入,ESB可以根据需要将这些请求托管和路由。 Mule:http://www.mulesoft.com/mule-esb-open-source-esb – 2010-05-28 08:28:31

0

正如大家所说的,你不能在JVM中禁用GC,这是合理的,因为如果你能够存在内存泄漏,由于Java没有明确的方式让开发人员删除堆数据。

您有权访问此java二进制文件的源代码吗?如果是这样,可能值得分析它,看看是否有任何瓶颈可以更好地写出来减少GC活动。这可以使用大多数Java分析器完成,例如JProbe。

+0

java二进制非常简单,它只是检索命令行参数并调用jasperreport函数来创建报告,该报告传递给System.out outputstream,PHP通过“passthrough”函数读取它。 所以花时间在Jasperreport上完成报告,多数民众赞成我如何想java普遍加速。 – Nelson 2010-05-28 08:28:40

+0

看起来像控制JVM GC设置是您的唯一途径。 – display101 2010-05-28 08:39:50

0

为了避免垃圾回收器释放任何对象的变量或属性, 您必须将此属性(由gc发布)设置为静态类 这是我的解决方案。

示例:

private static String myProperty;