or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

advanced.mdcore-api.mddata-types.mddsl.mdindex.mdinstrumentation.mdinterop.md

advanced.mddocs/

0

# Advanced Features

1

2

Advanced Truffle capabilities for sophisticated language implementations, including library-based dispatch systems, static object layouts, runtime utilities, and performance optimization infrastructure.

3

4

## Capabilities

5

6

### Library Dispatch System

7

8

Framework for creating custom library-based dispatch systems with automatic caching and specialization.

9

10

```java { .api }

11

/**

12

* Base class for creating custom libraries

13

*/

14

public abstract class Library extends Node {

15

16

/**

17

* Check if library accepts receiver type

18

* @param receiver Object to check

19

* @return true if accepts

20

*/

21

public boolean accepts(Object receiver) {

22

return true;

23

}

24

25

/**

26

* Get library priority for receiver

27

* @param receiver Object to check

28

* @return Priority value (higher = preferred)

29

*/

30

public int getPriority() {

31

return 0;

32

}

33

}

34

35

/**

36

* Factory for creating library instances

37

* @param <T> Library type

38

*/

39

public abstract class LibraryFactory<T extends Library> {

40

41

/**

42

* Get factory for library class

43

* @param libraryClass Library class

44

* @return LibraryFactory instance

45

*/

46

public static <T extends Library> LibraryFactory<T> resolve(Class<T> libraryClass) {

47

return null; // Implementation details

48

}

49

50

/**

51

* Get uncached library instance

52

* @return Uncached library

53

*/

54

public abstract T getUncached();

55

56

/**

57

* Get uncached library for specific receiver

58

* @param receiver Target receiver

59

* @return Uncached library

60

*/

61

public abstract T getUncached(Object receiver);

62

63

/**

64

* Create cached library

65

* @param receiver Target receiver

66

* @return Cached library

67

*/

68

public abstract T create(Object receiver);

69

70

/**

71

* Create dispatched library

72

* @param limit Cache limit

73

* @return Dispatched library

74

*/

75

public abstract T createDispatched(int limit);

76

77

/**

78

* Get dispatch class

79

* @return Library dispatch class

80

*/

81

public abstract Class<?> getDispatchClass();

82

}

83

84

/**

85

* Annotation for generating library classes

86

*/

87

@Retention(RetentionPolicy.CLASS)

88

@Target(ElementType.TYPE)

89

public @interface GenerateLibrary {

90

91

/**

92

* Default export receiver type

93

* @return Receiver class

94

*/

95

Class<?> defaultExportLookupEnabled() default Object.class;

96

97

/**

98

* Whether to generate assert messages

99

* @return true to generate

100

*/

101

boolean assertions() default true;

102

103

/**

104

* Push encapsulating node to library calls

105

* @return true to push

106

*/

107

boolean pushEncapsulatingNode() default true;

108

}

109

110

/**

111

* Message representation for library operations

112

*/

113

public abstract class Message {

114

115

/**

116

* Get message name

117

* @return Simple message name

118

*/

119

public abstract String getSimpleName();

120

121

/**

122

* Get qualified message name

123

* @return Qualified message name

124

*/

125

public abstract String getQualifiedName();

126

127

/**

128

* Get library class

129

* @return Library class containing message

130

*/

131

public abstract Class<? extends Library> getLibraryClass();

132

}

133

134

/**

135

* Default export provider interface

136

*/

137

public interface DefaultExportProvider {

138

139

/**

140

* Get default export class

141

* @return Export class

142

*/

143

Class<?> getExportClass();

144

145

/**

146

* Get export priority

147

* @return Priority value

148

*/

149

int getPriority();

150

151

/**

152

* Create export instance

153

* @return Export instance

154

*/

155

Object createExport();

156

}

157

158

/**

159

* Eager export provider for immediate initialization

160

*/

161

public interface EagerExportProvider extends DefaultExportProvider {

162

163

/**

164

* Get eager export list

165

* @return List of export classes

166

*/

167

List<Class<?>> getEagerExports();

168

}

169

170

/**

171

* Library that provides reflection capabilities

172

*/

173

public abstract class ReflectionLibrary extends Library {

174

175

/**

176

* Get uncached reflection library

177

* @return Uncached library

178

*/

179

public static ReflectionLibrary getUncached() {

180

return null; // Implementation details

181

}

182

183

/**

184

* Send message to object

185

* @param receiver Target object

186

* @param message Message to send

187

* @param arguments Message arguments

188

* @return Message result

189

* @throws Exception if message fails

190

*/

191

public abstract Object send(Object receiver, Message message, Object... arguments) throws Exception;

192

193

/**

194

* Check if object has message

195

* @param receiver Target object

196

* @param message Message to check

197

* @return true if has message

198

*/

199

public abstract boolean accepts(Object receiver, Message message);

200

}

201

202

/**

203

* Library for dynamic dispatch based on receiver type

204

*/

205

public abstract class DynamicDispatchLibrary extends Library {

206

207

/**

208

* Get uncached dynamic dispatch library

209

* @return Uncached library

210

*/

211

public static DynamicDispatchLibrary getUncached() {

212

return null; // Implementation details

213

}

214

215

/**

216

* Dispatch call based on receiver type

217

* @param receiver Call receiver

218

* @param name Method name

219

* @param arguments Call arguments

220

* @return Call result

221

* @throws Exception if dispatch fails

222

*/

223

public abstract Object dispatch(Object receiver, String name, Object... arguments) throws Exception;

224

225

/**

226

* Get dispatch target class

227

* @param receiver Dispatch receiver

228

* @return Target class for dispatch

229

*/

230

public Class<?> dispatch(Object receiver) {

231

return receiver.getClass();

232

}

233

}

234

```

235

236

**Usage Example:**

237

238

```java

239

@GenerateLibrary

240

public abstract class MathLibrary extends Library {

241

242

/**

243

* Add two numbers

244

* @param receiver Left operand

245

* @param other Right operand

246

* @return Addition result

247

*/

248

public Object add(Object receiver, Object other) {

249

// Default implementation

250

throw new UnsupportedOperationException("add not supported");

251

}

252

253

/**

254

* Multiply two numbers

255

* @param receiver Left operand

256

* @param other Right operand

257

* @return Multiplication result

258

*/

259

public Object multiply(Object receiver, Object other) {

260

// Default implementation

261

throw new UnsupportedOperationException("multiply not supported");

262

}

263

}

264

265

@ExportLibrary(MathLibrary.class)

266

public class MyNumber implements TruffleObject {

267

private final double value;

268

269

public MyNumber(double value) {

270

this.value = value;

271

}

272

273

@ExportMessage

274

Object add(Object other) {

275

if (other instanceof MyNumber) {

276

return new MyNumber(this.value + ((MyNumber) other).value);

277

}

278

throw new UnsupportedOperationException();

279

}

280

281

@ExportMessage

282

Object multiply(Object other) {

283

if (other instanceof MyNumber) {

284

return new MyNumber(this.value * ((MyNumber) other).value);

285

}

286

throw new UnsupportedOperationException();

287

}

288

}

289

```

290

291

### Static Object System

292

293

High-performance object layouts with compile-time shape optimization.

294

295

```java { .api }

296

/**

297

* Static object shape defining compile-time layout

298

* @param <T> Object type

299

*/

300

public abstract class StaticShape<T> {

301

302

/**

303

* Get property by name

304

* @param propertyName Property name

305

* @return StaticProperty instance or null

306

*/

307

public abstract StaticProperty getProperty(Object propertyName);

308

309

/**

310

* Create new instance with this shape

311

* @return New object instance

312

*/

313

public abstract T newInstance();

314

315

/**

316

* Get language associated with shape

317

* @return TruffleLanguage instance

318

*/

319

public abstract TruffleLanguage<?> getLanguage();

320

321

/**

322

* Create shape builder

323

* @param language Target language

324

* @return Builder instance

325

*/

326

public static <T> Builder<T> newBuilder(TruffleLanguage<?> language) {

327

return null; // Implementation details

328

}

329

330

/**

331

* Builder for creating static shapes

332

* @param <T> Object type

333

*/

334

public static final class Builder<T> {

335

336

/**

337

* Add property to shape

338

* @param property Property to add

339

* @param type Property type

340

* @param isFinal Whether property is final

341

* @return Builder instance

342

*/

343

public Builder<T> property(StaticProperty property, Class<?> type, boolean isFinal) {

344

return this;

345

}

346

347

/**

348

* Add property with name and type

349

* @param name Property name

350

* @param type Property type

351

* @return Builder instance

352

*/

353

public Builder<T> property(String name, Class<?> type) {

354

return property(StaticProperty.create(name), type, false);

355

}

356

357

/**

358

* Add final property

359

* @param name Property name

360

* @param type Property type

361

* @return Builder instance

362

*/

363

public Builder<T> finalProperty(String name, Class<?> type) {

364

return property(StaticProperty.create(name), type, true);

365

}

366

367

/**

368

* Build static shape

369

* @return StaticShape instance

370

*/

371

public StaticShape<T> build() {

372

return null; // Implementation details

373

}

374

375

/**

376

* Build with factory

377

* @param factory Object factory

378

* @return StaticShape instance

379

*/

380

public StaticShape<T> build(Class<T> factory) {

381

return null; // Implementation details

382

}

383

}

384

}

385

386

/**

387

* Property descriptor for static objects

388

*/

389

public interface StaticProperty {

390

391

/**

392

* Create property with name

393

* @param name Property name

394

* @return StaticProperty instance

395

*/

396

static StaticProperty create(String name) {

397

return null; // Implementation details

398

}

399

400

/**

401

* Get property name

402

* @return Property name

403

*/

404

String getName();

405

406

/**

407

* Get property ID for access

408

* @return Property identifier

409

*/

410

String getId();

411

}

412

413

/**

414

* Shape generator for array-based storage

415

*/

416

public abstract class ArrayBasedShapeGenerator<T> extends ShapeGenerator<T> {

417

418

/**

419

* Create array-based generator

420

* @param language Target language

421

* @return Generator instance

422

*/

423

public static <T> ArrayBasedShapeGenerator<T> create(TruffleLanguage<?> language) {

424

return null; // Implementation details

425

}

426

}

427

428

/**

429

* Shape generator for field-based storage

430

*/

431

public abstract class FieldBasedShapeGenerator<T> extends ShapeGenerator<T> {

432

433

/**

434

* Create field-based generator

435

* @param language Target language

436

* @return Generator instance

437

*/

438

public static <T> FieldBasedShapeGenerator<T> create(TruffleLanguage<?> language) {

439

return null; // Implementation details

440

}

441

}

442

443

/**

444

* Base shape generator class

445

* @param <T> Object type

446

*/

447

public abstract class ShapeGenerator<T> {

448

449

/**

450

* Generate static shape

451

* @param properties Property definitions

452

* @return StaticShape instance

453

*/

454

public abstract StaticShape<T> generateShape(StaticProperty... properties);

455

456

/**

457

* Generate shape with factory

458

* @param factory Object factory class

459

* @param properties Property definitions

460

* @return StaticShape instance

461

*/

462

public abstract StaticShape<T> generateShape(Class<T> factory, StaticProperty... properties);

463

}

464

```

465

466

### Runtime Utilities

467

468

Essential runtime utilities for assumptions, context management, and optimization support.

469

470

```java { .api }

471

/**

472

* Assumed value with invalidation support

473

* @param <T> Value type

474

*/

475

public final class AssumedValue<T> {

476

477

/**

478

* Create assumed value

479

* @param name Assumption name

480

* @param initialValue Initial value

481

*/

482

public AssumedValue(String name, T initialValue) {

483

// Implementation details

484

}

485

486

/**

487

* Create assumed value with name

488

* @param name Assumption name

489

* @return AssumedValue instance

490

*/

491

public static <T> AssumedValue<T> create(String name) {

492

return new AssumedValue<>(name, null);

493

}

494

495

/**

496

* Get current value (optimized)

497

* @return Current value

498

*/

499

public T get() {

500

return null; // Implementation details

501

}

502

503

/**

504

* Get current value with assumption check

505

* @param assumption Assumption to validate

506

* @return Current value

507

*/

508

public T get(Assumption assumption) {

509

return null; // Implementation details

510

}

511

512

/**

513

* Set new value (invalidates assumption)

514

* @param newValue New value

515

*/

516

public void set(T newValue) {

517

// Implementation details

518

}

519

520

/**

521

* Get underlying assumption

522

* @return Assumption instance

523

*/

524

public Assumption getAssumption() {

525

return null; // Implementation details

526

}

527

}

528

529

/**

530

* Cyclic assumption management

531

*/

532

public final class CyclicAssumption {

533

534

/**

535

* Create cyclic assumption

536

* @param name Assumption name

537

*/

538

public CyclicAssumption(String name) {

539

// Implementation details

540

}

541

542

/**

543

* Get current assumption

544

* @return Current Assumption

545

*/

546

public Assumption getAssumption() {

547

return null; // Implementation details

548

}

549

550

/**

551

* Invalidate current assumption and create new one

552

*/

553

public void invalidate() {

554

// Implementation details

555

}

556

557

/**

558

* Invalidate with message

559

* @param message Invalidation message

560

*/

561

public void invalidate(String message) {

562

// Implementation details

563

}

564

}

565

566

/**

567

* Context-local storage

568

* @param <T> Stored value type

569

*/

570

public final class ContextLocal<T> {

571

572

/**

573

* Get value for current context

574

* @return Context-local value

575

*/

576

public T get() {

577

return null; // Implementation details

578

}

579

580

/**

581

* Get value for specific context

582

* @param context Target context

583

* @return Context-local value

584

*/

585

public T get(TruffleContext context) {

586

return null; // Implementation details

587

}

588

589

/**

590

* Set value for current context

591

* @param value New value

592

*/

593

public void set(T value) {

594

// Implementation details

595

}

596

597

/**

598

* Set value for specific context

599

* @param context Target context

600

* @param value New value

601

*/

602

public void set(TruffleContext context, T value) {

603

// Implementation details

604

}

605

}

606

607

/**

608

* Context-thread-local storage

609

* @param <T> Stored value type

610

*/

611

public final class ContextThreadLocal<T> {

612

613

/**

614

* Get value for current context and thread

615

* @return Context-thread-local value

616

*/

617

public T get() {

618

return null; // Implementation details

619

}

620

621

/**

622

* Get value for specific context and current thread

623

* @param context Target context

624

* @return Context-thread-local value

625

*/

626

public T get(TruffleContext context) {

627

return null; // Implementation details

628

}

629

630

/**

631

* Get value for specific context and thread

632

* @param context Target context

633

* @param thread Target thread

634

* @return Context-thread-local value

635

*/

636

public T get(TruffleContext context, Thread thread) {

637

return null; // Implementation details

638

}

639

640

/**

641

* Set value for current context and thread

642

* @param value New value

643

*/

644

public void set(T value) {

645

// Implementation details

646

}

647

648

/**

649

* Set value for specific context and current thread

650

* @param context Target context

651

* @param value New value

652

*/

653

public void set(TruffleContext context, T value) {

654

// Implementation details

655

}

656

}

657

658

/**

659

* Action executed on specific threads

660

*/

661

public abstract class ThreadLocalAction {

662

663

/**

664

* Perform action on thread

665

* @param access Thread access interface

666

*/

667

protected abstract void perform(Access access);

668

669

/**

670

* Thread access interface for actions

671

*/

672

public interface Access {

673

674

/**

675

* Get current thread

676

* @return Thread instance

677

*/

678

Thread getThread();

679

680

/**

681

* Check if thread is current

682

* @return true if current thread

683

*/

684

boolean isCurrentThread();

685

686

/**

687

* Submit action to thread

688

* @param action Action to submit

689

*/

690

void submit(ThreadLocalAction action);

691

}

692

}

693

694

/**

695

* Truffle file system abstraction

696

*/

697

public final class TruffleFile {

698

699

/**

700

* Check if file exists

701

* @return true if exists

702

*/

703

public boolean exists() {

704

return false; // Implementation details

705

}

706

707

/**

708

* Check if is directory

709

* @return true if directory

710

*/

711

public boolean isDirectory() {

712

return false; // Implementation details

713

}

714

715

/**

716

* Check if is regular file

717

* @return true if regular file

718

*/

719

public boolean isRegularFile() {

720

return false; // Implementation details

721

}

722

723

/**

724

* Get file size

725

* @return File size in bytes

726

*/

727

public long size() throws IOException {

728

return 0; // Implementation details

729

}

730

731

/**

732

* Get file name

733

* @return File name

734

*/

735

public String getName() {

736

return null; // Implementation details

737

}

738

739

/**

740

* Get file path

741

* @return File path string

742

*/

743

public String getPath() {

744

return null; // Implementation details

745

}

746

747

/**

748

* Read all bytes

749

* @return File content as bytes

750

*/

751

public byte[] readAllBytes() throws IOException {

752

return null; // Implementation details

753

}

754

755

/**

756

* Read all text

757

* @param charset Character set

758

* @return File content as string

759

*/

760

public String readString(Charset charset) throws IOException {

761

return null; // Implementation details

762

}

763

764

/**

765

* Write bytes to file

766

* @param bytes Bytes to write

767

*/

768

public void write(byte[] bytes) throws IOException {

769

// Implementation details

770

}

771

772

/**

773

* Write string to file

774

* @param content String content

775

* @param charset Character set

776

*/

777

public void writeString(String content, Charset charset) throws IOException {

778

// Implementation details

779

}

780

781

/**

782

* Create input stream

783

* @return InputStream for file

784

*/

785

public InputStream newInputStream() throws IOException {

786

return null; // Implementation details

787

}

788

789

/**

790

* Create output stream

791

* @return OutputStream for file

792

*/

793

public OutputStream newOutputStream() throws IOException {

794

return null; // Implementation details

795

}

796

797

/**

798

* List directory contents

799

* @return Array of TruffleFile instances

800

*/

801

public TruffleFile[] list() throws IOException {

802

return null; // Implementation details

803

}

804

805

/**

806

* Resolve child path

807

* @param child Child path

808

* @return Child TruffleFile

809

*/

810

public TruffleFile resolve(String child) {

811

return null; // Implementation details

812

}

813

814

/**

815

* Get parent directory

816

* @return Parent TruffleFile or null

817

*/

818

public TruffleFile getParent() {

819

return null; // Implementation details

820

}

821

}

822

823

/**

824

* Truffe logger with language-specific configuration

825

*/

826

public final class TruffleLogger {

827

828

/**

829

* Log info message

830

* @param message Log message

831

*/

832

public void info(String message) {

833

// Implementation details

834

}

835

836

/**

837

* Log warning message

838

* @param message Log message

839

*/

840

public void warning(String message) {

841

// Implementation details

842

}

843

844

/**

845

* Log error message

846

* @param message Log message

847

*/

848

public void severe(String message) {

849

// Implementation details

850

}

851

852

/**

853

* Log debug message

854

* @param message Log message

855

*/

856

public void fine(String message) {

857

// Implementation details

858

}

859

860

/**

861

* Check if level is loggable

862

* @param level Log level

863

* @return true if loggable

864

*/

865

public boolean isLoggable(Level level) {

866

return false; // Implementation details

867

}

868

869

/**

870

* Log with level

871

* @param level Log level

872

* @param message Log message

873

*/

874

public void log(Level level, String message) {

875

// Implementation details

876

}

877

878

/**

879

* Log with level and throwable

880

* @param level Log level

881

* @param message Log message

882

* @param thrown Exception to log

883

*/

884

public void log(Level level, String message, Throwable thrown) {

885

// Implementation details

886

}

887

}

888

889

/**

890

* Safepoint management for thread coordination

891

*/

892

public final class TruffleSafepoint {

893

894

/**

895

* Poll safepoint on current thread

896

*/

897

public static void poll() {

898

// Implementation details

899

}

900

901

/**

902

* Poll safepoint with node context

903

* @param location Node location for debugging

904

*/

905

public static void poll(Node location) {

906

// Implementation details

907

}

908

909

/**

910

* Set pending safepoint

911

* @param action Action to execute at safepoint

912

*/

913

public static void setPending(ThreadLocalAction action) {

914

// Implementation details

915

}

916

917

/**

918

* Check if safepoint is pending

919

* @return true if pending

920

*/

921

public static boolean isPending() {

922

return false; // Implementation details

923

}

924

}

925

```

926

927

### Compiler Integration

928

929

Advanced compiler directives and optimization support.

930

931

```java { .api }

932

/**

933

* Compiler directives for optimization hints

934

*/

935

public final class CompilerDirectives {

936

937

/**

938

* Mark code path as unlikely

939

* @param condition Condition to check

940

* @return Original condition value

941

*/

942

public static boolean injectBranchProbability(double probability, boolean condition) {

943

return condition;

944

}

945

946

/**

947

* Indicate slow path execution

948

*/

949

public static void transferToInterpreter() {

950

// Implementation details

951

}

952

953

/**

954

* Indicate slow path with message

955

* @param message Transfer reason

956

*/

957

public static void transferToInterpreterAndInvalidate() {

958

// Implementation details

959

}

960

961

/**

962

* Check if compiled

963

* @return true if compiled code

964

*/

965

public static boolean inCompiledCode() {

966

return false; // Implementation details

967

}

968

969

/**

970

* Check if interpreting

971

* @return true if interpreter

972

*/

973

public static boolean inInterpreter() {

974

return !inCompiledCode();

975

}

976

977

/**

978

* Blackhole value to prevent optimization

979

* @param value Value to blackhole

980

*/

981

public static void blackhole(Object value) {

982

// Implementation details

983

}

984

985

/**

986

* Mark value as compilation final

987

* @param value Value to mark

988

* @return Original value

989

*/

990

public static <T> T compilationFinal(T value) {

991

return value;

992

}

993

994

/**

995

* Ensure virtualized

996

* @param object Object to virtualize

997

* @return Original object

998

*/

999

public static <T> T ensureVirtualized(T object) {

1000

return object;

1001

}

1002

1003

/**

1004

* Cast exact type

1005

* @param value Value to cast

1006

* @param type Target type

1007

* @return Cast value

1008

*/

1009

@SuppressWarnings("unchecked")

1010

public static <T> T castExact(Object value, Class<T> type) {

1011

return (T) value;

1012

}

1013

1014

/**

1015

* Mark boundary between compiled and interpreter

1016

*/

1017

public static void interpreterOnly(Runnable runnable) {

1018

runnable.run();

1019

}

1020

}

1021

1022

/**

1023

* Compilation-time assertions

1024

*/

1025

public final class CompilerAsserts {

1026

1027

/**

1028

* Assert never reached in compiled code

1029

*/

1030

public static void neverPartOfCompilation() {

1031

// Implementation details

1032

}

1033

1034

/**

1035

* Assert never reached with message

1036

* @param message Assertion message

1037

*/

1038

public static void neverPartOfCompilation(String message) {

1039

// Implementation details

1040

}

1041

1042

/**

1043

* Assert always compiled

1044

*/

1045

public static void partialEvaluationConstant(Object value) {

1046

// Implementation details

1047

}

1048

1049

/**

1050

* Assert compilation final

1051

* @param value Value to check

1052

*/

1053

public static void compilationConstant(Object value) {

1054

// Implementation details

1055

}

1056

}

1057

```

1058

1059

## Types

1060

1061

### Advanced Configuration Types

1062

1063

```java { .api }

1064

/**

1065

* Option descriptor for language/instrument options

1066

*/

1067

public final class OptionDescriptor {

1068

1069

/**

1070

* Create option descriptor

1071

* @param key Option key

1072

* @param help Help text

1073

* @return OptionDescriptor instance

1074

*/

1075

public static OptionDescriptor newBuilder(OptionKey<?> key, String help) {

1076

return null; // Implementation details

1077

}

1078

1079

/**

1080

* Get option key

1081

* @return OptionKey instance

1082

*/

1083

public OptionKey<?> getKey() {

1084

return null; // Implementation details

1085

}

1086

1087

/**

1088

* Get help text

1089

* @return Help text

1090

*/

1091

public String getHelp() {

1092

return null; // Implementation details

1093

}

1094

1095

/**

1096

* Get option name

1097

* @return Option name

1098

*/

1099

public String getName() {

1100

return null; // Implementation details

1101

}

1102

}

1103

1104

/**

1105

* Descriptor for option categories

1106

*/

1107

public enum OptionCategory {

1108

USER, EXPERT, DEBUG

1109

}

1110

1111

/**

1112

* Stability level for APIs

1113

*/

1114

public enum OptionStability {

1115

STABLE, EXPERIMENTAL

1116

}

1117

1118

/**

1119

* Memory management utilities

1120

*/

1121

public final class MemoryUtil {

1122

1123

/**

1124

* Get object size estimate

1125

* @param object Object to measure

1126

* @return Size estimate in bytes

1127

*/

1128

public static long sizeOf(Object object) {

1129

return 0; // Implementation details

1130

}

1131

1132

/**

1133

* Trigger garbage collection hint

1134

*/

1135

public static void gc() {

1136

System.gc();

1137

}

1138

}

1139

```