在Azure App Service中设置JVM堆选项

时间:2018-11-17 08:17:44

标签: java azure azure-web-sites

我一直在尝试将应用程序部署到Azure应用程序服务(免费版),并且由于内存限制,该应用程序由于使用过多的内存而不断被杀死。当然,解决此问题的最简单方法是在启动时在JVM上设置-Xmx900m,但是到目前为止,我尝试过的方法都没有起作用。

我尝试过的事情:

  1. -Xmx900m属性中(开始时)将httpPlatform添加到了web.config arguments标签中。
  2. -Xmx900m添加到了JAVA_OPTS环境变量中(在“应用程序设置”中)
  3. 使用-Xmx900m文件将web.config添加到JAVA_OPTS环境变量中。

问题是我无法验证其中任何一个是否确实有效,因为在Kudu中,我看不到所使用的命令行或在检查进程方面做得太多,只能看到它在任何地方都使用了多少内存。给定的时刻。显然,在每种情况下,似乎都忽略了该设置,因为内存使用量攀升至1024MB,然后进程由于内存分配失败而崩溃。

我可以在Azure App Service Java应用程序中设置最大堆设置吗?

1 个答案:

答案 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();
    }
}

如果您还有问题,请告诉我。