  The popularity of the Java programming language has led to its wide adoption
in cloud computing infrastructures. However, Java applications running in
untrusted clouds are vulnerable to various forms of privileged attacks. The
emergence of trusted execution environments (TEEs) such as Intel SGX mitigates
this problem. TEEs protect code and data in secure enclaves inaccessible to
untrusted software, including the kernel and hypervisors. To efficiently use
TEEs, developers must manually partition their applications into trusted and
untrusted parts, in order to reduce the size of the trusted computing base
(TCB) and minimise the risks of security vulnerabilities. However, partitioning
applications poses two important challenges: (i) ensuring efficient object
communication between the partitioned components, and (ii) ensuring the
consistency of garbage collection between the parts, especially with
memory-managed languages such as Java. We present Montsalvat, a tool which
provides a practical and intuitive annotation-based partitioning approach for
Java applications destined for secure enclaves. Montsalvat provides an RMI-like
mechanism to ensure inter-object communication, as well as consistent garbage
collection across the partitioned components. We implement Montsalvat with
GraalVM native-image, a tool for compiling Java applications ahead-of-time into
standalone native executables that do not require a JVM at runtime. Our
extensive evaluation with micro- and macro-benchmarks shows our partitioning
approach to boost performance in real-world applications
