Вот такой вот показательный пример,
Фрагмент (очень неполный) читает нечто по протоколу superset of http
Комментарии в тексте мои.
Внимание! я не критикую автора. Я просто хочу обратить внимание
на то как safe код фактически рушит систему — код работал на клиенте
и возникла потребность перенсти его на сервер. Сервер не сказать
чтобы умер — просто перестал "серверить".
class ReaderThread extends Thread
{
InputStream input_stream = null;
Socket socket = null;
ByteBuffer readBuffer = new ByteBuffer();
ByteBuffer line = new ByteBuffer();
....
public void run ()
{
....
// Читаем посимвольно - набиваем буфер.
// сюда мы попадаем не для каждого IP адреса
while( (ch = input_stream.read()) != -1 )
{
....
if(конец строки и еще кое что)
....
// Пеночка №1: чтобы сделать нечто полезное с текстовыми (ASCII)
// данными их надо в строку widechar загнать.
// Не барское это дело с bytes работать.
// Реаллокация буфера №1 - кол-во байт +2N.
String header_line = new String( line.get() );
// Пеночка №2: делаем еще одну строку потому как нам надо
// регистронезависимый парсинг делать.
// Реаллокация буфера №2 - кол-во байт +2N+2N.
header_line = header_line.toUpperCase().substring( 0, len - 2 );
// Теперь собсвенно вызываем startsWith - для чего и делалась вся
// бодяга выше.
if( header_line.startsWith( HttpHeader.HTTP_CONTENT_LENGTH ) )
{
// Щаз будем парсить.
// Аллокация объекта - сколько ест - то нам не ведомо.
StringTokenizer v = new StringTokenizer(header_line, ": ");
// Теперича значить толкаем на стек try frame
// потому как нужно ловить NumberFormatException в Integer.parseInt
try{
v.nextToken();
v.nextToken(" ");
ContentLen = Integer.parseInt( v.nextToken() );
}catch(Exception e3){}
}
}
}
}
}
}
Итого загрузка 1мб файла вызывает аллокацию 5мб памяти. Вот серверок-то и дохнет....
100 тредов и "шоб ви жили на один page file"
Резюме: Наличие высокоуровневых языков с GC и библиотек это конечно здорово, но!
результат который вот реально получился тот же примерно что и поймать GPF в С++.
Для нахождения где оно и как оно клинит сервер ушел один день — ровно столько сколько
бы вызвало устранение GPF.
Еще раз ничего личного ни про Java ни про другие фреймворки.
Просто разработка надежного кода занимает ровно то же самое время что с что без.
Глубокое заблуждение что если managed code то типа надежная система автоматом.