По умолчанию для разработки JVM использует небольшие размеры и небольшую конфигурацию для других функций, связанных с производительностью. Но для производства вы можете настроить, например. (Кроме того, может существовать конкретная конфигурация сервера приложений) -> (Если памяти недостаточно, чтобы удовлетворить запрос, а куча уже достигла максимального размера, произойдет выход OutOfMemoryError)
-Xms set initial Java heap size
-Xmx set maximum Java heap size
-Xss set java thread stack size
-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)
Например: В предпочтительной настройке для платформы Linux для режима производства.
После загрузки и настройки сервера таким образом http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7- 1-rhel-7 /
1.create setenv.sh файл в папке / opt / tomcat / bin /
touch /opt/tomcat/bin/setenv.sh
2.Откройте и напишите этот параметр для настройки предпочтительного режима.
nano /opt/tomcat/bin/setenv.sh
export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"
3. service tomcat restart
Обратите внимание, что JVM использует больше памяти, чем только кучу. Например, методы Java, стеки потоков и собственные дескрипторы выделяются в памяти отдельно от кучи, а также внутренние структуры данных JVM.
Эта проблема может быть решена путем правильной установки *off
(четвертый параметр my_read()
).
Вам нужно возвращать счет в первый раз и ноль со второго раза вперед.
if(*off == 0) {
while (msg[count] != 0) {
put_user(msg[count], buff++);
count++;
(*off)++;
}
return count;
}
else
return 0;
Вы не соблюдаете размер буфера, переданный в функцию dev_read
, поэтому вы можете вызывать неопределенное поведение в cat
. Попробуйте следующее:
static ssize_t dev_read( struct file *filp, char *buff, size_t len, loff_t *off )
{
size_t count = 0;
printk( KERN_ALERT"inside read %d\n", *off );
while( msg[count] != 0 && count < len )
{
put_user( msg[count], buff++ );
count++;
}
return count;
}
.read
также должна правильно обрабатывать свои аргументы len
и off
. Самый простой способ реализовать чтение из файла с буферизацией памяти - использовать хелпер simple_read_from_buffer
:
static ssize_t dev_read(struct file *filp, char *buff, size_t len, loff_t *off)
{
return simple_read_from_buffer(buff, len, off, msg, 100);
}
Вы можете проверить код этого помощника (определенный в fs/libfs.c
) для образовательных целей.
BTW, для вашего метода .write
вы можете использовать помощник simple_write_to_buffer
.