Avatar
1
Hihi Teacher
Hihi Teacher
Hỏi về quản lý bộ nhớ và đa luồng trong java
Hi mọi người, hiện tại kiến thức của em đa số là tự học nên còn nhiều điều thắc mắc mà ko biết hỏi ai nên em muốn hỏi mọi người.Mong mọi người giải đáp giúp em ạ.
  1. Khi tạo 1 mảng byte lớn (ví dụ đến vài MB,GB) thì bộ nhớ mà chương trình Java sẽ dùng để chứa mảng bye đó sẽ dựa vào gì ạ ? RAM hay máy ảo JVM.Có phải PC có RAM dung lượng càng to thì có thể phải tạo nhiều biến dung lượng lớn như vậy cùng 1 lúc ko ạ ?
  2.  Làm cách nào để tải file nặng trong Java(Em có tìm hiểu thì thấy trên mạng ngta hướng dẫn là dùng Resource của Spring có đúng ko ạ em thấy cách này Spring đã làm hết cho mình rồi nên em muốn hỏi thêm để có thể custom theo ý mình ạ)
  3.  Về đa luồng, đối với Spring Boot thì việc dùng đa luồng em thấy xử lí rất nhanh những tác vụ nặng (gửi mail,....) trong thực tế thì ngta có dùng đa luồng ko ạ ? Và quan trọng là ngta có giới hạn số luồng Thread Pool theo 1 con số cụ thể nào ko (Ví dụ mình dùng quá nhiều thread thì có vấn đề gì xảy ra ko ạ ?)

Cảm ơn mọi người ạ !

  • Answer
java
Remain: 5
1 Answer
Avatar
monkey Teacher
monkey Teacher
  1. Về lý thuyết thì em có thể tạo ra mảng byte với kích thước bao nhiêu tuỳ ý, nhưng trong thực tế sẽ chẳng bao giờ em tạo ra 1 mảng byte lên tới hàng MB cả. Việc cấp phát dữ liệu sẽ do hệ điều hành đảm nhiệm, JVM được viết bằng C/C++ nên nó cũng phải theo hệ điều hành. Mà việc cấp phát 1 mảng byte lớn là cực kỳ nặng nề bởi vì nó phải đi tìm kiếm các vùng nhớ còn trống sao cho đủ với kích thước em yêu cầu.

RAM dung lượng lớn hay bé đều như nhau cả em ạ, các mảng byte khởi tạo cần phải nhỏ thôi, nên dưới 100KB. Chính vì thế người ta mới sinh ra InputStream, OutputStream để đọc ghi từ từ đó em.

  1. File nặng có kích thước từ 30MB trở nên thì việc upload/download file là tương đối khó khăn, muốn đảm bảo rằng file sẽ upload/download thành công thì nên chia nhỏ file lớn ra rồi download các file nhỏ và ghép lại sau, đây chính là tư tưởng của giao thức hls. Và anh tin là spring chưa hỗ trợ việc này, bởi vì việc cắt nhỏ file cần phải có công cụ, có thể ffmpeg hoặc em tự code, nhưng spring thì chưa có đâu.

Nếu không muốn chia nhỏ file hoặc không thể chia nhỏ file thì em có thể sử dụng mô hình upload asyncdownload async, tuy nhiên em sẽ cần set timeout của request dài ra, có thể 2 tiếng. Tuy nhiên nếu client bị mất mạng giữa chừng thì họ sẽ phải tải lại toàn bộ từ đầu.

  1. Đa luồng không làm tăng tốc độ xử lý tác vụ nặng, mà đa luồng sẽ giúp em xử lý các tác vụ nặng đồng thời, hãy phân biệt rõ. Trong thực tế thì hầu như tất cả các chương trình đều là đa luồng, ví dụ luồng main để hiển thị UI, luồng I/O để xử lý I/O Async. Và tất nhiên phải giới hạn số luồng rồi, bởi vì mỗi 1 luồng sẽ chiếm 1 số lượng tài nguyên nhất định, ví dụ java là 2MB vậy thì càng nhiều luồng thì càng tốn bộ nhớ và thời gian switch context tăng lên, vậy nên 1 chương trình chỉ nên có 300 threads là đủ rồi.
  • 1
  • Reply
Cảm ơn anh rất nhiều !

Chúc anh luôn vui vẻ và có thật nhiều sức khỏe !

 –  Hihi 1653967126000