, Если Вы хотите, чтобы время выполнения предоставило значение параметра по умолчанию, необходимо использовать отражение для совершения вызова. Не столь хороший как другие предложения для этого вопроса, но совместимый с VB.NET.
using System;
using System.Runtime.InteropServices;
using System.Reflection;
namespace ConsoleApplication1
{
class Class1
{
public static void sayHelloTo(
[Optional,
DefaultParameterValue("world")] string whom)
{
Console.WriteLine("Hello " + whom);
}
[STAThread]
static void Main(string[] args)
{
MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
mi.Invoke(null, new Object[] { Missing.Value });
}
}
}
-XX: MaxPermSize
действительно работает, вам просто нужно получить правильное значение. По умолчанию, я считаю, что это 32 МБ для виртуальной машины в режиме клиента и 64 МБ для виртуальной машины в режиме сервера. Я предлагаю установить его на 256 МБ, если у вас есть память:
java -XX:MaxPermSize=256m
Проблема возникает из-за того, что Spring и Hibernate могут интенсивно использовать классы, созданные во время выполнения, а иногда и очень много. Все эти сгенерированные классы попадают в пул памяти PermGen, поэтому, если вы используете эти фреймворки, вам часто нужно увеличивать PermGen до больших объемов.
Я видел эту проблему с Hibernate (используется без Spring). Проблема заключалась в том, что мы создавали экземпляр SessionFactory для каждого пользовательского запроса, а не создавали единственный экземпляр на время существования приложения.
Я использовал профилировщик YourKit чтобы исследовать это и обнаружить проблему.
Как говорит скаффман, свойство -XX: MaxPermSize действительно работает, однако иногда у вас может возникнуть основная проблема, из-за которой повышение лимита может только отложиться.
Вы видели эту заметку ? Однажды это помогло мне решить аналогичную проблему. Подводя итог по ссылке:
Visual GC, теперь часть JDK 6, дает очень красивое графическое представление памяти в реальном времени. Вы можете увидеть, что происходит с райским уголком, поколениями и перманентным пространством. Вы просто не поймете почему.
ОБНОВЛЕНИЕ: это bin / jvisualvm.exe в моем дистрибутиве JDK 1.6.0_13. Дайте ему PID процесса, который вы хотите отслеживать.
All responses here relates to PermGen problem that happens because of several restarts of web-app, but in this case the problem already happens on first deployment after tomcat restart, so it can't be the problem of ClassLoader's references or commons-logging.
Если вы работаете на jdk6, вы можете использовать приложение jconsole для отслеживания использования памяти приложением и дальнейшего исследования.
Еще один путь, которым следует заняться, - использовать профилировщик, я используйте JProfiler и посмотрите на приложение с этим. Он скажет вам, в чем именно заключается проблема.
Вы Следует помнить, что в некоторых версиях Tomcat возникают утечки памяти при передислокации во время войны. Это случилось со мной на tomcat 6.0.x.
Как было предложено увеличить MaxPermSize , это временное решение для вашей машины разработки - и когда вы получите сообщение об ошибке, через 2-3 дня просто перезапустите сервер. На производстве не все так просто. Итак, этот работает для разработки , но этот подход не работает для производственной среды , где вы должны исправить проблемы с утечками памяти.
Для обнаружения утечек используйте Приложение jconsole , которое поставляется с jdk 1.6 и 1.5. Вы можете выполнить привязку к процессу и наблюдать за использованием памяти с течением времени.
Вы также можете прочитать это: