SlideShare une entreprise Scribd logo
1  sur  209
One GraalVM to rule them all
One VM to find them,
One VM to bring them all and in darkness bind
them
In the land of Java where shadows lie.
The following is intended to outline our supposed general direction of growth and
development as Java programmers. It is intended for information purposes only, and may not
be incorporated into any contract. It is not a commitment to deliver any material, code, or
functionality, and should not be relied upon in making purchasing decisions. The
development, release and timing of any features or functionality described for products or
services remains at the sole discretion of corresponding companies. Opinions expressed are
solely my own and do not express the views or opinions of my employer.
Информация предназначается чтобы обозначить наше общее направление роста и
развития как Java-программистов. Она предоставляется только в целях ознакомления, и
не может быть использована в контрактах или договорах любого вида. Эта информация
не является попыткой предоставления какого-то материала, кода, или
функциональности, и не должна быть использована в принятии коммерческих решений.
Разработка, выпуск, календарные сроки любых объектов или функциональности,
описанных в контексте продуктов или услуг различных компаний, остается на
усмотрение соответствующих компаний. Описанные в докладе мнения не отражают
позиции работодателя.
Safe Harbor
• Оптимизировать готовый код
• DSL промышленного качества
Зачем?
• Оптимизировать готовый код
• DSL промышленного качества
Зачем?
НЕ ПРИЛАГАЯ УСИЛИЙ
• Оптимизирующий JIT/AOT компилятор
• Фреймворк для создания языков
• Closed-world VM
Как?
Нужно ли это нам?
НЕТ
ДА!
Обычная бизнес-логика, код в стиле Java 6
• Код в современном стиле (лямбды, стримы, Spring, …)
• Дикое количество мелких объектов (которые не убегают)
• Числодробилки
• Scala
• Смешивание языков в одном проекте
ЭТО В ПРОДЕ!
• Twitter
• Несколько финансовых организаций
(пожелавших остаться неизвестными)
• Oracle Labs (GraalVM Enterprise Edition)
Когда рассказываешь,
почему необходимо переходить на GraalVM
История болезни
Бизнес-процессы
BPMN/BPEL
Изображение - https://www.brucker.ch/projects/securebpmn/index.en.html
<process id="my-process" isExecutable="true">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="javascriptScript" />
<scriptTask id="javascriptScript" scriptFormat="JavaScript">
<script><![CDATA[
println("HELLO JUG");
]]>
</script>
</scriptTask>
<sequenceFlow id="flow2" sourceRef="javascriptScript" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
СТАНДАРТЫ
1.OMG BPMN 2.0.1
2.ISO/IEC 19510:2013 (то же самое, что и OMG 2.0.1)
3.OASIS WS-BPEL 2.0
4.BPMN ↔ BPEL (+ проблемы с round trip)
https://pdfs.semanticscholar.org/a649/adae294a35b38d7f4be4c5054bc9fa749e0a.pdf
Execution Engine
наш код + Activiti
Web GUI — ReactJS
In-Memory Data Grid - GridGain
Nashorn
MQ RAM
ТОРМОЗА
1.Внешнее состояние
(IMDG, H2, SQL+HDD, MQ, …)
2.Интерпретатор Activiti
3.Собственный код (Java 8)
4.Трансляция SQL → IMDG
5.Переход границы между Java и JavaScript
6.Usability: проброс Java → React.js
GraalVM?
ТОРМОЗА
1.Внешнее состояние
(IMDG, H2, SQL+HDD, MQ, …)
2.Интерпретатор Activiti
3.Собственный код (Java 8)
4.Трансляция SQL → IMDG
5.Переход границы между Java и JavaScript
6.Usability: проброс Java → React.js
@olegchir
JUG.ru Group (конференции)
Сбербанк-Технологии: ППРБ
Минздрав: ЕГИСЗ, ИЭМК
Госуслуги
IUPAT
Starview Inc
Playtox
CodeOrchestra
Erlyvideo (Flussonic)
ДЕНЬ СУРКА
1. Дизайн языка
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
3. Люди начинают этим пользоваться
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
3. Люди начинают этим пользоваться
4. Все тормозит
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
3. Люди начинают этим пользоваться
4. Все тормозит → разработчик — криворукая тварь
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
3. Люди начинают этим пользоваться
4. Все тормозит → разработчик — криворукая тварь
5. Мучительная оптимизация
КРИВАЯ ИМЕНИ Ш
ДЕНЬ СУРКА
1. Дизайн языка
2. Парсер, интерпретатор AST
3. Люди начинают этим пользоваться
4. Все тормозит → разработчик — криворукая тварь
5. Мучительная оптимизация
• Может, переписать на C++? (нет, нельзя)
• Байткод, интерпретатор байткода
• Работа с немусором (кэширование)
• Работа с мусором (сборщик)
• … (стандартные оптимизации)
МЕЧТЫ
1. Придумал язык
2. Записал на фреймворке
3. Все счастливы
• Быстро работает
• Включая границу языков
• Есть инструменты
• Кишки понятны
GraalVM!
НЕУЛОВИМЫЙ ДЖО
1.Очень академический
2.Сложный и не очень понятный
3.Частично закрытые исходники
4.Недостаточное освещение в СМИ
• Куча научных работ
• Документации днем с огнем не найдешь
• Очень специальные люди
КОМПОНЕНТЫ
1.Graal Compiler
2.Truffle
3.SubstrateVM
Graal Compiler
Латентное размещение Дирихле (LDA)
сходство частей данных по группам
Scala DaCapo
factorie
http://www.scalabench.org/
java -jar ./dacapo.jar -s small -n 3 factorie
It’s demo time!
7461 msec 12424 msec
-XX:+UnlockExperimentalVMOptions
-XX:+UseJVMCICompiler
-XX:+EnableJVMCI
-Djvmci.Compiler=graal
JBreak 2018:
Graal in Real Life
Christian Thalinger
Joker 2017:
Twitter’s quest for a Wholly Graal runtime
Joker 2017: Twitter’s quest for a Wholly Graal runtime
Владимир Долженко
https://habrahabr.ru/post/351996/
private static void checkArgument(
boolean isValid,
String message,
Object ... arguments)
{
if (!isValid){
print(String.format(message, arguments));
}
}
It’s demo time!
Создали мусора за операцию
1079 или 32 байта
C2
Создали мусора за операцию
1490 или 0.033 байта
Graal
ИСТОРИИ НЕУСПЕХА
Activiti 6.0.0
Apache Ignite Fabric 2.4.0
Runtime
Storage
0
1000
2000
3000
4000
5000
6000
7000
8000
9000
mi-1 ut-1 ut-2 ut-3 vst-1 vst-2 1 2 3 4 5
Activiti: Deterministic (2500 runs, 4 cores)
C2 Graal Compiler
0
100
200
300
400
500
600
700
800
900
1000
1 core 2 cores 3 cores 4 cores
Activiti: Randomized (2500 processes total, 4 cores max)
C2 Graal Compiler
0
1000
2000
3000
4000
5000
6000
7000
8000
9000
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 103 106 109 112 115 118
Apache Ignite Fabric - Throughput
C2 Graal Compiler
источник: Doug Simon (2015 год)
КОГДА ЭТО РАБОТАЕТ
1.Соврвеменные фичи типа лямбд
2.Дикое количество мелких объектов (которые не убегают)
3.Scala!
Сбертех:
Отдел разработки лабораторного
кластера супермассивов
Интервью с Валерием Выборновым на Хабре
• Scala, Akka, Hadoop, Spark
• Big Data
• Data Science
сложилось впечатление,
что докладчик не понимает,
как это работает?
Q:
сложилось впечатление,
что почти никто не понимает,
как это работает.
A:
сколько всего оптимизаций?Q:
150+ фаз компиляции
150+ фаз компиляции
+ 5 фаз в Enterprise Edition
150+ фаз компиляции
+ 5 фаз в Enterprise Edition
150+ фаз компиляции
+ 5 фаз в Enterprise Edition
150+ фаз компиляции
+ 5 фаз в Enterprise Edition
http://www.graalvm.org/downloads
1. Partial Escape Analysis
2. Более хороший инлайнинг
GraalVM CE vs C2
1. Более лучший инлайнинг (+10 — +150%)
• Java Streams
• BigData (Apache Spark)
2. Автоматическая векторизация SIMD
3. Вынос условий из циклов
4. Дублирование/инлайнинг на merge points
5. cmov вместо бранча, если предикшен плох
GraalVM EE vs CE
Интерпретатор байткода
Client Compiler
Оптимизированный машинный код
Server Compiler
Сильно Оптимизированный Машинный Код
Интерпретатор байткода
Client Compiler
Оптимизированный машинный код
Graal
Сильно Оптимизированный Машинный Код
Деоптимизация
Интерпретатор байткода
Client Compiler
Оптимизированный машинный код
Server Compiler
Сильно Оптимизированный Машинный Код
Деоптимизация
Graal
Машинный код
JEP 243: Java-Level JVM Compiler Interface
http://openjdk.java.net/jeps/243
JEP 317: Experimental Java-Based JIT Compiler
http://openjdk.java.net/jeps/317
public interface JVMCICompiler {
int INVOCATION_ENTRY_BCI = -1;
/**
* Services a compilation request. This object should compile the method
to machine code and
* install it in the code cache if the compilation is successful.
*/
CompilationRequestResult compileMethod(CompilationRequest request);
}
public class CompilationRequest {
private final ResolvedJavaMethod method;
/**
* Gets the method to be compiled.
*/
public ResolvedJavaMethod getMethod() {
return method;
}
}
public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersProvider, AnnotatedElement {
byte[] getCode();
int getCodeSize();
ResolvedJavaType getDeclaringClass();
int getMaxLocals();
int getMaxStackSize();
default boolean isFinal();
boolean isSynthetic();
boolean isVarArgs();
boolean isBridge();
boolean isDefault();
boolean isClassInitializer();
boolean isConstructor();
boolean canBeStaticallyBound();
ExceptionHandler[] getExceptionHandlers();
StackTraceElement asStackTraceElement(int bci);
default ProfilingInfo getProfilingInfo()
src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java
/**
* Installs the result of a compilation into the code cache.
*
* @param target the target where this code should be installed
* @param compiledCode the result of a compilation
* @param code the details of the installed CodeBlob are written to this object
* @return the outcome of the installation which will be one of
native int installCode(TargetDescription target,
HotSpotCompiledCode compiledCode,
InstalledCode code,
HotSpotSpeculationLog speculationLog);
final class CompilerToVM {
Context-sensitive trace inlining for Java
• Одна из самых старых оптимизаций (исследование)
• Позволяет понять, какие оптимизации можно делать
• Сейчас не используется
(мешает высоко полиморфный код)
https://www.sciencedirect.com/science/article/pii/S1477842413000146
Control Flow Graph Возможные трейсы
Стек Хранилище
Стек Хранилище
Стек Хранилище
Стек Хранилище
Стек Хранилище
Стек Хранилище
настоящий указатель
Стек Хранилище
Стек Хранилище
0
Стек Хранилище
1
Стек Хранилище
-1
Стек Хранилище
Стек Хранилище
Стек Хранилище
Стек Хранилище
Стек Хранилище
Control Flow Graph Трейсы
Оптимизация и деоптимизация
Граф метода Граф цикла Инлайнинг
Циклические трейсы
public int ArrayList.indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
public class LineBuilder {
private final Appendable buffer;
public LineBuilder(Appendable buffer) {
this.buffer = buffer;
}
public void appendLine(CharSequence sequence)
throws Exception {
buffer.append(sequence);
buffer.append("n");
}
}
Возможные пути
Как надо инлайнить
АГР ЕССИВ Н ЫЙ ИН ЛАЙН ИН Г В ИР ТУА ЛЬН ЫХ
В ЫЗОВ ОВ
Возможные пути
Как надо инлайнить
АГР ЕССИВ Н ЫЙ ИН ЛАЙН ИН Г В ИР ТУА ЛЬН ЫХ
В ЫЗОВ ОВ
Было
АГР ЕССИВ Н ЫЙ ИН ЛАЙН ИН Г ПОЛИМОРФН ЫХ
В ЫЗОВ ОВ
Было Стало
switch
АГР ЕССИВ Н ЫЙ ИН ЛАЙН ИН Г ПОЛИМОРФН ЫХ
В ЫЗОВ ОВ
public int ArrayList.indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
УДА ЛЕН ИЕ Р Е ДКИХ ПУ ТЕЙ
УДА ЛЕН ИЕ Р Е ДКИХ ПУ ТЕЙ
УДА ЛЕН ИЕ Р Е ДКИХ ПУ ТЕЙ
Другие языки?
Optimizing compiler
Interpreter
function add(a, b) {
return a + b;
}
ВАРИАНТЫ
1.Сложение чисел (int, double)
2.Сложение строк
3.Приведение типов
abstract class Node {
// Запускаем операцию, возвращаем результат
public abstract Object execute(Frame f);
// Родительский узел в AST
private Node parent;
// Заменить этот узел другим
protected void replace(Node newNode);
}
abstract class Node {
public abstract Object execute(Frame f);
public abstract int executeInt(Frame f)
throws UnexpectedResultException;
public abstract double executeDouble(Frame f)
throws UnexpectedResultException;
}
СПЕЦИАЛИЗИРОВАННЫЕ УЗЛЫ
1.IntegerAddNode
2.DoubleAddNode
3.StringAddNode
4.GenericAddNode
TYPE DECISION TREE
class IntegerAddNode extends BinaryNode {
public Object execute(Frame frame) {
Object a = left.execute(frame);
if (!(a instanceof Integer)) {
// Перезаписать ноду, запустить перезаписанное
// подав на вход уже вычисленное left
}
Object b = right.execute(frame);
if (!(b instanceof Integer)) {
// Перезаписать ноду, запустить перезаписанное
// подав на вход уже вычисленное right
}
// Здесь могла бы быть ваша реклама проверка на переполнение.
return (Integer) a + (Integer) b;
}
}
class IntegerAddNode extends BinaryNode {
public int executeInt(Frame frame)
throws UnexpectedResultException {
int a;
try {
a = left.executeInt(frame);
} catch (UnexpectedResultException ex) {
// Перезаписать ноду и запустить с left
}
int b;
try {
b = right.executeInt(frame);
} catch (UnexpectedResultException ex) {
// Перезаписать и запустить с left и right
}
// Здесь могла бы быть ваша реклама проверка на переполнение.
return a + b;
}
function foo(a, b, c, d) {
return add(a, b) + add(c, d);
}
function add(a, b) {
return a + b;
}
foo(1, 2, "Маша", "Петя");
Int + int
String + StringString + String
String + StringString + String
int Str
int + Stringint Str
int + Stringint Str
function foo(a, b, c, d) {
var x; var i;
for (i = 0; i < n; i++) {
x += add (a, b);
}
var y; var i2;
for (i2 = 0; i2 < n; i2++) {
y += add (a, b);
}
return x + y;
}
HOT
HOT
Ускорение x2
Truffle
NodeInfo(shortName = "||")
public final class SLLogicalOrNode extends SLShortCircuitNode {
public SLLogicalOrNode(SLExpressionNode left, SLExpressionNode right) {
super(left, right);
}
@Override
protected boolean isEvaluateRight(boolean left) {
return !left;
}
@Override
protected boolean execute(boolean left, boolean right) {
return left || right;
}
}
https://github.com/graalvm/simplelanguage
Операционная система
GraalVM
Truffle
Реализация языка
Программа на языке
Эксперт по осям
Эксперт по VM
Разработчик языка
Обычный программист
С/С++
Java/C++
Java
Java
?
Graal.JS - high-performance JavaScript on the JVM by Christian Wirth
Основные проблемы
• Использование наиболее подходящего языка
(можно смешивать произвольные языки)
• Миграция между языками, поддержка легаси
(взять две существующие кодовые базы и развивать их параллельно)
(без написания костыльных переходников и врапперов)
• Избежать потерь при пересечении границы языка
Доступные языки в GraalVM
• Java
• JavaScript
• Ruby
• R
Доступные языки вообще
• С, C++, Fortran (Sulong – LLVM bitcode)
• Python (ZipPy)
• Можно написать свой
https://gist.github.com/smarr/d1f8f2101b5cc8e14e12
One VM to Rule Them All by Thomas Wuerthinger
• Можем смешивать языки
• Можем написать свой собственный
Задача: интеграция JS фронта
• Легаси бэкенд на Java
«кровавый энтерпрайз»
• Новый фронт на JavaScript + ReactJS
• Как организовать интероп?
Зачем вставать два раза?
Один валидатор на сервере и клиенте
var validate = function(target) {
if (target > 0) {
console.log("success");
} else {
console.log("fail");
}
};
Валидатор (shared.js)
Цель
validate(1);
• Браузер
• Node.JS
• Java
Node.JS
var fs = require('fs');
var vm = require('vm');
var includeInThisContext = function(path) {
var code = fs.readFileSync(path);
vm.runInThisContext(code, path);
}.bind(this);
includeInThisContext(__dirname+"/shared.js");
validate(1);
Java
String code = "validate(1);";
String shared = readFile(SHARED_JS) + "nn";
String poly = readFile(NASHORN_POLYFILL_JS) + "nn";
String codeAsFunction = String.format("function() { %s return true; }", code);
String actualCode = poly + shared + codeAsFunction;
System.out.println(actualCode);
Context context = Context.create();
Value function = context.eval("js", actualCode);
function.execute().asBoolean();
import org.graalvm.polyglot.*; //Nashorn тоже будет работать
polyfill.js (Nashorn, Graal)
var global = this;
var window = this;
var process = {env:{}};
var console = {};
console.debug = print;
console.log = print;
console.warn = print;
console.error = print;
Зачем вставать два раза?
ЕСЛИ МОЖНО НЕ ВСТАВАТЬ ВООБЩЕ
Для генерации фронта
всё еще нужна Java
Зачем нужна Java для генерации фронта?
• Генерация стабов и прокси-классов для общения по HTTP
• Состав поставки приложения (набор фич)
• Статическая генерация по Java-источникам (Hibernate)
• Перенос данных об окружении (номер версии из Maven)
• Причины возникают по ходу дела
Способы решения
• Сложные пайплайны с Maven и Gradle
• Общие properties-файлы
Способы решения
• Сложные пайплайны с Maven и Gradle
• Общие properties-файлы
• Вызвать Java из JavaScript!
export LABSJDK=/Users/olegchir/opt/graalvm-0.33/Contents/Home
export LABSJRE=/Users/olegchir/opt/graalvm-0.33/Contents/Home/jre
export JAVA_HOME=$LABSJDK
export JRE_HOME=$LABSJRE
export JDK_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
http://www.oracle.com/technetwork/oracle-labs/program-languages/downloads/index.html
Загружаем GraalVM:
Устанавливаем переменные окружения:
Эксперимент: React, Npm, Babel, Webpack
Эксперимент: React, Npm, Babel, Webpack
src/client/app/index.jsx
import React from 'react';
import {render} from 'react-dom';
import JEEConfComponent from ‘./JEEConfComponent.jsx';
class App extends React.Component {
render () {
return (
<div>
<p>Привет, JEEConf!</p>
<JEEConfComponent />
</div>
);
}
}
render(<App/>, document.getElementById('app'));
src/client/app/JEEConfComponent.jsx
render() {
return (
<div>
Количество дичи уже сказано : <span>{this.state.dich}</span>
<div><button onClick={this.onDich}>{this.state.button}</button></div>
</div>
);
}
}
export default JEEConfComponent;
import React from 'react';
class JEEConfComponent extends React.Component {
constructor(props) {
super(props);
this.state = {dich : 0, button: buttonCaption};
this.onDich = this.onDich.bind(this);
}
onDich () {
let newDich = this.state.dich + 1;
this.setState({dich: newDich, button: buttonCaption});
}
src/client/app/JEEConfComponent.jsx
loaders/preload.js
module.exports = function main(source) {
this.cacheable();
var MyString = Java.type("java.lang.String");
var buttonCaption = new MyString("Сказать ещё дичи!");
return `window.buttonCaption="${buttonCaption}";` + `${source}`;
};
И обычная JS рутина…
Каркас проекта
npm init
npm i webpack webpack-cli webpack-dev-server –S
npm i babel-core babel-loader
babel-preset-es2015 babel-preset-react –S
npm i react react-dom -S
mkdir -p src/client/app
mkdir -p src/client/public
mkdir -p loaders
var p = require('path');
var webpack = require('webpack');
var BUILD_DIR = p.resolve(__dirname, 'src/client/public');
var APP_DIR = p.resolve(__dirname, 'src/client/app');
let defaults = {
output: { path: BUILD_DIR, filename: 'bundle.js' },
entry: APP_DIR + '/index.jsx',
module : { rules : [ { test : /.jsx?/, include : APP_DIR, loader : 'babel-loader' } ] },
resolveLoader: { modules: ['node_modules', p.resolve(__dirname, 'loaders')] }
};
module.exports = function (content) {
let dd = defaults;
defaults.module.rules.push({ test : /index.jsx/, loader: "preload", options: {} });
return dd;
};
webpack.config.js
src/client/index.html
<html>
<head>
<meta charset="utf-8">
<title>Hello JEEConf!</title>
</head>
<body>
<div id="app" />
<script src="public/bundle.js" type="text/javascript"></script>
</body>
</html>
{
"presets" : ["es2015", "react"]
}
./.babelrc
node --jvm node_modules/.bin/webpack -d
Кому это нужно?
(Сбертех и эпический квест по переходу на React)
Запуск нативных приложений
http://people.csail.mit.edu/smcc/projects/single-file-programs/
Скорость запуска
• Контейнеры (Docker, LXD, Vagrant-LXC, …)
• Консольные утилиты и GUI
• Пульт управления, использующий готовый код
AOT & CDS
public class HelloJEEConf {
public static void main(String... args) {
System.out.println("Hello JEEConf!");
}
}
129 msec
Java 8: Class Data Sharing
1.-Xshare:dump
2.-Xshare:on
1225 классов
66 msec
66 msec (CDS) < 100 msec (база)
Всегда дает прирост, можно включать по умолчанию
Graal AOT!
java -XX:+UnlockDiagnosticVMOptions 
-XX:+LogTouchedMethods 
-XX:+PrintTouchedMethodsAtExit 
HelloJEEConf > methods
Java 9+
баг в трекере обсуждение
Hello JEEConf!
# Method::print_touched_methods version 1
java/lang/String.indexOf:(Ljava/lang/String;I)I
java/lang/String.getBytes:([BIB)V
java/io/FilePermission.<clinit>:()V
1708 строк
java/lang/String.indexOf:(Ljava/lang/String;I)I
compileOnly java.lang.String.indexOf(Ljava/lang/String;I)I
public class Convert {
public static void main(String args[])
throws Throwable {
int i; boolean inParams = false;
while ((i = System.in.read()) >= 0) {
switch (i) {
case ':': continue; // skip
case '/': if (!inParams) { i = '.'; } break;
case '(': inParams = true; break;
case 'n':
case 'r': inParams = false; break;
}
System.out.write(i);
}
}
}
@mjg123
Matthew Gilliard
jdk/internal/module/SystemModules.hashes
jdk/internal/module/SystemModules.descriptors
grep -v 'Hello JEEConf! ' methods | 
grep -v '^#' | 
grep -v jdk/internal/module/SystemModules.hashes | 
grep -v jdk/internal/module/SystemModules.descriptors | 
sed -e 's/^/compileOnly /' |  java Convert > touched.aotcfg
jaotc --output methods.so 
--compile-commands touched.aotcfg 
--module java.base 
--class-name HelloJEEConf.class 
--info
sudo perf stat -e cpu-clock –r20 
java -XX:AOTLibrary=./methods.so 
HelloJEEConf
76 msec
AOT + CDS?
66 (CDS) < 76 (AOT) < 129 (база)
AOT не всегда дает прирост, нужно включать с умом
Что почитать по теме?
Matthew Gilliard
Fast JVM startup with JDK 9
Java in a World of Containers
Better Containerized JVMs in JDK10
Substrate VM
1 msec
1 <<< 61 (CDS) < 71 (AOT) < 100 (база)
Metropolis: city of tomorrow
http://openjdk.java.net/projects/metropolis/
http://cr.openjdk.java.net/~jrose/metropolis/Metropolis-Proposal.html
-XX:+UnlockExperimentalVMOptions
-XX:+UseJVMCICompiler
-XX:+EnableJVMCI
-Djvmci.Compiler=graal
ВСЁ ЧТО НУЖНО СДЕЛАТЬ
JDK 11 - не всё адаптировано
JDK 8 - устарел
mx igv
Error occurred during initialization of boot layer
java.lang.module.FindException: Module java.xml.bind not found
JDK 8 
http://2017.jokerconf.com/2017/talks/ghdvtsu3y60qai68waayi/
https://github.com/oracle/graal/blob/master/docs/Publications.md
YouTube по запросу GraalVM
https://gitter.im/graalvm/graal-core
Graal, Truffle, SubstrateVM and other perks: what are those and why do you need them
Graal, Truffle, SubstrateVM and other perks: what are those and why do you need them

Contenu connexe

Tendances

Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
Кирилл Толкачёв
 
Мастер класс- Maven + Jenkins
Мастер класс- Maven + JenkinsМастер класс- Maven + Jenkins
Мастер класс- Maven + Jenkins
Valentin Fedoskin
 
Иван Крутов - Автоматизация сборки Java-проекта
Иван Крутов - Автоматизация сборки Java-проектаИван Крутов - Автоматизация сборки Java-проекта
Иван Крутов - Автоматизация сборки Java-проекта
Yandex
 
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehave
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehaveЭволюция к Behavior Driven Development на примере популярного фреймворка JBehave
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehave
Return on Intelligence
 

Tendances (20)

What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
Мастер класс- Maven + Jenkins
Мастер класс- Maven + JenkinsМастер класс- Maven + Jenkins
Мастер класс- Maven + Jenkins
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 
BDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehaveBDD girls Battle: Cucumber VS. JBehave
BDD girls Battle: Cucumber VS. JBehave
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Разбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryErrorРазбор сложных случаев OutOfMemoryError
Разбор сложных случаев OutOfMemoryError
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
Иван Крутов - Автоматизация сборки Java-проекта
Иван Крутов - Автоматизация сборки Java-проектаИван Крутов - Автоматизация сборки Java-проекта
Иван Крутов - Автоматизация сборки Java-проекта
 
Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
 
Rethinking low-code
Rethinking low-codeRethinking low-code
Rethinking low-code
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehave
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehaveЭволюция к Behavior Driven Development на примере популярного фреймворка JBehave
Эволюция к Behavior Driven Development на примере популярного фреймворка JBehave
 
Автоматизация тестирования многопоточности
Автоматизация тестирования многопоточностиАвтоматизация тестирования многопоточности
Автоматизация тестирования многопоточности
 
Основы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрованияОсновы и нюансы параллельного тестрования
Основы и нюансы параллельного тестрования
 

Similaire à Graal, Truffle, SubstrateVM and other perks: what are those and why do you need them

CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехникиCodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest
 
[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF
Aleksey Shipilev
 

Similaire à Graal, Truffle, SubstrateVM and other perks: what are those and why do you need them (20)

Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
 
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
Разработка портируемой инфраструктуры New Relic — контейнеры, CoreOS и прочие...
 
Vladimir Trandafilov - When you need your system of cross browser testing
Vladimir Trandafilov - When you need your system of cross browser testingVladimir Trandafilov - When you need your system of cross browser testing
Vladimir Trandafilov - When you need your system of cross browser testing
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кода
 
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехникиCodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
 
Миграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудствоМиграция JIRA - безобразие или безрассудство
Миграция JIRA - безобразие или безрассудство
 
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
AzovDevMeetup 2016 | Выстраивание процесса и применение Best Practices с нуля...
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspb
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azure
 
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
Oracle. Моторин Иларион. "Современные и перспективные системы на базе процесс...
 
Трудовые будни инженера производительности
Трудовые будни инженера производительностиТрудовые будни инженера производительности
Трудовые будни инженера производительности
 
[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 

Graal, Truffle, SubstrateVM and other perks: what are those and why do you need them