Настройка параметров кучи JVM в службе приложений Azure - PullRequest
0 голосов
/ 17 ноября 2018

Я пытался развернуть приложение в службе приложений Azure (бесплатный уровень), и из-за ограничений памяти приложение продолжает убивать, поскольку оно использует слишком много памяти.Конечно, самый простой способ решить эту проблему - установить -Xmx900m на JVM при запуске, однако ни один из методов, которые я пробовал, до сих пор не работал.

Что я пробовал:

  1. Добавлен -Xmx900m в тег web.config httpPlatform, в атрибуте arguments (в начале).
  2. Добавлен -Xmx900m в переменную среды JAVA_OPTS (в настройках приложения)
  3. Добавлено -Xmx900m в переменную среды JAVA_OPTS с использованием файла web.config.

Проблема в том, что я не могу проверить, работает ли какой-либо из них на самом деле, потому что в Куду яне может видеть командную строку, которая использовалась, или действительно много делает для проверки процесса, кроме того, чтобы видеть, сколько памяти он использует в любой данный момент.Конечно, кажется, что параметр игнорируется в каждом из этих случаев, поскольку использование памяти увеличивается до 1024 МБ, а затем происходит сбой процесса с ошибкой выделения памяти.

Есть ли что-нибудь, что я могу сделать, чтобы установить максимальную кучунастройка в приложениях Java службы приложений Azure?

1 Ответ

0 голосов
/ 19 ноября 2018

Если у вас есть процесс Java в Куду, вы можете проверить процесс Java PID с помощью jps, затем использовать jmap -heap [pid] в каталоге jdk / bin, и вы получите подробную информацию о куче памяти.

Если вынет, вы можете создать 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();
    }
}

Если у вас остались вопросы, пожалуйста, дайте мне знать.

...