<!--
{
  "availability" : [
    "iOS: 7.0.0 -",
    "iPadOS: 7.0.0 -",
    "macCatalyst: 13.1.0 -",
    "macOS: 10.9.0 -",
    "tvOS: 9.0.0 -",
    "visionOS: 1.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "JavaScriptCore",
  "identifier" : "/documentation/JavaScriptCore/JSVirtualMachine",
  "metadataVersion" : "0.1.0",
  "role" : "Class",
  "symbol" : {
    "kind" : "Class",
    "modules" : [
      "JavaScriptCore"
    ],
    "preciseIdentifier" : "c:objc(cs)JSVirtualMachine"
  },
  "title" : "JSVirtualMachine"
}
-->

# JSVirtualMachine

A self-contained environment for JavaScript execution.

```
class JSVirtualMachine
```

## Overview

You use this class for two main purposes: to support concurrent JavaScript execution, and to manage memory for objects that bridge between JavaScript and Objective-C or Swift.

### Support Threading and Concurrent JavaScript Execution

Each JavaScript context (a [`JSContext`](/documentation/JavaScriptCore/JSContext) object) belongs to a virtual machine. Each virtual machine can encompass multiple contexts, allowing values ([`JSValue`](/documentation/JavaScriptCore/JSValue) objects) to pass between contexts. However, each virtual machine is distinct—you can’t pass a value that you create in one virtual machine to a context in another virtual machine.

The JavaScriptCore API is thread-safe—for example, you can create [`JSValue`](/documentation/JavaScriptCore/JSValue) objects or evaluate scripts from any thread—however, all other threads attempting to use the same virtual machine must wait. To run JavaScript concurrently on multiple threads, use a separate [`JSVirtualMachine`](/documentation/JavaScriptCore/JSVirtualMachine) instance for each thread.

### Manage Memory for Exported Objects

When you export an Objective-C or Swift object to JavaScript, you must not to store JavaScript values in that object. This action creates a retain cycle—[`JSValue`](/documentation/JavaScriptCore/JSValue) objects hold strong references to their enclosing JavaScript contexts, and [`JSContext`](/documentation/JavaScriptCore/JSContext) objects hold strong references to the native objects you export to JavaScript. Instead, use the [`JSManagedValue`](/documentation/JavaScriptCore/JSManagedValue) class to conditionally retain a JavaScript value, and report the native ownership chain for that managed value to the JavaScriptCore virtual machine. Use the [`addManagedReference(_:withOwner:)`](/documentation/JavaScriptCore/JSVirtualMachine/addManagedReference(_:withOwner:)) and [`removeManagedReference(_:withOwner:)`](/documentation/JavaScriptCore/JSVirtualMachine/removeManagedReference(_:withOwner:)) methods to describe your native object graph to JavaScriptCore. After you remove the last managed reference for an object, the JavaScript garbage collector can safely destroy that object.

## Topics

### Creating a JavaScript Virtual Machine

[`init()`](/documentation/JavaScriptCore/JSVirtualMachine/init())

Initializes a JavaScript virtual machine.

### Managing Memory for Bridged Values

[`addManagedReference(_:withOwner:)`](/documentation/JavaScriptCore/JSVirtualMachine/addManagedReference(_:withOwner:))

Notifies the JavaScriptCore virtual machine of an external object relationship.

[`removeManagedReference(_:withOwner:)`](/documentation/JavaScriptCore/JSVirtualMachine/removeManagedReference(_:withOwner:))

Notifies the JavaScriptCore virtual machine that a previously registered object relationship no longer exists.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)