2017-02-01 7 views
0

Я хочу выполнить виртуальную машину Java и приложение C# в рамках одного процесса, что позволяет совместно использовать одну и ту же область памяти вместе с той же памятью для одних и тех же разделяемых библиотек.Выполнение Java и C# в рамках одного процесса?

Кто-нибудь знает, как это сделать?

Я мог бы запускать Java с C# или C# с Java или даже с помощью приложения C для запуска обоих процессов в рамках одного процесса.

[Update]

Проект http://jni4net.com/ утверждает, что обеспечивает возможность: «.. Intraprocess - это означает, что обе виртуальные машины находятся в одном процессе Любой вызов использует тот же поток и тот же стек для обеих средах Это относительно быстро»

Это именно то, что я пытаюсь сделать сам, чтобы использовать простой адрес памяти с кучей и использовать его как для внутрипроцессорных виртуальных машин.

+0

Можете вы pl. уточните, что является мотивацией для этого? – ravi

+1

Вы запрашиваете [IKVM.NET] (http://www.ikvm.net/)? – Andreas

+0

Не совсем. Я обновил вопрос, чтобы показать пример библиотеки, утверждающей, что сделал именно это (внутрипроцессные Java и C# VM, работающие в одном процессе). –

ответ

0

C# является .NET, который скомпилирован на язык посредника (IL), возможно, что Java имеет процессор для .NET IL, но он должен быть включен как часть проекта Java при его создании.

Вы не сможете запускать два отдельных процесса, которые имеют один и тот же поток выполнения и память.

+0

Я обновил вопрос, чтобы представить пример того, что я пытаюсь выполнить. –

0

Нижняя линия Я не думаю, что это хорошая идея.

В моем личном опыте все доступные в настоящее время проекты, которые утверждали, что поддерживают оба, имеют различные дефекты и проблемы с поддержкой в ​​библиотеках и даже некоторые языковые функции, а не даже упоминание о производительности во время исполнения. Если вы предпочитаете простое решение сокета или файлы с отображением памяти и объявляете их нестандартными и с ловушками, то я могу только сказать вам, что рамки, которые вы пытаетесь использовать, - это еще больше подводных камней.

Плюс, идея обмена памятью немного озадачивает меня. Какую точную часть данных вы пытаетесь поделиться? Имейте в виду, что структура памяти C# и Java не является взаимно совместимой, вы либо сохраняете некоторые вещи с помощью стороннего стандарта, например. аудио/видео/изображения и т. д .; или вам нужно написать свой собственный уровень сериализации, который по существу отключает вас от возможности работать на одном и том же объекте с обеих сторон. Если вы уже написали свой собственный уровень сериализации, что блокирует вас от использования решения сокета, которое лучше всего поддерживается с обеих сторон?

Если у вас есть проблемы с производительностью, я могу сказать, что, поскольку вы используете решение Java + C#, разница в производительности между MMF, сокетом или общей памятью незначителен по сравнению с любой производительностью, которую может достичь ваше приложение. Если ваше приложение действительно требует такой производительности, вам лучше сделать это на C++ или даже ANSI C.

Так что я полностью согласен со всеми комментариями, что материал, который вы пытаетесь достичь, кажется не в правильном направлении.

+0

Допустимо не согласиться, но если вы хотите сохранить синхронизацию памяти на 60 ГБ, это означало бы ее дублирование. Также то, что я делаю (я нашел решение), поддерживается напрямую Oracle, а также Mono. Нет щели, отверстия или чего-то еще. Снова файлы с отображением памяти имеют сложную проблему, что означает, что она может дублироваться в памяти, а способ ее синхронизации не определен, как в потенциально разных для каждой платформы. Нет гарантии своевременного заказа. –

+0

Во-первых, очень сложно поверить, что ваша программа одновременно работает на 60 ГБ данных по произвольному доступу. И у вас всегда есть вещи, такие как кросс-бокс, разделяемый в данных памяти, которые вы можете использовать, например. кэш когерентности, если вы вынуждены хранить все в памяти. Увидев ваше решение ниже с помощью «Моно», я могу только пожелать вам удачи. Поскольку я видел более дюжины вещей, которые утверждают, что они могут сделать это так или иначе, но все заканчивается безнадежно багги. Удачи чувак. –

+0

Я работаю в секторе предприятий в качестве подрядчика. Когда я говорю, что мне это нужно, мне нужно это. 60GB, кстати, ничто сегодня (мы добавляем 512 ГБ оперативной памяти сегодня по умолчанию). Мне нужно это для запуска физического моделирования. Интеграция JVM или Mono в процессе - это требование, которое эти инструменты соответствуют 20/15 годам. Я просто никогда не делал этого сам. Мы инженеры, мы много тестируем на нескольких платформах. Для этого мы и живем. Мы работаем над наукой не на удачу :) –

0

Решение состоит в том, чтобы встроить Java и Mono в один и тот же процесс. Есть ресурсы, доступные для этого в приложении C/C++, но это не ограничивается C/C++.

Встраивая Java и Mono (C#) вместе в рамках одного процесса, можно гарантировать все желаемые свойства. В общей памяти нет дублирования, мгновенная манипуляция памятью и изменения отображаются в правильном порядке.

Нужно позаботиться о том, чтобы привязывать потоки в соответствии с областью памяти в нескольких настройках процессора, как всегда, но об этом.

Возможно использовать один и тот же процессор, привязывая потоки C# и Java к одному процессору и получать прибыль от кэшей второго уровня и даже третьего уровня.

Другим важным преимуществом является то, что оба виртуальных машины получают выгоду от совместного использования одного и того же экземпляра локальной общей библиотеки, в результате чего код запускается в любой из виртуальных машин, взаимодействующих с одним и тем же экземпляром библиотеки, вместо использования двух разных версий.

Полезная информация:

0

Есть способы провести у себя JVM в процессе .NET или HOST в .NET CLR в процессе Java, но они уродливы и требуют знакомства с JNI (Java Native Interface) и/или CLR на основе COM-хостинга API.

Есть, к счастью, средства взаимодействия, которые инкапсулируют эти механизмы и позволяют Java и .NET работать в одном процессе и свободно взаимодействовать. Одним из таких инструментов является JNBridgePro от JNBridge. Дополнительную информацию см. На веб-сайте www.jnbridge.com и, в частности, смотрите «разделяемая память».

Отказ от ответственности: Я с JNBridge.