Чтобы не забыть, какие я обычно плагины ставлю к Eclipse.
1. Subclipse
http://subclipse.tigris.org/
2. eclipse-hide-toolbar
http://code.google.com/p/eclipse-hide-toolbar/
3. Eclipse WTP
4. Wireframe Sketcher
http://wireframesketcher.com/
5. PyDev (sometimes)
http://pydev.org/
Showing posts with label java. Show all posts
Showing posts with label java. Show all posts
Tuesday, April 6, 2010
Wednesday, February 4, 2009
Collection.addAll в Java Generics
Родовые типы (generics) в Java - одна из самых интересных и полезных возможностей. Она очень грамотно и логично спроектирована, но иногда попадаются моменты, которые ставят в тупик. Лично я пару натыкался на такой фрагмент:
List<? extends MyType> l1;
List<? extends MyType> l2;
l1.addAll(l2);
Компилятор при этом выдает ошибку в строке, где элементы одной коллекции добавляются в другую. Казалось бы, в чем проблема - коллекции типизированы одинаково, следовательно, могут содержать одинаковые элементы. На самом деле, если бы такой код был допустимым, нарушалась бы безопасность типов (в коллекцию можно было бы добавить недопустимые элементы). Это демонстрирует следующий пример:List<Double> dl = null;
List<Integer> il = null;
List<? extends Number> l1 = dl;
List<? extends Number> l2 = il;
l1.addAll(l2);
В коллекцию Double попадают объекты типа Integer.
Labels:
addAll,
collections,
generics,
java,
коллекции,
разработка
Thursday, December 11, 2008
Java API для Sape.ru
Выложил в публичный доступ когда-то написанный интерфейс для работы с биржей ссылок SAPE.ru. Описание, а также исходники можно посмотреть на Google Code, адрес такой http://javasape.googlecode.com/.
Комментарии можно ссылать по мылу или писать прямо в этом посте.
Thursday, October 23, 2008
Интересный способ мониторинга рабочих сайтов
Иногда возникает ситуация, когда рабочий (production) сайт начинает тормозить, или вообще подвисать. Для нахождения проблемы можно просмотреть код в поисках узких мест или написать нагрузочный тест и посмотреть профилировщиком методы, которые выполняются много времени.
Но часто бывает так, что сайт начинает тормозить только при некотором стечении обстоятельств, например, когда заходит определенный пользователь на определенную страницу. Такого рода узкие места нагрузочным тестом не покроешь, так как не ясно, на каких именно данных проявляется проблема.
В этом случае можно воспользоваться утилитой jstack которая входит в состав JDK начиная с версии 1.5.0. Эта утилита позволяет просмотреть текущее состояние работающих в указанной виртуальной машине потоков (которые thread). Например,
Идея в том, чтобы на каждом запросе добавлять в название потока информацию, необходимую для идентификации узких мест. Тогда использовав jstack, из названия потока можно посмотреть, над чем в данный момент работает он работает.
Например, очевидными кандидатами на добавление в название потока являются адрес страницы, которая обрабатывается и логин пользователя. Код по добавлению этой информации логично разместить в HTTP-фильтре. Фрагмент его будет выглядеть приблизительно так:
Названия потока удобно использовать также в других случаях отладки, например, записать в него User-Agent, и тогда прямо в стектрейсе ошибки будет видно, под каким браузером она возникла.
Но часто бывает так, что сайт начинает тормозить только при некотором стечении обстоятельств, например, когда заходит определенный пользователь на определенную страницу. Такого рода узкие места нагрузочным тестом не покроешь, так как не ясно, на каких именно данных проявляется проблема.
В этом случае можно воспользоваться утилитой jstack которая входит в состав JDK начиная с версии 1.5.0. Эта утилита позволяет просмотреть текущее состояние работающих в указанной виртуальной машине потоков (которые thread). Например,
user@laptop$ jstack 3344
"btpool0-439" prio=10 tid=0xa98da000 nid=0x1b3a in Object.wait() [0xa99ff000..0xa99ff130]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:482)
- locked <0xb47e0078> (a org.mortbay.thread.BoundedThreadPool$PoolThread)
"Java2D Disposer" daemon prio=10 tid=0xaa35c800 nid=0xb2e in Object.wait() [0xa9fd4000..0xa9fd50b0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0xaf007a30> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at sun.java2d.Disposer.run(Disposer.java:125)
at java.lang.Thread.run(Thread.java:619)
Для каждого потока показаны его атрибуты, в том числе его название, и стектрейс. Идея в том, чтобы на каждом запросе добавлять в название потока информацию, необходимую для идентификации узких мест. Тогда использовав jstack, из названия потока можно посмотреть, над чем в данный момент работает он работает.
Например, очевидными кандидатами на добавление в название потока являются адрес страницы, которая обрабатывается и логин пользователя. Код по добавлению этой информации логично разместить в HTTP-фильтре. Фрагмент его будет выглядеть приблизительно так:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String threadName = getUser().login + ": " + RequestInfo.get().getRequestUrl();
Thread.currentThread().setName(threadName);
chain.doFilter(request, response);
}
Теперь, если в выводе jstack будет часто видно, например, такое
"medved: /heavy/calculation" prio=10 tid=0x9aa9a800 nid=0x2519 runnable [0x9ad18000..0x9ad
190b0]
java.lang.Thread.State: RUNNABLE
at com.site.heavy.calculation.Calc.inner(Calc.java:113)
at com.site.heavy.calculation.Calc.outer(Calc.java:43)
значит, для пользователя medved медленно показывается страница /heavy/calculation. Это уже можно профилировать.Названия потока удобно использовать также в других случаях отладки, например, записать в него User-Agent, и тогда прямо в стектрейсе ошибки будет видно, под каким браузером она возникла.
Subscribe to:
Posts (Atom)