sách gpt4 ăn đã đi

JVM có thể được thay thế bởi GraalVM sau hai năm nữa

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2022-12-16 14:31:50 34 4
mua khóa gpt4 giày nike

Xin chào mọi người, tôi là Kite, tài khoản chính thức là "Diều thời cổ đại", tập trung vào công nghệ Java và hệ sinh thái xung quanh. Bài viết sẽ được đưa vào JavaNewBee, cũng như bản đồ kiến ​​thức back-end Java, bao gồm lộ trình từ người mới bắt đầu đến chuyên gia.

Hôm nay hãy nói về GraalVM.

GraalVM là thế hệ JVM mới mà Oracle đang phát triển mạnh mẽ và muốn quảng bá. Hiện tại, nhiều framework đã dần hỗ trợ GraalVM. Ví dụ, Spring chúng tôi đang sử dụng cũng đã ra mắt bộ công cụ tương thích với GraalVM.

Vì nó được cho là mạnh mẽ như vậy, vậy chính xác thì nó là gì?

Mối quan hệ giữa GraalVM và JVM

Vì nó được gọi là VM nên nó phải liên quan đến JVM. JVM là viết tắt của Máy ảo Java. Tất cả chúng ta đều biết rằng các chương trình Java chạy trên các máy ảo. Máy ảo cung cấp thời gian chạy Java, hỗ trợ giải thích và thực thi và trình biên dịch đúng lúc một phần (JIT), đồng thời chịu trách nhiệm phân bổ và quản lý tài nguyên. cần thiết để Java chạy. Bộ nhớ, các trình thu gom rác khác nhau mà chúng ta gọi là đều hoạt động trong JVM.

Ví dụ: trong Oracle JDK và OpenJDK, JVM mặc định là máy ảo HotSpot, hiện là máy ảo được sử dụng rộng rãi nhất. Các cuốn sách, bài báo và câu hỏi phỏng vấn khác nhau mà chúng ta thường thấy về máy ảo về cơ bản đều nói về máy ảo HotSpot.

Ngoài ra, còn có một số máy ảo thương mại hoặc thích hợp, chẳng hạn như J9 JVM của IBM, Zing VM thương mại, v.v.

Vậy GraalVM có phải là một máy ảo Java khác không?

Có, nhưng không hoàn toàn.

GraalVM có thể thay thế hoàn toàn các máy ảo nêu trên, chẳng hạn như HotSpot. Di chuyển trực tiếp mã đang chạy trên HotSpot của bạn sang GraalVM mà không thực hiện bất kỳ thay đổi nào. Bạn thậm chí sẽ không nhận thấy điều đó và dự án sẽ chạy hoàn hảo.

Nhưng GraalVM có phạm vi sử dụng rộng hơn, không chỉ hỗ trợ ngôn ngữ Java mà còn hỗ trợ các ngôn ngữ khác. Các ngôn ngữ khác này không chỉ bao gồm các ngôn ngữ dựa trên JVM trực tiếp, chẳng hạn như Kotlin và Scala, mà còn cả JavaScript, Nodejs, Ruby, Python, v.v.

Tham vọng của GraalVM không dừng lại ở đó. Nhìn vào hình trên, mục đích của nó là xây dựng một Framework. Mục tiêu cuối cùng là hỗ trợ bất kỳ ngôn ngữ nào, chúng có thể chạy trên GraalVM cùng nhau. rào cản.

Mối quan hệ giữa GraalVM và JDK là gì?

Máy ảo Java được tích hợp sẵn trong JDK, chẳng hạn như Oracle JDK và OpenJDK. Máy ảo HotSpot được tích hợp sẵn theo mặc định.

GraalVM cũng là một JDK, một JDK hiệu suất cao. Nó hoàn toàn có thể thay thế OpenJDK và Oracle JDK.

Cách GraalVM chạy các chương trình Java

Nói đã lâu mà bạn vẫn chưa biết GraalVM là gì.

  • GraalVM - Cũng bao gồm trình biên dịch đúng lúc Graal (JIT), có thể được sử dụng với HotSpot.

  • GraalVM – là một JDK hiệu suất cao được thiết kế để tăng tốc hiệu suất ứng dụng Java trong khi tiêu tốn ít tài nguyên hơn.

  • GraalVM - là một chương trình máy ảo hỗ trợ trộn đa ngôn ngữ. Nó không chỉ có thể chạy loạt ngôn ngữ JVM mà còn hỗ trợ các ngôn ngữ khác.

GraalVM cung cấp hai cách để chạy các chương trình Java.

Cách thứ nhất: dùng kết hợp với HotSpot

Như đã đề cập ở trên, GraalVM bao gồm trình biên dịch đúng lúc Graal (JIT). Vì phiên bản JDK 9u, Orcale JDK và OpenJDK đã tích hợp trình biên dịch đúng lúc Graal. Chúng tôi biết rằng Java có cả khả năng diễn giải việc thực thi và biên dịch đúng lúc.

Khi một chương trình được chạy, trình thông dịch sẽ hoạt động trước tiên và mã có thể được thực thi trực tiếp. Theo thời gian, trình biên dịch đúng lúc dần dần phát huy tác dụng, biên dịch và tối ưu hóa ngày càng nhiều mã thành mã cục bộ để đạt hiệu quả thực thi cao hơn. Trình biên dịch đúng lúc có thể biên dịch mã nóng một cách có chọn lọc, tiết kiệm rất nhiều thời gian và không gian biên dịch. Ví dụ: các phương thức được thực thi nhiều lần hoặc các vòng lặp, đệ quy, v.v.

JDK sử dụng trình biên dịch đúng lúc C2 theo mặc định và C2 được viết bằng C++. Và sử dụng các tham số sau để thay thế C2 bằng Graal.

                        
                          -XX:+Mở khóaExperimentalVMOptions -XX:+Sử dụngJVMCICompiler

                        
                      

Trình biên dịch Graal được triển khai bằng Java. Sử dụng Java để triển khai trình biên dịch của riêng bạn. Graal áp dụng cách tiếp cận tích cực hơn để tối ưu hóa dựa trên một số điều kiện giả định. Sau khi sử dụng trình biên dịch Graal sẽ có sự cải thiện nhất định về hiệu suất.

Nhưng nếu bạn vẫn đang sử dụng JDK8 thì rất tiếc, mọi thứ trong GraalVM sẽ không có sẵn.

Loại thứ hai: AOT biên dịch các chương trình thực thi cục bộ

Đây là lúc GraalVM thực sự mạnh mẽ.

Quá trình biên dịch trước thời hạn của AOT được so sánh với quá trình biên dịch đúng lúc. AOT tiêu thụ tài nguyên CPU để biên dịch nhanh chóng trong quá trình hoạt động và chương trình có thể đạt được hiệu suất lý tưởng ngay khi khởi động. Ví dụ: ngôn ngữ C và C++ sử dụng trình biên dịch tĩnh AOT, chuyển đổi trực tiếp mã thành mã máy để thực thi. Java luôn sử dụng công nghệ giải thích + biên dịch đúng lúc. Trong hầu hết các trường hợp, hiệu suất của biên dịch đúng lúc của Java không tệ hơn biên dịch tĩnh, nhưng nó vẫn hoạt động theo hướng biên dịch AOT.

Tuy nhiên, Java gặp một số khó khăn với AOT, chẳng hạn như tải động các lớp và lệnh gọi phản ánh.

GraalVM rõ ràng đã khắc phục được những vấn đề này, bằng cách sử dụng GraalVM, mã Java có thể được biên dịch trực tiếp thành một chương trình thực thi dưới dạng mã máy cục bộ.

Hiện tại chúng ta cần cài đặt JDK hoặc JRE để chạy Java phải không? Nếu chương trình được biên dịch trực tiếp thành chương trình thực thi thì không cần cài đặt JDK hoặc JRE trên máy chủ. Điều đó có nghĩa là bạn không cần máy ảo để chạy mã Java, phải không?

Quá trình biên dịch AOT của GraalVM thực sự dựa trên khung biên dịch SubstrateVM. SubstrateVM có thể được hiểu là một phiên bản nhúng được sắp xếp hợp lý của JVM, bao gồm xử lý ngoại lệ, đồng bộ hóa, quản lý luồng, quản lý bộ nhớ (thu gom rác) và JNI cũng như các thành phần khác.

SubstrateVM có thời gian khởi động rất ngắn và tốn rất ít bộ nhớ. Thời gian thực thi của các chương trình Java được biên dịch theo cách này có thể giống như ngôn ngữ C.

Hình bên dưới là so sánh mức sử dụng CPU và bộ nhớ bằng cách sử dụng tính năng biên dịch đúng lúc (chạy JVM) và AOT (chương trình thực thi gốc). Có thể thấy mức sử dụng CPU và bộ nhớ ở chế độ AOT là rất nhỏ.

Ngoài việc chiếm ít bộ nhớ hơn trong thời gian chạy, tệp thực thi cuối cùng được tạo theo cách này cũng rất nhỏ. Điều này rất thân thiện với việc triển khai đám mây. Hiện tại, các bộ chứa Docker được triển khai trong nhiều tình huống. Gói hình ảnh của chương trình Java phải bao gồm môi trường JVM hoàn chỉnh và gói Jar đã được biên dịch. Phương pháp AOT có thể giảm thiểu kích thước của Docker image.

thiếu sót.

Có nhiều lợi ích, nhưng tất nhiên cũng có một số nhược điểm. Đối với sự phản ánh, một phần có thể được xác định hoàn toàn trong thời gian chạy, không thể giải quyết hoàn toàn nó thông qua trình biên dịch tối ưu hóa và chỉ có thể giải quyết bằng cách thêm cấu hình. Vấn đề là hơi rắc rối một chút, nhưng nó khả thi. Phiên bản Spring Boot 2.7 đã hỗ trợ phản chiếu gốc Spring, một khung dựa nhiều vào sự phản chiếu, có thể hỗ trợ nó và chúng ta sẽ không gặp vấn đề gì khi sử dụng nó.

Cách GraalVM hỗ trợ nhiều ngôn ngữ

Để hỗ trợ nhiều ngôn ngữ, chúng ta cần nói về Truffle, một thành phần cốt lõi khác trong GraalVM.

Truffle là một khung triển khai ngôn ngữ được viết bằng Java. Việc triển khai ngôn ngữ dựa trên Truffle chỉ cần sử dụng Java để triển khai phân tích từ vựng, phân tích cú pháp và trình thực thi diễn giải của Cây cú pháp trừu tượng (AST) được tạo bởi phân tích cú pháp và sau đó bạn có thể tận hưởng các tối ưu hóa thời gian chạy khác nhau do Truffle cung cấp.

Đối với việc triển khai ngôn ngữ Truffle hoàn chỉnh, vì bản thân việc triển khai và các phần khung Truffle mà nó phụ thuộc đều được triển khai bằng Java nên nó có thể chạy trên bất kỳ máy ảo Java nào.

Tất nhiên, nếu Truffle đang chạy trên máy ảo Java đi kèm với trình biên dịch Graal, thì nó sẽ gọi API do trình biên dịch Graal cung cấp, chủ động kích hoạt quá trình biên dịch ngôn ngữ Truffle đúng lúc và chuyển đổi cách diễn giải của AST vào quá trình biên dịch đúng lúc. Mã máy cuối cùng.

Hiện tại, ngoài Java, JavaScript, Ruby, Python và nhiều ngôn ngữ phổ biến khác đã có thể chạy trên GraalVM.

GraalVM chính thức cũng cung cấp tài liệu đầy đủ. Khi một ngày nào đó bạn phát triển một ngôn ngữ mới, bạn cũng có thể sử dụng Truffle để làm cho ngôn ngữ đó chạy trên GraalVM.

Cài đặt và sử dụng

Phiên bản mới nhất của GraalVm là 22.3, được chia thành phiên bản cộng đồng và phiên bản doanh nghiệp. Giống như OpenJDK và Orcale JDK thương mại, phiên bản doanh nghiệp sẽ có nhiều chức năng phân tích hiệu suất hơn để giúp tối ưu hóa hiệu suất ở mức độ lớn hơn.

Phiên bản cộng đồng dựa trên OpenJDK 11.0.17, 17.0.5, 19.0.1, trong khi phiên bản thương mại dựa trên Oracle JDK 8u351, 11.0.17, 17.0.5, 19.0.1, vì vậy nếu bạn muốn sử dụng miễn phí one, bạn chỉ có thể cài đặt chương trình Đã nâng cấp lên JDK 11 trở lên.

GraalVM hỗ trợ Windows, Linux và MacOS. Bạn có thể cài đặt phiên bản mới nhất bằng lệnh hoặc tải xuống trực tiếp phiên bản Java tương ứng.

Tôi đã tải xuống phiên bản Java 11, giải nén trực tiếp gói nén đã tải xuống và sau đó định cấu hình các biến môi trường. Chỉ cần định cấu hình thư mục giải nén thành biến môi trường JAVA_HOME.

Sau khi giải nén nó thực sự tương đương với việc cài đặt hoàn tất.

Nhập thư mục bin trong thư mục giải nén và chạy java -version. Kết quả chạy như sau:

hình ảnh-20221130105634757

chạy mã

Cách chạy thông thường

Đây là phương pháp chúng tôi đang sử dụng, sử dụng GrralVM làm OpenJDK, nhưng thay thế trình biên dịch đúng lúc bằng Graal. Đây là phương pháp đầu tiên được đề cập trước đó.

Sau khi cài đặt hoàn tất, bạn có thể sử dụng nó như một JDK bình thường, chẳng hạn như javac, jps, jmap, v.v. có thể được sử dụng trực tiếp. Hầu hết mọi người vẫn sử dụng IDEA nên chỉ cần sử dụng trực tiếp trong IDEA.

1. Đầu tiên hãy tạo một dự án Java theo ý muốn.

2. Sau khi tạo xong, hãy mở cài đặt dự án.

3. Chọn SDK trong hộp bật lên cài đặt dự án mở ra, nhấp vào dấu cộng và chọn thư mục GraalVM mà bạn đã giải nén trước đó.

4. Sau đó chọn JDK bạn vừa thêm.

5. Cuối cùng chạy một đoạn mã kiểm tra.

                        
                          lớp công khai HelloWorld { public static void main(String[] args) throws Exception { System.out.println("Xin chào GraalVM!"); Thread.sleep(1000 * 100 * 100); } }

                        
                      

Chế độ hoạt động trên thực tế tương đương với chế độ hoạt động đầu tiên được đề cập trước đó.

Chạy ở chế độ hình ảnh gốc

Phương pháp này là AOT được biên dịch thành mã máy và xuất hiện dưới dạng tệp thực thi. Native-image có thể được thực thi dưới dạng dòng lệnh hoặc có thể được thực thi kết hợp với Maven. Ở đây tôi sẽ trực tiếp trình diễn dạng Maven.

1. Cài đặt bộ công cụ hình ảnh gốc.

hình ảnh gốc là một công cụ được sử dụng để biên dịch và đóng gói AOT. Hãy cài đặt công cụ này trước khi tiếp tục các bước sau.

Sau khi cài đặt GraalVM, có một công cụ tên là gu trong thư mục bin. Sử dụng công cụ này để cài đặt nó. Nếu bạn thêm thư mục bin vào môi trường, chỉ cần cài đặt nó bằng lệnh sau.

                        
                          gu cài đặt hình ảnh gốc

                        
                      

Nếu thư mục bin không được thêm vào biến môi trường, hãy nhập thư mục bin và thực hiện lệnh sau để cài đặt.

                        
                          ./gu cài đặt hình ảnh gốc

                        
                      

Quá trình này có thể chậm vì bạn phải tải xuống mọi thứ từ github. Nếu nó không thành công một lần (ví dụ: hết thời gian), chỉ cần thử thêm hai lần nữa.

2. Cấu hình Maven.

Cấu hình các phiên bản khác nhau.

                        
                            UTF-8 ${java.specification.version}  ${java.specification.version} 0.9.12 graalvm-demo-image org.graalvm.HelloWorld 

                        
                      

Native.maven.plugin.version là phiên bản plug-in Maven được biên dịch thành một chương trình thực thi để sử dụng.

imageName là tên của chương trình thực thi được tạo ra.

mainClass là tên đầy đủ của lớp đầu vào.

Định cấu hình plugin xây dựng.

                        
                               org.codehaus.mojo exec-maven-plugin 3.0.0   java-agent  exec   java ${project.build.directory}  -classpath  ${mainClass}     native  exec   ${project.build.directory}/${imageName} ${project.build.directory}      org.apache.maven.plugins maven-compiler-plugin 3.8.1  ${maven.compiler.source} ${maven.compiler.source}    org.apache.maven.plugins maven-jar-plugin 3.2.2    true ${mainClass}      org.apache.maven.plugins maven-assembly-plugin   package  single       true ${mainClass}    jar-with-dependencies     

                        
                      

Cấu hình hồ sơ.

                        
                              gốc    org.graalvm.buildtools native-maven-plugin ${native.maven.plugin.version} true   build-native  build  package   test-native  test  test    false  -H:DashboardDump=fortune -H:+DashboardAll   true          

                        
                      

3. Sử dụng maven để biên dịch và đóng gói nó thành một chương trình thực thi cục bộ.

Thực hiện lệnh Maven.

                        
                          gói mvn clean

                        
                      

hoặc.

                        
                          mvn -Pnative -gói Dagent 

                        
                      

Quá trình biên dịch và đóng gói tương đối chậm, do phải biên dịch trực tiếp thành mã máy nên chậm hơn quá trình biên dịch chung. Xem nhật ký đầu vào bên dưới cho biết việc đóng gói đã thành công.

4. Chạy gói thực thi, mở thư mục đích và bạn đã thấy gói thực thi graalvm-demo-image, với kích thước 11,58M.

Sau đó, bạn có thể chạy nó, nhập thư mục, thực hiện lệnh sau và bạn có thể thấy kết quả đầu ra bình thường. Lưu ý rằng JVM cục bộ không còn được sử dụng vào thời điểm này.

                        
                          ./graalvm-demo-image Xin chào GraalVM!

                        
                      

Tại thời điểm này, bạn không thể nhìn thấy quá trình này bằng lệnh jps -l nữa mà chỉ có thể xem được thông qua ps.

Tóm tắt

Mặc dù chúng tôi chưa thấy công ty nào nói rằng họ đang sử dụng GraalVM, nhưng nhiều framework như Quarkus, Spring Boot và Spring đã hỗ trợ chế độ Native-image của GraalVM và với sự quảng bá mạnh mẽ của Orcale, tôi tin rằng nó sẽ sớm xuất hiện. nhiều sản phẩm hơn. Hãy đến và trải nghiệm ngay bây giờ.


Nếu thấy hay thì cho mình xin ý kiến ​​nhé! .

Tài khoản công khai "Diều thời cổ đại" là một nhà phát triển Java, tập trung vào Java và hệ sinh thái xung quanh. Nhấn mạnh vào việc xuất ra những thông tin gốc và hữu ích, bạn có thể chọn theo dõi tôi ngay bây giờ, hoặc cũng không quá muộn để theo dõi tôi sau khi đọc các bài báo lịch sử. Nhấn và giữ mã QR để theo dõi và trở nên xuất sắc cùng tôi nhé! .

Cuối cùng, bài viết này về khả năng JVM sẽ được thay thế bởi GraalVM trong hai năm tới sẽ kết thúc tại đây. Nếu bạn muốn biết thêm về khả năng JVM sẽ được thay thế bởi GraalVM trong hai năm tới, vui lòng tìm kiếm bài viết CFSDN hoặc. tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

34 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress