我一直在尝试将应用程序部署到Azure应用程序服务(免费版),并且由于内存限制,该应用程序由于使用过多的内存而不断被杀死。当然,解决此问题的最简单方法是在启动时在JVM上设置-Xmx900m
,但是到目前为止,我尝试过的方法都没有起作用。
我尝试过的事情:
-Xmx900m
属性中(开始时)将httpPlatform
添加到了web.config arguments
标签中。-Xmx900m
添加到了JAVA_OPTS环境变量中(在“应用程序设置”中)-Xmx900m
文件将web.config
添加到JAVA_OPTS环境变量中。问题是我无法验证其中任何一个是否确实有效,因为在Kudu中,我看不到所使用的命令行或在检查进程方面做得太多,只能看到它在任何地方都使用了多少内存。给定的时刻。显然,在每种情况下,似乎都忽略了该设置,因为内存使用量攀升至1024MB,然后进程由于内存分配失败而崩溃。
我可以在Azure App Service Java应用程序中设置最大堆设置吗?
答案 0 :(得分:0)
如果Kudu中有Java进程,则可以用PID
检查Java进程jps
,然后在jdk / bin目录中使用jmap -heap [pid]
,您将获得堆内存详细信息。
如果没有,可以创建一个WebJob
来获取详细信息。我得到详细信息并将其放入队列。这是示例代码。
public static final String storageConnectionString =
"DefaultEndpointsProtocol=https;" +
"AccountName=******;" +
"AccountKey=*********;" +
"EndpointSuffix=core.windows.net";
public static void main( String[] args )
{
MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
MemoryUsage usage = memorymbean.getHeapMemoryUsage();
System.out.println("INIT HEAP: " + usage.getInit()/(1024*1024));
System.out.println("MAX HEAP: " + usage.getMax()/(1024*1024));
System.out.println("USE HEAP: " + usage.getUsed()/(1024*1024));
System.out.println("\nFull Information:");
System.out.println("Heap Memory Usage: "
+ memorymbean.getHeapMemoryUsage());
System.out.println("Non-Heap Memory Usage: "
+ memorymbean.getNonHeapMemoryUsage());
CloudQueueMessage message=null;
try {
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString);
// Create the queue client.
CloudQueueClient queueClient = storageAccount.createCloudQueueClient();
// Retrieve a reference to a queue.
CloudQueue queue = queueClient.getQueueReference(**queuename**);
// Create the queue if it doesn't already exist.
queue.createIfNotExists();
// Create a message and add it to the queue.
CloudQueueMessage errormessage = new CloudQueueMessage("INIT HEAP: " + usage.getInit()+
"MAX HEAP: " + usage.getMax()+
"USE HEAP: " + usage.getUsed() +
"Heap Memory Usage: " + memorymbean.getHeapMemoryUsage()+
"Non-Heap Memory Usage: " + memorymbean.getNonHeapMemoryUsage());
queue.addMessage(errormessage);
// Download the approximate message count from the server.
queue.downloadAttributes();
// Retrieve the newly cached approximate message count.
long cachedMessageCount = queue.getApproximateMessageCount();
// Display the queue length.
System.out.println(String.format("Queue length: %d", cachedMessageCount));
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (StorageException e) {
e.printStackTrace();
}
}
如果您还有问题,请告诉我。