Национальный исследовательский университет
Информационных Технологий Механики и Оптики
ФКТиУ, кафедра ВТ
Основы Программной Инженерии
Лабораторная работа №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();
}


