Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何控制JVM使用的内存?_Java_Tomcat_Raspberry Pi - Fatal编程技术网

Java 如何控制JVM使用的内存?

Java 如何控制JVM使用的内存?,java,tomcat,raspberry-pi,Java,Tomcat,Raspberry Pi,问题 我正在用java为我的raspberry pi编写一个数据处理应用程序。我正在使用postgresql、hibernate和tomcat。我的应用程序是为最小化内存使用而设计的(因为raspberry pi的限制),但java要求所有内存。如何指示JVM只使用所需的内存 算法 要处理每个数据项,请执行以下步骤: -从表中检索对象(引用对象) -对于表中的每个对象: --检索对象 --如果测试有效,则与引用进行比较将新对象存储在第二个表中 --破坏物体 默认情况下,JVM不会释放内存,而是逐

问题 我正在用java为我的raspberry pi编写一个数据处理应用程序。我正在使用postgresql、hibernate和tomcat。我的应用程序是为最小化内存使用而设计的(因为raspberry pi的限制),但java要求所有内存。如何指示JVM只使用所需的内存

算法 要处理每个数据项,请执行以下步骤: -从表中检索对象(引用对象) -对于表中的每个对象: --检索对象 --如果测试有效,则与引用进行比较将新对象存储在第二个表中 --破坏物体

默认情况下,JVM不会释放内存,而是逐渐地要求越来越多的内存

问题: 我可以使用哪些JVM选项?我可以使用什么编程策略?

“Java VisualVM可以让开发人员生成和分析堆转储、跟踪内存泄漏、执行和监视垃圾收集,以及执行轻量级内存和CPU评测”。这个工具很棒。你试试看。

您可以使用-Xmx作为JVM选项来控制堆大小。此外,我猜postgresql和hibernate是内存消耗者。您可以尝试使用derby和empired db或普通的旧JDBC,具体取决于应用程序的复杂性。我自己,我有一个运行在raspberry pi上的Tomcat7来数字化一些传感器数据并提供绘图。有了ps,它声称RSS只有50MB

USER      PID    VSZ   RSS ST %CPU %MEM     TIME CMD
pi      19633 257988 50040 Sl  0.2 10.0 00:29:32 java -cp WEB-INF/classes:libs/tomcat-embed-core-7.0.37.jar:libs/tomcat-embed-logging-juli-7.0.37.jar:libs/raytion-commons-web.jar:libs/commons-exec-1.1.jar:libs/commons-cli-1.2.jar:libs/commons-lang-3.0.jar:libs/tomcat-embed-logging-log4j-7.0.37.jar:libs/log4j-1.2.16.jar:libs/joda-time-2.3.jar:libs/tomcat-embed-jasper-7.0.37.jar: -Ddatadir=../Heizungsdaten server.WebServer

请将flag-Xmx配置为允许jvm使用的最大内存

例:

仅允许256兆内存


如果您使用tomcat、jboss等服务器,请在特定的配置文件上定义-Xmx

使用profiler找出代码的哪个部分消耗内存。可能存在一些隐藏的问题,例如,如果您想要一个列表实例并使用默认构造函数,java将创建一个包含10个元素的列表。若您只需要5个元素的列表,那个么使用
5
参数调用构造函数,而不是调用默认构造函数。等等我也建议看一下java源代码。它位于JDK主文件夹的src.zip中。
java -Xmx256m ...