Наше приложение на работе является огромным проектом с более чем 3 000 единиц, взвешиваясь приблизительно 3,5 миллиона строк кода.
... или по крайней мере это было, когда мы компилировали его под D2007. Мы недавно обновили к D2010, и теперь если мы выполняем полную сборку, количество строки наконец останавливается приблизительно в 4,9 миллионах. Тот же DPR, та же кодовая база, то же все, но компилятор, так или иначе работающий на основе приблизительно на 40% большего количества строк кода в цикле сборки и никто здесь не знает почему.
Только для создания вещей более сбивающими с толку, после здания, мы можем перейти к Проекту-> информация в IDE, и это сообщает 3.8M строки. В D2007 диалоговом окне компилятора и Проекте-> информационное диалоговое окно сообщило о том же числе.
У кого-либо есть какая-либо идея, что продолжается здесь?
Я думаю, что это помогает больше, если вы видите своими глазами, что на самом деле это может быть сделано полностью без скриптов.
Вот 1 на 1 перезаписи с помощью среди прочих JSTL (просто drop jstl-1.2.jar
в /WEB-INF/lib
) core и functions tallib:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>My Events - <decorator:title /></title>
<link href="${pageContext.request.contextPath}/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a
${fn:contains(pageContext.request.requestURI, '/events/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/events/Listing.action">Events</a>
<a
${fn:contains(pageContext.request.requestURI, '/people/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${fn:contains(pageContext.request.requestURI, '/events/')}">
<a href="Listing.action">List of Events</a>
|<a href="New.action">New Event</a>
</c:if>
<c:if test="${fn:contains(pageContext.request.requestURI, '/people/')}">
<a href="Listing.action">List of People</a>
|<a href="New.action">New Person</a>
</c:if>
</div>
Вот более оптимизированная перезапись, обратите внимание, что я использовал c: Набор
для «кэширования» результатов выражения для повторного использования и что я использую HTML < base >
тэгов, чтобы избежать размещения пути контекста в каждой ссылке (просто сделайте все относительные URL-адреса на вашей веб-странице относительно нее - без ведущей косой черты!):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:set var="isEvents" value="${fn:contains(pageContext.request.requestURI, '/events/')}" />
<c:set var="isPeople" value="${fn:contains(pageContext.request.requestURI, '/people/')}" />
<html>
<head>
<title>My Events - <decorator:title /></title>
<base href="${pageContext.request.contextPath}">
<link href="assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a ${isEvents ? 'class="selected"' : ''} href="events/Listing.action">Events</a>
<a ${isPeople ? 'class="selected"' : ''} href="people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${isEvents}">
<a href="Listing.action">List of Events</a>|<a href="New.action">New Event</a>
</c:if>
<c:if test="${isPeople}">
<a href="Listing.action">List of People</a>|<a href="New.action">New Person</a>
</c:if>
</div>
Его можно оптимизировать больше, если собрать все «жестко закодированные» значения, такие как события
и люди
и ссылка тексты в карте
в области приложения и использовать под каждым JSTL < c: forEach >
для отображения вкладок.
Что касается фактического вопроса , можно отключить сценарии (и получить ошибки выполнения об их использовании), добавив следующую запись в webapp web.xml
. Это может помочь заметить наблюдаемые скрипты.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
Для получения дополнительной информации об EL обратитесь к учебнику Java EE, часть II, глава 5 . Неявные объекты EL, такие как $ {pageContext}
, описаны здесь . Для получения дополнительной информации о JSTL обратитесь к учебнику Java EE, часть II, глава 7 . Обратите внимание, что JSTL и EL - это две отдельные вещи. JSTL - это стандартный tallib , и EL позволяет просто осуществлять программный доступ к внутренним данным. Хотя он обычно используется в tallbs, как JSTL, он также может использоваться автономно в тексте шаблона.
Вы должны знать общие принципы этих алгоритмов, потому что они являются основами программирования, и это даст вам представление о том, где они должны использоваться. Например, вы должны понимать быстро сортировать достаточно хорошо, чтобы понять, почему это может быть O (N ^ 2) в патологических случаях.
Однако нет абсолютно никакого смысла запоминать достаточно подробностей, чтобы иметь возможность кодировать реализации качества производства этих алгоритмов на первом опробовании верхней части головы. Именно для этого и нужны библиотеки. Например, если все, что вы помните, это каноническая 3-строчная версия быстрой сортировки, и вы не можете вспомнить, как реализовать один, который не легко найти О (N ^ 2) случаев и сортов на месте, в этом нет ничего плохого.
-121--2402960-Интересно, возвращается ли обработка linefeeds/carriage, чтобы определить число строк в области выполнения компилятора, каким-то образом становится недостойным в результате внутренних устройств Юникода.
Пробовали ли вы компилировать в D2009 и видеть ли это проявляет такое же странное поведение?
Есть ли у вас основания ожидать, что ваша куча будет медленно расти в размере? Похоже, что по обоим следам он растет. Одна вещь, которую я сделал много раз, это уменьшить мою кучу, чтобы попытаться сделать проблему хуже. Однако 256M идет о нижней границе для Скалы.
Одна вещь, которую я заметил ранее, это то, что если у вас есть недолгие предметы, которые делают его из поколения эдема из-за слишком большого давления, это может постепенно убить вас. Это может произойти, когда есть всплеск активности (может быть, у вас всплеск утром?), и ваше пространство eden недостаточно велико. Скала в целом и актеры в частности интенсивно используют небольшие недолговечные предметы, и кажется, что есть этот волшебный порог, что как только вы пересекаете его, он все вниз по холму. Так что одна пробежка будет в порядке, и следующие аварии и ожоги.
Другое, что я заметил ранее, это то, что настройки GC, которые хорошо работают на OSX/x86, часто плохо работают на Sparc/Solaris и наоборот. Если вы находитесь в CoolThreads, я предлагаю настроить GC так, чтобы в планировщике/пуле был один поток GC на поток.
Что приводит к другому - убедитесь, что планировщик не создает новые потоки волей-неволей. Иногда так и будет. Я бы сказал, что вы должны почти всегда вручную устанавливать колпачок на резьбе. Я не знаю, насколько это актуально, но интересный факт о планировщике форк-соединения, который актеры используют по умолчанию, заключается в том, что он предназначен для коротких задач, связанных с ЦП. Выполнение ввода-вывода в потоках, которыми он управляет, завинчивает свои предположения. Конечно, это все еще должно сработать, но...
Удачи! Я потерял много-много дней своей жизни из-за таких проблем.
Посмотрите на некоторые опции здесь: http://java.sun.com/performance/reference/whitepapers/tuning.html
Похоже, вы используете коллектор параллельного сдвига. Попробуйте установить:
-XX:+UseParallelGC
-121--3404083- Похоже, что пользовательские действия нарушены и неправильно обрабатываются отсутствующие ресурсы.
Каким образом ЦС будет его обрабатывать, если пользователь вручную удалит файлы? Что произойдет, если пользователь удалит папку приложения, а затем попытается удалить ее через ARP?
Что произойдет, если пользователь просто удалит компонент без удаления всего приложения? Вам будет лучше в долгосрочной перспективе починить ЦА.
-121--3909723-Может ли это быть потому, что это более агрессивно с вложением?
Разве D2010 не поддерживает дженерики? Я думаю, что некоторые из библиотек были заменены на общие, которые могли бы учитывать дополнительные строки, которые кажутся анализируемыми, если он считает «виртуальные» строки, которые он использует.
Похоже, это ошибка. Правильный номер строки все еще указывается в разделе Project | Information. Смотрите ответ Ника на похожий вопрос .