Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Интеграция виртуальных машин

Содержание

Руковожу командой разработки (Java)> 5 лет пилю Java энтерпрайз(но слежу за развитием платформы .NET)
Интеграция виртуальных машин .NET и Java.NET meetupМария ТелятниковаГригорий КошелевЕкатеринбург, 28 февраля 2017 Руковожу командой разработки (Java)> 5 лет пилю Java энтерпрайз(но слежу за развитием платформы .NET) .NETXMLXMLXMLXMLXML .NETXMLXMLXMLXMLPDF Apache FOP Начало разработки – неизвестноПередана в ASF в 1999 годуApache FOP 1.0 – Переписать всё на C#Использовать кросс-компиляциюИспользовать из Java(*) IKVM* Переписать всё на C#Использовать кросс-компиляциюИспользовать из Java HTTP RESTProtobufgRPC Библиотека для удалённого вызова процедурПоддерживаются: C/C++, Node.js, Python, Ruby, Objective-C, PHP, C# Protobuf 3 – описание типов данных и сериализацияHTTP/2 в качестве транспортаКодогенерация плагином для Protobuf C# КЛИЕНТJVMJava серверprotobufprotobufGRPC .NET процессC# КЛИЕНТJVMJava серверprotobufprotobufGRPC JavaVM *jvm; JNIEnv *env;JavaVMInitArgs args;JavaVMOption* options = new JavaVMOption[1];options[0].optionString = params;args.nOptions = package ru.kontur;public class Program {  public static int doSmth(int x, String JavaVmWrapper vm;JniEnvWrapper env;unsafe {  IntPtr envP; IntPtr vmP;  CreateJavaVm(&vmP, &envP, Intel Core i7-4771, 3.5 ГГц16 ГБ ОЗУWindows 7 Professional x64Java 8 (1.8.0_121).NET 4.5 10000 XML-документов (~ 1.53 ГБ)1000 * 5 – на разогрев9000 – на .NET процесс.NET процессStandalone Java59 468 ± 533 мсJava60 496 ± 716 мс Как запуститьЧто нужно знать [DllImport( System.Runtime.InteropServicesПредоставляет методы для работы с неуправляемой памятью и кодом protected T GetDelegate(string procName) where T : class{  return Marshal.GetDelegateForFunctionPointer( struct JNINativeInterface {  /* ... */  jint (JNICALL *GetVersion)(JNIEnv *env); [StructLayout(LayoutKind.Explicit)]public struct JValue{  [FieldOffset(0)] private bool booleanValue;  [FieldOffset(0)] private byte jclass (JNICALL *FindClass) (JNIEnv *env, const char *name);delegate IntPtr FindClass ( Ручное управление объектами, размещёнными в нативной памятиОборачиваем в IDisposable-обёртки public void InjectClass(string className, byte[] classBytes){  var loaderClass = new JavaClassLoaderClass(env); Запустили виртуальную машину Java внутри .NET процесса Реализовали обмен данными между программами Загружать Java-библиотеки разных версийПопробовать передачу данных через нативную память напрямуюПроанализировать поведение виртуальных Посмотрели на Performance Counter сборки мусора по поколениям (разница между значением счётчика Почему так – будем думать и разбираться Мария ТелятниковаГригорий КошелевВопросы? Apache FOP https://xmlgraphics.apache.org/fop/IKVM https://www.ikvm.net/Protobuf https://developers.google.com/protocol-buffers/gRPC http://www.grpc.io/JNI http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.htmlInterop Marshalling https://msdn.microsoft.com/ru-ru/library/eaw10et3(v=vs.110).aspxMarshal https://msdn.microsoft.com/ru-ru/library/system.runtime.interopservices.marshal(v=vs.110).aspx
Слайды презентации

Слайд 2 Руковожу командой разработки (Java)
> 5 лет пилю Java

Руковожу командой разработки (Java)> 5 лет пилю Java энтерпрайз(но слежу за развитием платформы .NET)

энтерпрайз
(но слежу за развитием платформы .NET)


Слайд 3 .NET
XML
XML
XML
XML
XML

.NETXMLXMLXMLXMLXML

Слайд 4 .NET
XML
XML
XML
XML
PDF

.NETXMLXMLXMLXMLPDF

Слайд 5 Apache FOP

Apache FOP

Слайд 6 Начало разработки – неизвестно
Передана в ASF в 1999

Начало разработки – неизвестноПередана в ASF в 1999 годуApache FOP 1.0

году
Apache FOP 1.0 – 21.07.2010
Apache FOP 1.1 – 20.10.2012
Apache

FOP 2.0 – 03.06.2015
Apache FOP 2.1 – 14.01.2016

Слайд 7 Переписать всё на C#
Использовать кросс-компиляцию
Использовать из Java
(*) IKVM
*

Переписать всё на C#Использовать кросс-компиляциюИспользовать из Java(*) IKVM*

Слайд 8 Переписать всё на C#
Использовать кросс-компиляцию
Использовать из Java

Переписать всё на C#Использовать кросс-компиляциюИспользовать из Java

Слайд 9 HTTP REST
Protobuf
gRPC

HTTP RESTProtobufgRPC

Слайд 10 Библиотека для удалённого вызова процедур
Поддерживаются: C/C++, Node.js, Python,

Библиотека для удалённого вызова процедурПоддерживаются: C/C++, Node.js, Python, Ruby, Objective-C, PHP,

Ruby, Objective-C, PHP, C# и Java

Первый публичный релиз –

26.02.2015
gRPC 1.0.0 – 19.08.2016
gRPC 1.1.2 – 08.02.2017

Слайд 11 Protobuf 3 – описание типов данных и сериализация
HTTP/2

Protobuf 3 – описание типов данных и сериализацияHTTP/2 в качестве транспортаКодогенерация плагином для Protobuf

в качестве транспорта
Кодогенерация плагином для Protobuf


Слайд 12 C# КЛИЕНТ
JVM
Java сервер
protobuf
protobuf
GRPC

C# КЛИЕНТJVMJava серверprotobufprotobufGRPC

Слайд 13 .NET процесс
C# КЛИЕНТ
JVM
Java сервер
protobuf
protobuf
GRPC

.NET процессC# КЛИЕНТJVMJava серверprotobufprotobufGRPC

Слайд 14 JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs args;
JavaVMOption* options = new

JavaVM *jvm; JNIEnv *env;JavaVMInitArgs args;JavaVMOption* options = new JavaVMOption[1];options[0].optionString = params;args.nOptions

JavaVMOption[1];
options[0].optionString = params;
args.nOptions = 1;
args.options = options;
args.version = JNI_VERSION_1_6;
args.ignoreUnrecognized

= 0;
int result = JNI_CreateJavaVM(&jvm, (void**)&env, &args);

Слайд 15 package ru.kontur;
public class Program {
public static

int doSmth(int x, String str) {

return 0;
}
}

jclass programClass = env->FindClass("ru/kontur/Program");
jmethodID doSmthMethod = env->GetStaticMethodID(programClass, "doSmth", "(ILjava/lang/String;)I");
jint intParam = …;
jstring stringParam = …;
jint result = env->CallStaticIntMethod(programClass, doSmthMethod, intParam, stringParam);


Слайд 17 JavaVmWrapper vm;
JniEnvWrapper env;
unsafe {
IntPtr envP; IntPtr

JavaVmWrapper vm;JniEnvWrapper env;unsafe { IntPtr envP; IntPtr vmP; CreateJavaVm(&vmP, &envP, vmArgsP);

vmP;
CreateJavaVm(&vmP, &envP, vmArgsP);
vm = new

JavaVmWrapper(vmP);
env = new JniEnvWrapper(envP);
}
var classPtr = env.FindClass("ru/kontur/fop/service/FopServiceServer");
var constructor = env.GetMethodId(classPtr, "", "(I)V");
var runMethod = env.GetMethodId(classPtr, "run", "()V");
var obj = env.NewObject(ClassPtr, constructor, port);
env.CallObjectMethod(obj, runMethod);

Слайд 18 Intel Core i7-4771, 3.5 ГГц
16 ГБ ОЗУ
Windows 7

Intel Core i7-4771, 3.5 ГГц16 ГБ ОЗУWindows 7 Professional x64Java 8 (1.8.0_121).NET 4.5

Professional x64
Java 8 (1.8.0_121)
.NET 4.5


Слайд 19 10000 XML-документов (~ 1.53 ГБ)
1000 * 5 –

10000 XML-документов (~ 1.53 ГБ)1000 * 5 – на разогрев9000 –

на разогрев
9000 – на замеряемый прогон

-Xmx512m -Xms512m -Xss1m -XX:-TieredCompilation


Слайд 20 .NET процесс
.NET процесс
Standalone Java
59 468 ± 533 мс
Java
60

.NET процесс.NET процессStandalone Java59 468 ± 533 мсJava60 496 ± 716 мс

496 ± 716 мс


Слайд 21 Как запустить
Что нужно знать

Как запуститьЧто нужно знать

Слайд 22 [DllImport("kernel32.dll", EntryPoint = "LoadLibraryW")]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPWStr)]

[DllImport(

string name);
[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
private static extern bool

FreeLibrary(IntPtr hModule);

[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
private static extern IntPtr GetProcAddress(IntPtr hModule,
[MarshalAs(UnmanagedType.LPStr)] string name);


Слайд 23 System.Runtime.InteropServices
Предоставляет методы для работы с неуправляемой памятью и

System.Runtime.InteropServicesПредоставляет методы для работы с неуправляемой памятью и кодом

кодом


Слайд 24 protected T GetDelegate(string procName) where T : class
{

protected T GetDelegate(string procName) where T : class{ return Marshal.GetDelegateForFunctionPointer(

return Marshal.GetDelegateForFunctionPointer(
GetProcAddress(hModule,

procName), typeof(T)) as T;
}

public unsafe void CreateJavaVm(IntPtr* vmP, IntPtr* envP, IntPtr vmArgsP)
{
var result = GetDelegate("JNI_CreateJavaVM")(vmP, envP, vmArgsP);
/* */
}

unsafe delegate int CreateJavaVm(IntPtr* pvm, IntPtr* penv, IntPtr args);


Слайд 25
struct JNINativeInterface {
/* ... */

struct JNINativeInterface { /* ... */ jint (JNICALL *GetVersion)(JNIEnv *env); jclass

jint (JNICALL *GetVersion)(JNIEnv *env);
jclass (JNICALL *DefineClass)

(JNIEnv *env,
const char *name,
jobject loader,
const jbyte *buf,
jsize len);
jclass (JNICALL *FindClass)
(JNIEnv *env, const char *name);
/* ... */
}

[StructLayout(LayoutKind.Sequential)]
public struct JniNativeInterface {
/* ... */
private readonly IntPtr GetVersion;
private readonly IntPtr DefineClass;





private readonly IntPtr FindClass;

/* ... */
}

JniNativeInterface obj =
(JniNativeInterface)Marshal.PtrToStructure(
structPtr,
typeof(JniNativeInterface));


Слайд 26 [StructLayout(LayoutKind.Explicit)]
public struct JValue
{
[FieldOffset(0)] private bool booleanValue;

[StructLayout(LayoutKind.Explicit)]public struct JValue{ [FieldOffset(0)] private bool booleanValue; [FieldOffset(0)] private byte byteValue;

[FieldOffset(0)] private byte byteValue;
[FieldOffset(0)] private char

charValue;
[FieldOffset(0)] private short shortValue;
[FieldOffset(0)] private int integerValue;
[FieldOffset(0)] private long longValue;
[FieldOffset(0)] private float floatValue;
[FieldOffset(0)] private double doubleValue;
[FieldOffset(0)] private IntPtr pointerVlaue;
}


typedef union jvalue {

jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;


Слайд 27 jclass (JNICALL *FindClass) (JNIEnv *env, const char *name);
delegate

jclass (JNICALL *FindClass) (JNIEnv *env, const char *name);delegate IntPtr FindClass (

IntPtr FindClass (
IntPtr env,
[MarshalAs(UnmanagedType.LPTStr)] string

str);

delegate IntPtr FindClass (
IntPtr env,
[MarshalAs(UnmanagedType.LPArray)] byte[] utf);

Латинская буква «s» (0x73)
Кириллическая буква «К» (0xD0 0x9A)
Символ года на тамильском «௵» (0xE0 0xAF 0xB5)
Китайский иероглиф «?» (0xF0 0xA6 0x88 0x98)

Encoding.UTF8.GetBytes(str);

U+0073
U+041A
U+0BF5
U+26218


Слайд 28 Ручное управление объектами, размещёнными в нативной памяти
Оборачиваем в

Ручное управление объектами, размещёнными в нативной памятиОборачиваем в IDisposable-обёртки

IDisposable-обёртки


Слайд 29 public void InjectClass(string className, byte[] classBytes)
{
var

public void InjectClass(string className, byte[] classBytes){ var loaderClass = new JavaClassLoaderClass(env);

loaderClass = new JavaClassLoaderClass(env);
var loader = loaderClass.GetSystemClassLoader();

var loadedClass = env.DefineClass(
className,
loader,
classBytes,
classBytes.Length);
loadedClass.Dispose();
}

Слайд 30 Запустили виртуальную машину Java внутри .NET процесса
Реализовали

Запустили виртуальную машину Java внутри .NET процесса Реализовали обмен данными между

обмен данными между программами на Java и на C#
Получили

готовый работающий прототип решения задачи конвертации документов

Слайд 31 Загружать Java-библиотеки разных версий
Попробовать передачу данных через нативную

Загружать Java-библиотеки разных версийПопробовать передачу данных через нативную память напрямуюПроанализировать поведение

память напрямую
Проанализировать поведение виртуальных машин .NET и Java в

одном процессе
Понять, куда это богатство ещё применить
Сделать C#-обёртку удобнее

Слайд 32 Посмотрели на Performance Counter сборки мусора по поколениям

Посмотрели на Performance Counter сборки мусора по поколениям (разница между значением

(разница между значением счётчика после прогона и перед прогоном)


Слайд 33 Почему так – будем думать и разбираться

Почему так – будем думать и разбираться

Слайд 34 Мария Телятникова
Григорий Кошелев
Вопросы?

Мария ТелятниковаГригорий КошелевВопросы?

  • Имя файла: integratsiya-virtualnyh-mashin.pptx
  • Количество просмотров: 149
  • Количество скачиваний: 0