Смотрел на Java код. ...много думал.
От: c-smile Канада http://terrainformatica.com
Дата: 28.10.05 21:52
Оценка: 126 (13) +10 -5 :))) :)
Вот такой вот показательный пример,

Фрагмент (очень неполный) читает нечто по протоколу 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 то типа надежная система автоматом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.