- В числовых литералах группы цифр теперь можно разделить подчеркиванием:
public final static int INT_WITH_UNDERSCORES = 100_000; - Добавлены бинарные литералы с префиксом 0b:
public final static int BINARY_INT = 0b001100; - В качестве ключа switch теперь можно применять тип String:
switch("one") {
case "one" :
case "two" : System.out.println("JSR 334");
} - Теперь можно не повторять определение типа при создании объекта generic класса:
List<String> foo = new ArrayList<>(); - В блоке catch можно перечислить несколько классов исключений:
try {
throw new NullPointerException();
} catch (ArithmeticException | NullPointerException e) {
} - UPD Для целей проверки синтаксиса используется наименьший общий тип перечисленных исключений:
try {
throw new NullPointerException();
} catch (NullPointerException | ArithmeticException e) {
// Будет ошибка компиляции
// ArithmeticException a = e;
// Общий тип
RuntimeException r = e;
} - Добавлены автоматически закрывающиеся после выполнения блока try ресурсы, которые должны реализовывать интерфейс java.lang.AutoCloseable:
class Resource implements AutoCloseable {
@Override
public void close() throws Exception {}
} - Конструкция try с автоматически закрывающимся ресурсом может быть без catch и finally:
try (Resource resource = new Resource()) {
throw new Exception();
} - В методах и конструкторах, использующих переменное число аргументов переменного типа теперь будет выдаваться предупреждение unchecked or unsafe operation, если они не аннотированы SafeVarargs. Аннотировать можно конструкторы, final и static методы:
class Coin<T> {
@SafeVarargs
public Coin(T ... args){
}
@SafeVarargs
public final void instanceMethod(T ... args){
}
@SafeVarargs
public static void staticMethod(K ... args){
}
}
Как мы запустили Qwen3.8–27B целиком на RTX 5060 8 GB и получили ~30 токенов/с
Наш проект называется ExVRAM Lab. Это открытая исследовательская лаборатория, в которой мы проверяем, насколько большие локальные LLM можно запускать на обычных видеокартах с ограниченным объёмом VRAM, если использовать ultra‑low‑bit quantization, полное размещение весов на GPU и существующие open‑source inference‑технологии.
ExVRAM расшифровывается как Exchange Compute for VRAM. Основная идея проекта — в ряде сценариев выгоднее потратить часть свободной вычислительной мощности GPU на работу с более компактным представлением весов, чем хранить часть модели в оперативной памяти и постоянно передавать данные через PCIe.
Когда мы начинали проект, исходный вопрос был достаточно простой: можно ли запустить dense‑модель примерно на 27 миллиардов параметров на видеокарте всего с 8 ГБ VRAM так, чтобы она не просто «запустилась», а работала полностью на GPU, поддерживала длинный контекст и обеспечивала нормальную интерактивную скорость генерации.
В качестве основной тестовой системы мы используем NVIDIA GeForce RTX 5060 8 GB на архитектуре Blackwell. Основная модель в текущих экспериментах — Qwen3.8–27B.
Сначала результат выглядел не слишком впечатляюще. Модель запускалась, но значительная часть весов оставалась в системной памяти. Около 5,7 GiB весов находилось на GPU, ещё примерно 2,5 GiB — на CPU. Скорость генерации составляла порядка 3,8–5,5 токена в секунду.
При этом сама видеокарта была загружена далеко не полностью.
Это стало одним из первых важных наблюдений проекта. Проблема заключалась не столько в нехватке вычислительной мощности RTX 5060, сколько в том, что часть decoder weights находилась в RAM. Во время autoregressive generation данные приходилось постоянно передавать между CPU и GPU через PCIe.

