Национальный исследовательский университет

Информационных Технологий Механики и Оптики

ФКТиУ, кафедра ВТ

Основы Программной Инженерии

Лабораторная работа №4

2015 г.

Текст задания.

1. Для своей программы из лабораторной работы #4 по дисциплине "Программирование интернет-приложений" реализовать:

-> MBean, считающий общее число установленных пользователем точек, а также число точек, не попадающих в область. В случае, если координаты установленной пользователем точки вышли за пределы отображаемой области координатной плоскости, разработанный MBean должен отправлять оповещение об этом событии.

-> MBean, определяющий средний интервал между кликами пользователя по координатной плоскости.

2. С помощью утилиты JConsole провести мониторинг программы:

-> Снять показания MBean-классов, разработанных в ходе выполнения задания 1.

-> Определить имя и версию ОС, под управлением которой работает JVM.

3. С помощью утилиты VisualVM провести мониторинг и профилирование программы:

-> Снять график изменения показаний MBean-классов, разработанных в ходе выполнения задания 1, с течением времени.

-> Определить имя потока, потребляющего наибольший процент времени CPU.

4. Получить HeapDump, и с помощью утилиты VisualVM локализовать и устранить "утечку памяти" в программе ниже:


Исходный код разработанных MBean-классов и сопутствующих классов.

package Laba4;

import javax. management. NotificationBroadcaster;

public interface TestingMBean extends NotificationBroadcaster{

НЕ нашли? Не то? Что вы ищете?

  public int getPointsCount();

  public int getPointsOutAreaCount();

  public String getTime();

}

package Laba4;

import javax. management. AttributeChangeNotification;

import javax. management. MBeanNotificationInfo;

import javax. management. Notification;

import javax. management. NotificationBroadcasterSupport;

public class Testing extends NotificationBroadcasterSupport implements TestingMBean{

  long starttime;

  long endtime;

  private long sequenceNumber = 1;

  Object getPointsInAreaCount;

  @Override

  public int getPointsCount(){

  return Test. Point. size();

  }

  @Override

  public int getPointsOutAreaCount(){

  int i=0;

  int count=0;

  Ponto p;

  double local_R = Test. Rad;

  double local_x;

  double local_y;

  do {

  p = Test. Point. elementAt(i);

  local_x = p. x;

  local_y = p. y;

  if (!Graph. Area(local_x, local_y, local_R)) {

  count ++;

  System. out. println(i);

  }

  i++;

  }while (i<Test. Point. size());

  return count;

  }

  @Override

  public String getTime()

  {

  long s = (endtime - starttime)/(Test. Point. size());

  String rez = s + " ms";

  return rez;

  }

  public void outOfArea(){

  Notification n = new Notification("Out of Area", this. getClass().getName() ,sequenceNumber,"This point is out area");

  if (Graph. outflag == true) sequenceNumber++;

  sendNotification(n);

  }

  @Override

  public MBeanNotificationInfo[] getNotificationInfo(){

  String[] types = new String[]{

  AttributeChangeNotification. ATTRIBUTE_CHANGE

  };

  String name = AttributeChangeNotification. class. getName();

  String description = "This Point is not in Area";

  MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description);

  return new MBeanNotificationInfo[]{info};

  }

  }


Скриншоты программы JConcole со снятыми показаниями, выводы по результатам мониторинга.

Выше приведены показания: количество отмеченных пользователем точек, количество точек, не попавших в область, среднее время между нажатиями мышки в мс.

В случае, если точка, установленная пользователем, выходит из области, выводятся уведомления.

Имя ОС: Windows 8.1, версия : 6.3 .



Скриншоты программы VisualVM со снятыми показаниями, выводы по результатам профилирования.

Имя потока, потребляющий наибольший процент времени CPU – Laba4.Testing. getPointsOutAreaCount();



Скриншоты программы VisualVM с комментариями по ходу поиска утечки памяти.

Наибольшая утечка памяти происходит в случаях создания массива из 1572864 элементов и при создании объекта на каждой итерации в этом месте:

Thread t = new Thread(new Runnable() {

  public void run() {

  while(true) {

  try {

  B d = new B();

  d. y22();

  Thread. sleep(9);

  } catch(Exception e) {

  // Do nothing

  }

  }

  }

  });

  t. start();

  }