почему вывод `du` часто так отличается от` du -b`

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
25
задан knittl 17 April 2011 в 16:26
поделиться

1 ответ

Пример минимальной гранулярности блоков

Давайте немного поиграем, чтобы посмотреть, что происходит.

mount говорит мне, что я нахожусь в разделе ext4, смонтированном в /.

Я нахожу его размер блока с помощью:

stat -fc %s .

, что дает:

4096

Теперь давайте создадим несколько файлов с размерами 1 4095 4096 4097:

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

и результаты:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Итак, мы видим, что все, что ниже или равно 4096, на самом деле занимает 4096 байтов.

Затем, как только мы пересекаем 4097, он поднимается до 8192, который является 2 * 4096.

Тогда ясно, что диск всегда хранит данные на границе блока в 4096 байтов.

Что происходит с разреженными файлами?

Я не исследовал, что такое точное представление, но ясно, что --apparent принимает это во внимание.

Это может привести к тому, что видимые размеры будут больше, чем фактическое использование диска.

Например:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

дает:

8192    f
1073741825      f

Связанные: Как проверить, поддерживается ли разреженный файл

] Что делать, если я хочу хранить кучу небольших файлов?

Некоторые возможности:

Библиография:

Протестировано в Ubuntu 16.04.

1
ответ дан Ciro Santilli 新疆改造中心996ICU六四事件 17 April 2011 в 16:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: