1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu máy ảo Java

22 338 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 489,11 KB
File đính kèm ChuyenDeJava.rar (2 MB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cùng với sự phát triển nhanh chóng của công nghệ, nhiều ứng dụng đã được tạo ra để phục vụ nhu cầu học tập, làm việc, giải trí của con người. Trước đây, để viết một chương trình máy tính thực sự rất khó khăn do rào cản ngôn ngữ tự nhiên và ngôn ngữ máy tính còn cách nhau rất xa. Tuy nhiên dần dần các ngôn ngữ lập trình mới ra đời, tạo điều kiện thuận lợi cho các lập trình viên có thể viết mã dễ dàng hơn. Cùng với sự phát triển của Internet, đặt ra yêu cầu một ứng dụng chỉ được viết một lần nhưng có thể được sử dụng để chạy ở nhiều nơi, nhiều hệ điều hành khác nhau, nhiều nền tảng khác nhau. Chính vì thế ngôn ngữ lập trình Java cùng với máy ảo Java ( Java Virtual Machine ) được ra đời để giải quyết vấn đề này. Trong nội dung của bài này, em sẽ trình bày những tìm hiểu của em về máy ảo Java: Cấu trúc máy ảo Java. Cấu trúc bộ nhớ máy ảo Java. Cách cấp phát bộ nhớ trong máy ảo Java.  

Trang 1

TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM

TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN MÔN CHUYÊN ĐỀ JAVA

TÌM HIỂU MÁY ẢO JAVA (JVM)

Người hướng dẫn: ThS VŨ ĐÌNH HỒNG Người thực hiện: TRẦN NGỌC QUỐC PHONG – 51303365

Lớp : 13050303

Khóa : 17

Trang 2

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2016

Trang 3

LỜI CẢM ƠN

Em xin gửi lời cảm ơn chân thành đến ThS Vũ Đình Hồng và thầy Mai Văn Mạnh, giảng viên môn Chuyên Đề Java – trường Đại học Tôn Đức Thắng,

những người đã tận tình hướng dẫn, chỉ bảo em trong suốt quá trình làm bài tập

Em cũng xin chân thành cảm ơn các thầy cô giáo trong trường Đại học Tôn Đức Thắng nói chung, các thầy cô trong Bộ môn Công Nghệ Phần Mềm nói riêng

đã dạy dỗ cho em kiến thức về các môn đại cương cũng như các môn chuyên ngành, giúp em có được cơ sở lý thuyết vững vàng và tạo điều kiện giúp đỡ em trong suốt quá trình học tập

Cuối cùng, em xin chân thành cảm ơn gia đình và bạn bè, đã luôn tạo điều kiện, quan tâm, giúp đỡ, động viên em trong suốt quá trình học tập và hoàn thành bài tập

Thành phố Hồ Chí Minh, ngày 01 tháng 04 năm 2016

Sinh Viên Thực Hiện

Trần Ngọc Quốc Phong

Trang 4

ĐỒ ÁN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG

Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi / chúng tôi và được

sự hướng dẫn của ThS Vũ Đình Hồng Các nội dung nghiên cứu, kết quả trong

đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo

Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc

Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên

quan đến những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có)

TP Hồ Chí Minh, ngày 01 tháng 04 năm 2016

Tác giả (ký tên và ghi rõ họ tên)

Trần Ngọc Quốc Phong

Trang 5

PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN

Phần xác nhận của GV hướng dẫn

_ _ _ _ _ _ _

Tp Hồ Chí Minh, ngày tháng năm

(kí và ghi họ tên)

Phần đánh giá của GV chấm bài

_ _ _ _ _ _ _

Tp Hồ Chí Minh, ngày tháng năm

(kí và ghi họ tên)

Trang 6

TÓM TẮT

Cùng với sự phát triển nhanh chóng của công nghệ, nhiều ứng dụng đã được tạo ra để phục vụ nhu cầu học tập, làm việc, giải trí của con người Trước đây, để viết một chương trình máy tính thực sự rất khó khăn do rào cản ngôn ngữ

tự nhiên và ngôn ngữ máy tính còn cách nhau rất xa Tuy nhiên dần dần các ngôn ngữ lập trình mới ra đời, tạo điều kiện thuận lợi cho các lập trình viên có thể viết

mã dễ dàng hơn

Cùng với sự phát triển của Internet, đặt ra yêu cầu một ứng dụng chỉ được viết một lần nhưng có thể được sử dụng để chạy ở nhiều nơi, nhiều hệ điều hành khác nhau, nhiều nền tảng khác nhau Chính vì thế ngôn ngữ lập trình Java cùng với máy ảo Java ( Java Virtual Machine ) được ra đời để giải quyết vấn đề này

Trong nội dung của bài này, em sẽ trình bày những tìm hiểu của em về máy

ảo Java:

- Cấu trúc máy ảo Java

- Cấu trúc bộ nhớ máy ảo Java

- Cách cấp phát bộ nhớ trong máy ảo Java

Trang 7

Mục lục

Trang 8

CHƯƠNG 1: MÁY ẢO Java (Java Virtual Machine)

1.1 Tổng quan về JVM

1.1.1 Giới thiệu về JVM

Thập kỷ 90 chứng kiến một sự phát triển như vũ bão của mạng Internet, kèm theo đó là vô vàn các ứng dụng trên các môi trường, hệ điều hành (OS) và các vi xử lý (CPU) khác nhau Tuy nhiên có một điểm hạn chế lớn là người lập trình phải rất vất vả khi chuyển đổi các ứng dụng của mình để các hệ thống khác

có thể sử dụng được

Ngày 23/5/1995, công ty máy tính Sun Microsystems đã giới thiệu một công cụ lập trình mới - ngôn ngữ Java - nhằm khắc phục những khó khăn đó Đặc điểm nổi bật nhất của Java là nó không phụ thuộc vào hệ điều hành và bộ xử lý Điều này cho phép một ứng dụng viết bằng Java có thể được thực hiện trên bất kỳ

hệ điều hành và hệ xử lý nào có hỗ trợ Java Do vậy, người lập trình chỉ cần viết ứng dụng bằng Java đúng một lần, sau đó có thể sử dụng ứng dụng này trên các

hệ điều hành khác nhau như Windows95, WindowsNT, Mac OS, Unix, theo phương châm: viết một lần, sử dụng ở bất kỳ đâu

Có thể định nghĩa một cách chính xác hơn về Java: là ngôn ngữ lập trình hướng đối tượng, được thiết kế độc lập với hệ điều hành, cho phép người lập trình viết chương trình một lần và có thể sử dụng tại bất kỳ đâu

Không chỉ giới thiệu ngôn ngữ lập trình, Sun Microsystems còn đưa ra hàng loạt công cụ hỗ trợ người lập trình phát triển các ứng dụng bằng Java, như Java Develoment Kit, JavaBeans, HotJava

Ngôn ngữ Java có cú pháp rất giống với ngôn ngữ C/C++ (là một ngôn ngữ rất mạnh được dùng phổ biến hiện nay), tuy nhiên nó đã được thay đổi khá nhiều

để đáp ứng khả năng độc lập với hệ điều hành Nền tảng của ngôn ngữ Java là các class Các class đóng vai trò như những đối tượng, người lập trình khi xây dựng ứng dụng sẽ sử dụng một số class chuẩn của hệ thống, đồng thời có thể tự mình xây dựng class khác đáp ứng yêu cầu công việc

Trang 9

Java là ngôn ngữ dễ học, nó lược bớt những lệnh thừa và rườm rà của C/C++ để người lập trình chú trọng vào việc viết chương trình Đồng thời, nó còn hạn chế người lập trình không can thiệp quá sâu vào hệ thống.

Hiện nay Java được ứng dụng rất rộng rãi, chủ yếu là các ứng dụng được viết trên Internet nhằm khai thác tối đa khả năng của nó trong lĩnh vực viễn thông, truyền hình, mạng, và các máy tính đơn lẻ Hiện tại các ứng dụng viết bằng Java khi thực hiện còn chậm hơn so với các ứng dụng được xây dựng thông thường, tuy nhiên hầu hết các nhà phát triển phần mềm đều cho rằng tốc độ sẽ được cải thiện và Java sẽ là ngôn ngữ lập trình của tương lai

Máy ảo Java là trái tim của ngôn ngữ Java Môi trường Java bao gồm năm phần tử sau:

− Ngôn ngữ

− Định nghĩa Bytecode

− Các thư viện lớp Java/Sun

− Máy ảo Java (JVM)

− Cấu trúc của file class

Giá trị cốt lõi của của JRE là:

− Định nghĩa Bytecode

− Cấu trúc của file class

− Máy ảo Java

Java Virtual Machine (JVM) đóng vai trò rất quan trọng để các ứng dụng Java có thể thực hiện được Nó hoạt động như một máy tính ảo, cũng có bộ lệnh, cấu trúc dữ liệu, bộ nhớ, Khi các ứng dụng Java (sau khi dịch, các ứng dụng viết bằng Java sẽ có phần mở rộng là class) thực hiện, JVM tiến hành phân tích mã trong class đó thành bộ lệnh của JVM rồi thực hiện giống như máy tính PC thao tác với các ứng dụng thông thường

Khả năng cơ động của file class cho phép các chương trình Java viết một lần

Trang 10

nhưng chạy ở bất kỳ đâu Bởi vậy, các class sau khi dịch có thể được thực hiện trên bất kỳ hệ điều hành nào thông qua máy tính ảo JVM.

Khả năng này có được nhờ sự giúp đỡ của JVM Hiện tại, JVM được xây dựng cho hầu hết các hệ điều hành và hệ xử lý hiện có, điều này có nghĩa là các ứng dụng viết bằng Java có đầy đủ điều kiện để phát triển

1.1.2 Máy ảo Java là gì?

Như đã biết, JVM bản chất là một chương trình có thể thực thi các đoạn

mã lập trình của Java, và đặc điểm của những chương trình viết bằng Java là đều

có thể chạy trên bất kỳ môi trường nào, miễn là có cài máy ảo JVM trên đó Việc này sẽ tạo một động lực rất lớn thúc đẩy việc dùng lại các phần mềm Java đã được viết trước đây và việc phát triển phần mềm trên iPhone và iTouch

Máy ảo là một phần mềm dựa trên cơ sở máy tính ảo Nó có tập hợp các lệnh logic để xác định các hoạt động của máy tính Người ta có thể xem nó như một hệ điều hành thu nhỏ Nó thiết lập các lớp trừu tượng cho: Phần cứng bên dưới,hệ điều hành, mã đã biên dịch

Trình biên dịch chuyển mã nguồn thành tập các lệnh của máy ảo mà không phụ thuộc vào phần cứng cụ thể Trình thông dịch trên mỗi máy sẽ chuyển tập lệnh này thành chương trình thực thi Máy ảo tạo ra một môi trường bên trong để thực thi các lệnh bằng cách:

− Các “Frame” chứa các trạng thái của các phương pháp

− Các toán hạng của mã bytecode

− Các tham số truyền cho phương pháp

− Các biến cục bộ

Trang 11

Khi JVM thực thi mã, một thanh ghi cục bộ có tên "Program Counter" được sủ dụng Thanh ghi này trỏ tới lệnh đang thực hiện Khi cần thiết, có thể thay đổi nội dung thanh ghi để đổi hướng thực thi của chương trình Trong trường hợp thông thường thì từng lệnh một nối tiếp nhau sẽ được thực thi.

Một khái niệm thông dụng khác trong Java là trình biên dịch "Just In JIT" Các trình duyệt thông dụng như Netscape hay IE đều có JIT bên trong để tăng tốc độ thực thi chương trình Java Mục đích chính của JIT là chuyển tập lệnh bytecode thành mã máy cụ thể cho từng loại CPU Các lệnh này sẽ được lưu trữ

Time-và sử dụng mỗi khi gọi đến

1.2 Cấu trúc Máy ảo Java

Cấu trúc một máy ảo Java bao gồm các thành phần:

Classloader: Là một hệ thống con của JVM được sử dụng để tải class file Runtime Data Area Java bao gồm:

Class (method) Area: Lưu trữ cấu trúc mỗi lớp, chẳng hạn như hằng,

trường, dữ liệu phương thức, code của phương thức, …

Trang 12

Heap: Nó là khu vực dữ liệu runtime mà trong đó đối tượng được cấp

phát

Stack: Stack trong Java lưu giữ các Frame Nó giữ các biến cục bộ và các

kết quả cục bộ, và thực hiện một phần nhiệm vụ trong phần triệu hồi và trả về phương thức Mỗi Thread có một Stack riêng, được tạo tại cùng thời điểm với Thread

Một Frame mới được tạo mỗi khi một phương thức được triệu hồi và bị hủy khi lời triệu hồi phương thức là kết thúc

Program Counter Register: Nó chứa địa chỉ của chỉ lệnh JVM hiện tại

đang được thực thi

Native Method Stack: Bao gồm tất cả các phương thức tự nhiện được sử

dụng trong ứng dụng

Execution Engine: Phần này bao gồm:

Một bộ xử lý ảo Virtual Processor

Một trình thông dịch Interpreter Đọc Bytecode Stream sau đó thực thi

các chỉ thị

Just-In-Time (JIT) Compiler: được sử dụng để cải thiện hiệu suất JIT

biên dịch các phần của Bytecode mà có cùng tính năng tại cùng một thời điểm, và

vì thế giảm lượng thời gian cần thiết để biên dịch Ở đây khái niệm Compiler là một bộ biên dịch tập chỉ thị của JVM thành tập chỉ thị của một CPU cụ thể

1.3 Bộ nhớ của JVM

1.3.1 Cấu trúc bộ nhớ JVM

Khi thực hiện cấp phát bộ nhớ, một đối tượng mới được tạo và đặt vào vùng nhớ Heap Khi ứng dụng của bạn không còn tham chiếu tới đối tượng này nữa thì Java garbage collector cho phép xóa đối tượng này đi để sử dụng lại vùng nhớ đó

Heap: JVM lưu tất cả đối tượng được tạo bởi toán tử “new” trong ứng

dụng Java, vào vùng nhớ Heap tại thời điểm chạy

Stack: Các phương thức và tham chiếu tới đối tượng địa phương được lưu

trữ trong Stack Mỗi Thread quản lý một stack Khi phương thức được gọi, nó

Trang 13

được đưa vào đỉnh của Stack Stack lưu trữ trạng thái của phương thức bao gồm: dòng code thực thi, tham chiếu tới đối tượng địa phương Khi phương thức chạy xong, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) được đẩy ra khỏi stack và tự động giải phóng.

Perm: Lưu trữ thông tin của Class được nạp vào và một vài tính năng khác

như StringPool (vùng nhớ của biến String) thường được tạo bởi phương thức String.interm() Khi ứng dụng của bạn chạy, Perm space được lấp đầy nhanh chóng

Ví dụ:

Dog dog = new Dog();

Heap: lưu đối tượng Dog khi ta “new Dog ();”

Stack: lưu tham chiếu “dog”

Perm: lưu thông tin về Class “Dog”

1.3.2 Quá trình cấp phát bộ nhớ JVM trong thực tế

Trong bài viết này, sử dụng phần mềm VMVisual kết nối tới máy ảo Java

để mô hình hóa quá trình chạy của JVM

Sử dụng một đoạn code debug để lấy Heap dump ở 2 trường hợp:

− Không hiện thực bất cứ kiểu dữ liệu hay đối tượng nào trong Java để chạy chương trình, thực hiện lệnh dừng (sleep) trong 100s để có thời gian Heap dump (1)

− Hiện thực đối tượng ArrayList với 1000 đối tượng chứa trong mảng, thực hiện lệnh dừng 100 giây để có thời gian Heap dump (2)

Sau khi tiến hành Heap Dump, ta nhận được kết quả như sau:

ArrayList arrayList = new ArrayList(1000); sleep(100000);

}

Trang 14

Bộ nhớ được cấp phát cho chương trình (1)

Bộ nhớ được cấp phát cho chương trình (2)

Dung lượng bộ nhớ cấp phát cho chương trình (2) cao hơn chương trình(1) cho dù số lớp là như nhau (465 class)

JVM cấp phát bộ nhớ theo class, dù không thực hiện nhiều phương thức, không cấp phát cho đối tượng nào đi nữa, thì những bước tiền xử lý, tiền thực thi cũng đã có cấp phát bộ nhớ trong JVM Tất cả các class trong Java đều được kế thừa từ class java.lang.Object nên dù không thực thi nhiều lệnh nhưng bên trong lớp Object đã có nhiều lệnh tiền xử lý, chính vì thế đã có nhiều vùng bộ nhớ được cấp phát sẵn

Cấp phát bộ nhớ theo Class:

Trang 15

Cấp phát bộ nhớ theo lớp trong chương trình (1)

Cấp phát bộ nhớ theo lớp trong chương trình (2)

Ở đây ta chỉ thấy với một đoạn chương trình đơn giản nhưng máy ảo Java

đã tiến hành cấp phát rất nhiều bộ nhớ cho các lớp mà không có trong đoạn mã

Trang 16

của người lập trình Tuy nhiên, việc này làm tăng hiệu suất của JIT Compiler

Chi tiết bộ nhớ được cấp phát cho đối tượng arrayList ở chương trình (2)

Trang 17

CHƯƠNG 2: PHƯƠNG PHÁP THỰC THI

2.1 Quản lý bộ nhớ và dọn rác (Garbage Collection)

Trong C, C++ hay Pascal người lập trình sử dụng phương pháp nguyên thủy để cấp phát và thu hồi bộ nhớ ở vùng “Heap” Heap là vùng bộ nhớ lớn được phân chia cho tất cả các Thread

Để quản lý Heap, bộ nhớ được theo dõi qua các danh sách sau:

− Danh sách các vùng nhớ rảnh chưa cấp phát

− Danh sách các vùng đã cấp

Khi có một yêu cầu về cấp phát bộ nhớ, hệ thống kiểm tra xem xét trong danh sách chưa cấp phát để lấy ra khối bộ nhớ đầu tiên có kích cỡ sát nhất Chiến thuật cấp phát này giảm tối thiểu việc phân mảnh của Heap

“Coalescing” là kỹ thuật khác cũng giảm thiểu việc phân mảnh của Heap bằng cách gom lại các vùng nhớ chưa dùng liền nhau Còn kỹ thuật sắp xếp lại các phần đã dùng để tạo vùng nhớ lớn hơn gọi là “Compaction”

Java sử dụng hai Heap riêng biệt cho cấp phát vùng nhớ tĩnh và vùng nhớ động Một Heap (Heap tĩnh) chứa các định nghĩa về lớp, các hằng và danh sách các phương pháp Heap còn lại (Heap động) được chia làm hai phần được cấp phát theo hai chiều ngược nhau Một bên chứa đối tượng còn bên kia chứa con trỏ trỏ đến đối tượng đó

“Handle” là cấu trúc bao gồm hai con trỏ Một trỏ đến bảng phương pháp của đối tượng, con trỏ thứ hai trỏ đến chính đối tượng đó Chú ý rằng khi

“compaction” cần cập nhập lại giá trị con trỏ của cấu trúc “Handle” Thuật toán dọn rác có thể áp dụng cho các đối tượng đặt trong Heap động Khi có yêu cầu về

bộ nhớ, trình quản lý Heap trước tiên kiểm tra danh sách bộ nhớ chưa cấp phát Nếu không tìm thấy khối bộ nhớ nào phù hợp (về kích cỡ) thì trình dọn rác sẽ được kịch hoạt khi hệ thống rảnh Nhưng khi đòi hỏi bộ nhớ cấp bách thì trình dọn rác sẽ được kích hoạt ngay

Ngày đăng: 17/05/2016, 21:22

HÌNH ẢNH LIÊN QUAN

Bảng mô tả các kiểu dữ liệu nguyên thủy như sau - Tìm hiểu máy ảo Java
Bảng m ô tả các kiểu dữ liệu nguyên thủy như sau (Trang 20)
Bảng mô tả các kiểu dữ liệu tham chiếu như sau - Tìm hiểu máy ảo Java
Bảng m ô tả các kiểu dữ liệu tham chiếu như sau (Trang 21)

TỪ KHÓA LIÊN QUAN

w