cuốn sách gpt4 ai đã làm

Điểm an toàn JVM tạm dừng, nhưng chỉ khi mã nằm bên trong phương thức và không liên quan đến GC

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:48:11 34 4
mua khóa gpt4 Nike

Cập nhật: Câu hỏi này ít nhất đã được thông qua -XX:+UseCountedLoopSafepoints Sự kết hợp của phiên bản JVM bằng hoặc cao hơn JDK 1.8.0_92 (đã thử nghiệm với _161) gần như giải quyết được vấn đề.

Bản gốc: Chứa mẫu chạy JDK 1.8.0, nhưng nó cũng xảy ra trên JDK 9.0.4.

Tôi đang xử lý một lỗi lạ dường như tự biểu hiện khi JVM dừng tất cả các luồng theo cách rất nhất quán với việc tạm dừng điểm an toàn. Các hoạt động của VM đôi khi được liệt kê là "các hoạt động không có VM". BẰNG -XX đầu ra tùy chọn và jvisualVM Như đã xác nhận, GC không liên quan đến sự chậm lại.

Tất cả đều nằm trong lớp 100 dòng bên dưới. Tôi đã dựa trên sự đơn giản boolean Đặt mã ghép nối đáng kể để hiển thị vấn đề. đang tìm kiếm MAKE_THE_JVM_PAUSE_UNEXPECTEDLY boolean.

Tôi đang tạo 5000x5000 boolean array và truy cập ngẫu nhiên 10 hàng đầu tiên ở cột 66. Mã thực tế gây ra vấn đề tương tự.

Bản thân thuật toán trong ví dụ này là vô nghĩa. đây chỉ là mộtcaoVí dụ ghép nối.

Các tùy chọn để chạy nó nằm trong phần bình luận tiêu đề.

đường dẫn trọn gói;

/**
* Chạy cái này với các tùy chọn java VM sau:
*
* -verbosegc
* -XX:+PrintGCApplicationStoppedTime
* -XX:+Thống kê PrintSafepoint
* -XX:PrintSafepointStatisticsCount=1
* -XX:+PrintGChi tiết
* -XX:+PerfDisableSharedMem
*/
lớp công cộng Conway
{
public static void main(String[] args)
{
//----------------------[THIM TIM]---------------------- -

Chủ đề mới(() ->
{
startTime dài = System.currentTimeMillis();
thời gian cuối cùng dài = thời gian bắt đầu;

cho (int count=0;; count++)
{
// Dấu thời gian....
lâu rồi = System.currentTimeMillis();
System.out.printf("%d-->Thời gian delta từ đầu[%dms], từ cuối[%dms]\n",
đếm, bây giờ-thời gian bắt đầu, bây giờ-thời gian cuối cùng);
System.out.flush();
Lần cuối cùng = bây giờ;

// Lãng phí thời gian mà không ngủ...
for (bắt đầu dài = System.currentTimeMillis();
System.currentTimeMillis() - bắt đầu < 200;);
}
}).bắt đầu();

//--------------[PHẦN TÍNH]------------- -

một = boolean mới[5000][5000];

boolean MAKE_THE_JVM_PAUSE_UNEXPECTEDLY = đúng;

vì (;;)
{
nếu (MAKE_THE_JVM_PAUSE_UNEXPECTEDLY)
{
/**
* CUỘC GỌI quét() sẽ khiến tất cả các chủ đề tạm dừng theo định kỳ...
*/
quét();
}
khác
{
/**
* NÀY CHẠY TUYỆT VỜI. Nội dung giống hệt như trong scanner() bên dưới...
*/
cho (int y=0; y<5000; y++)
{
cho (int x=0; x<5000; x++)
{
int Living=0;
vì (int yy=y-1; yy <= y+1; yy++)
cho (int xx=x-1; xx <= x+1; xx++)
{
if (một[randomInt(0, 10)][66])
sống++;
}
} // cho(x...)

} // cho(y...)
}
} // vì(;;)
}

quét khoảng trống tĩnh công cộng()
{
cho (int y=0; y<5000; y++)
{
cho (int x=0; x<5000; x++)
{
int Living=0;
vì (int yy=y-1; yy <= y+1; yy++)
cho (int xx=x-1; xx <= x+1; xx++)
{
if (một[randomInt(0,10)][66])
sống++;
}
} // cho(x...)

} // cho(y...)
}

public static int RandomInt(int đầu tiên, int cuối cùng)
{
return (int)(((last-first+1)*Math.random())+first);
}

boolean tĩnh công khai[][] một;
}

bây giờ khi tôi MAKE_THE_JVM_PAUSE_UNEXPECTEDLY boolean 设置为 ĐÚNG VẬY Nó gây ra sự chậm lại kỳ lạ khi chạy thứ này.

Lưu ý rằng vấn đề xảy ra đầu tiên giữa nhịp tim 49 và 50. Nhịp tim xuất phát từ luồng đầu tiên (bắt đầu ẩn danh) trong mã, bản thân thuật toán sử dụng luồng lớp chính và xác định luồng này bằng một dòng tương tự như:

11-->Thời gian delta từ lúc bắt đầu[2210ms], từ lần cuối[200ms]

Tôi đã tự mình kết thúc cuộc chạy.

[GC (Lỗi phân bổ) [PSYoungGen: 512K->384K(1024K)] 512K->384K(523776K), 0,0004807 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây] 
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0,053: ParallelGFailedAllocation [ 5 0 0 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0005755 giây
[GC (Lỗi phân bổ) [PSYoungGen: 896K->480K(1024K)] 896K->488K(523776K), 0,0003818 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0,063: ParallelGFailedAllocation [ 5 0 0 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0004564 giây
[GC (Lỗi phân bổ) [PSYoungGen: 992K->496K(1024K)] 1000K->536K(523776K), 0,0004566 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0,072: ParallelGFailedAllocation [ 10 1 1 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0007704 giây
[GC (Lỗi phân bổ) [PSYoungGen: 1008K->480K(1536K)] 1048K->660K(524288K), 0,0009025 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0,082: ParallelGFailedAllocation [ 10 0 0 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0009905 giây
[GC (Lỗi phân bổ) [PSYoungGen: 1499K->499K(1536K)] 1679K->1006K(524288K), 0,0006638 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.102: ParallelGFailedAllocation [ 11 1 1 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0009292 giây
[GC (Lỗi phân bổ) [PSYoungGen: 1518K->992K(2560K)] 2025K->2018K(525312K), 0,0007172 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.103: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 0 0 0 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0007980 giây
[GC (Lỗi phân bổ) [PSYoungGen: 2526K->1507K(3072K)] 3552K->3515K(525824K), 0,0009654 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.107: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 0 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0010672 giây
[GC (Lỗi phân bổ) [PSYoungGen: 3041K->2547K(5120K)] 5049K->5128K(527872K), 0,0010321 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.108: ParallelGFailedAllocation [ 11 0 2 ] [ 0 0 0 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0011153 giây
[GC (Lỗi phân bổ) [PSYoungGen: 5102K->3072K(5632K)] 7684K->7718K(528384K), 0,0012587 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.109: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 0 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0013348 giây
[GC (Lỗi phân bổ) [PSYoungGen: 5630K->4608K(7680K)] 10276K->10382K(530432K), 0,0016113 giây] [Thời gian: người dùng=0,03 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.111: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 0 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0016921 giây
0-->Thời gian delta từ lúc bắt đầu[0ms], từ lần cuối[0ms]
[GC (Lỗi phân bổ) [PSYoungGen: 7678K->3328K(8704K)] 13452K->13341K(531456K), 0,0013899 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.113: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 1 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0024590 giây
[GC (Lỗi phân bổ) [PSYoungGen: 6399K->3360K(11264K)] 16412K->16419K(534016K), 0,0011903 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.115: ParallelGFailedAllocation [ 11 1 2 ] [ 0 0 0 0 1 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0013046 giây
[GC (Lỗi phân bổ) [PSYoungGen: 8477K->5536K(11264K)] 21537K->21642K(534016K), 0,0020710 giây] [Thời gian: người dùng=0,00 sys=0,00, real=0,00 giây]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
0.117: ParallelGFailedAllocation [ 11 0 1 ] [ 0 0 0 0 2 ] 0
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0021520 giây
1-->Thời gian delta từ lúc bắt đầu[210ms], từ lần cuối[210ms]
2-->Thời gian delta từ lúc bắt đầu[410ms], từ lần cuối[200ms]
3-->Thời gian delta từ lúc bắt đầu[610ms], từ lần cuối[200ms]
4->Thời gian delta từ lúc bắt đầu [810 mili giây], từ lần cuối [200 mili giây]
5-->Thời gian delta từ lúc bắt đầu[1010ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
1.119: không hoạt động vm [ 11 2 2 ] [ 0 0 0 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0001547 giây
6-->Thời gian delta từ lúc bắt đầu[1210ms], từ lần cuối[200ms]
7-->Thời gian delta từ lúc bắt đầu[1410ms], từ lần cuối[200ms]
8-->Thời gian delta từ lúc bắt đầu[1610ms], từ lần cuối[200ms]
9-->Thời gian delta từ lúc bắt đầu[1810ms], từ lần cuối[200ms]
10-->Thời gian delta từ lúc bắt đầu[2010ms], từ lần cuối[200ms]
11-->Thời gian delta từ lúc bắt đầu[2210ms], từ lần cuối[200ms]
12-->Thời gian delta từ lúc bắt đầu[2410ms], từ lần cuối[200ms]
13-->Thời gian delta từ lúc bắt đầu[2610ms], từ lần cuối[200ms]
14-->Thời gian delta từ lúc bắt đầu[2810ms], từ lần cuối[200ms]
15-->Thời gian delta từ lúc bắt đầu[3010ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
3.120: không hoạt động vm [ 11 2 2 ] [ 0 0 0 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0000670 giây
16-->Thời gian delta từ lúc bắt đầu[3210ms], từ lần cuối[200ms]
17-->Thời gian delta từ lúc bắt đầu[3410ms], từ lần cuối[200ms]
18-->Thời gian delta từ lúc bắt đầu[3610ms], từ lần cuối[200ms]
19-->Thời gian delta từ lúc bắt đầu[3810ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
4.084: EnableBiasedLocking [ 11 2 2 ] [ 0 0 0 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0000737 giây
20-->Thời gian delta từ lúc bắt đầu[4010ms], từ lần cuối[200ms]
21-->Thời gian delta từ lúc bắt đầu[4210ms], từ lần cuối[200ms]
22-->Thời gian delta từ lúc bắt đầu[4410ms], từ lần cuối[200ms]
23-->Thời gian delta từ lúc bắt đầu[4610ms], từ lần cuối[200ms]
24-->Thời gian delta từ lúc bắt đầu[4810ms], từ lần cuối[200ms]
25-->Thời gian delta từ lúc bắt đầu[5010ms], từ lần cuối[200ms]
26-->Thời gian delta từ lúc bắt đầu[5210ms], từ lần cuối[200ms]
27-->Thời gian delta từ lúc bắt đầu[5410ms], từ lần cuối[200ms]
28-->Thời gian delta từ lúc bắt đầu[5610ms], từ lần cuối[200ms]
29-->Thời gian delta từ lúc bắt đầu[5810ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
6.084: không có hoạt động vm [ 11 2 2 ] [ 0 0 0 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0000621 giây
30-->Thời gian delta từ lúc bắt đầu[6010ms], từ lần cuối[200ms]
31-->Thời gian delta từ lúc bắt đầu[6210ms], từ lần cuối[200ms]
32-->Thời gian delta từ lúc bắt đầu[6410ms], từ lần cuối[200ms]
33-->Thời gian delta từ lúc bắt đầu[6610ms], từ lần cuối[200ms]
34-->Thời gian delta từ lúc bắt đầu[6810ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
7.085: không có hoạt động vm [ 11 2 2 ] [ 0 0 0 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 0,0000605 giây
35-->Thời gian delta từ lúc bắt đầu[7010ms], từ lần cuối[200ms]
36-->Thời gian delta từ lúc bắt đầu[7210ms], từ lần cuối[200ms]
37-->Thời gian delta từ lúc bắt đầu[7410ms], từ lần cuối[200ms]
38-->Thời gian delta từ lúc bắt đầu[7610ms], từ lần cuối[200ms]
39-->Thời gian delta từ lúc bắt đầu[7810ms], từ lần cuối[200ms]
40-->Thời gian delta từ lúc bắt đầu[8010ms], từ lần cuối[200ms]
41-->Thời gian delta từ lúc bắt đầu[8210ms], từ lần cuối[200ms]
42-->Thời gian delta từ lúc bắt đầu[8410ms], từ lần cuối[200ms]
43-->Thời gian delta từ lúc bắt đầu[8610ms], từ lần cuối[200ms]
44-->Thời gian delta từ lúc bắt đầu[8810ms], từ lần cuối[200ms]
45-->Thời gian delta từ lúc bắt đầu[9010ms], từ lần cuối[200ms]
46-->Thời gian delta từ lúc bắt đầu[9210ms], từ lần cuối[200ms]
47-->Thời gian delta từ lúc bắt đầu[9410ms], từ lần cuối[200ms]
48-->Thời gian delta từ lúc bắt đầu[9610ms], từ lần cuối[200ms]
49-->Thời gian delta từ lúc bắt đầu[9810ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
10.087: không hoạt động vm [ 11 2 2 ] [ 3009 0 3009 0 0 ] 2
Tổng thời gian mà các luồng ứng dụng bị dừng: 3,0091028 giây
50-->Thời gian delta từ đầu [12994 mili giây], từ cuối [3184 mili giây]
51-->Thời gian delta từ lúc bắt đầu[13194ms], từ lần cuối[200ms]
52-->Thời gian delta từ lúc bắt đầu[13394ms], từ lần cuối[200ms]
53-->Thời gian delta từ lúc bắt đầu[13594ms], từ lần cuối[200ms]
54-->Thời gian delta từ lúc bắt đầu[13794ms], từ lần cuối[200ms]
55-->Thời gian delta từ lúc bắt đầu[13994ms], từ lần cuối[200ms]
56-->Thời gian delta từ lúc bắt đầu[14194ms], từ lần cuối[200ms]
57-->Thời gian delta từ lúc bắt đầu[14394ms], từ lần cuối[200ms]
58-->Thời gian delta từ lúc bắt đầu[14594ms], từ lần cuối[200ms]
59-->Thời gian delta từ lúc bắt đầu[14794ms], từ lần cuối[200ms]
60-->Thời gian delta từ lúc bắt đầu[14994ms], từ lần cuối[200ms]
61-->Thời gian delta từ lúc bắt đầu[15194ms], từ lần cuối[200ms]
62-->Thời gian delta từ lúc bắt đầu[15394ms], từ lần cuối[200ms]
63-->Thời gian delta từ lúc bắt đầu[15594ms], từ lần cuối[200ms]
64-->Thời gian delta từ lúc bắt đầu[15794ms], từ lần cuối[200ms]
65-->Thời gian delta từ lúc bắt đầu[15994ms], từ lần cuối[200ms]
vmop [chủ đề: tổng số ban đầu_running wait_to_block] [thời gian: dọn dẹp đồng bộ hóa khối quay vmop] page_trap_count
16.098: không hoạt động vm [ 11 2 2 ] [ 1221 0 1221 0 0 ] 2
Tổng thời gian các luồng ứng dụng bị dừng: 1,2213130 ​​​​giây
66-->Thời gian delta từ lúc bắt đầu[17217ms], từ lần cuối[1223ms]
67-->Thời gian delta từ lúc bắt đầu[17417ms], từ lần cuối[200ms]
68-->Thời gian delta từ lúc bắt đầu[17617ms], từ lần cuối[200ms]
69-->Thời gian delta từ lúc bắt đầu[17817ms], từ lần cuối[200ms]
70-->Thời gian delta từ lúc bắt đầu[18017ms], từ lần cuối[200ms]
71-->Thời gian delta từ lúc bắt đầu[18217ms], từ lần cuối[200ms]
72-->Thời gian delta từ lúc bắt đầu[18417ms], từ lần cuối[200ms]
73-->Thời gian delta từ lúc bắt đầu[18617ms], từ lần cuối[200ms]
74-->Thời gian delta từ lúc bắt đầu[18817ms], từ lần cuối[200ms]
75-->Thời gian delta từ lúc bắt đầu[19017ms], từ lần cuối[200ms]
76-->Thời gian delta từ lúc bắt đầu[19217ms], từ lần cuối[200ms]
77-->Thời gian delta từ lúc bắt đầu[19417ms], từ lần cuối[200ms]
78-->Thời gian delta từ lúc bắt đầu[19617ms], từ lần cuối[200ms]
79-->Thời gian delta từ lúc bắt đầu[19817ms], từ lần cuối[200ms]
80-->Thời gian delta từ lúc bắt đầu[20017ms], từ lần cuối[200ms]

Quá trình kết thúc với mã thoát 1

bây giờ khi tôi MAKE_THE_JVM_PAUSE_UNEXPECTEDLY boolean 设置为 SAI Khi chạy thứ này, nó không gây ra bất kỳ sự chậm lại nào ở điểm an toàn.

Tại sao việc đặt mã này vào một phương thức lại gây ra điều này?

câu trả lời hay nhất

Vì điểm an toàn xảy ra xấp xỉ một lần mỗi giây nên có thể Khoảng thời gian được đảm bảoSafepoint đang hoạt động, tức là nó được kích hoạt bởi bộ đếm thời gian.

Tôi chưa kiểm tra mã của bạn, nhưng một khi nó được kích hoạt, rất có thể sẽ mất nhiều thời gian để đạt đến điểm an toàn, vì có một sự tối ưu hóa giúp loại bỏ việc thăm dò điểm an toàn trong các vòng lặp mà JIT biết sẽ mất một khoảng thời gian giới hạn. Chấm dứt hoặc gọi các phương thức khác sẽ thăm dò điểm an toàn trong cơ thể của họ. Vấn đề là đối với các vòng lặp tính toán thuần túy sử dụng nhiều CPU, "thời gian hữu hạn" vẫn có thể lớn, gây ra tình trạng dừng điểm an toàn. Trong Java 8 và 9, điều này có thể được thực hiện thông qua -XX:+UseCountedLoopSafepoints Bị vô hiệu hóa với hình phạt hiệu suất nhẹ. Java 10 sẽ giới thiệu các tính năng tối ưu hóa cho các vòng lặp hữu hạn và thăm dò ý kiến ​​​​mỗi vòng lặp (JDK-8186027) để đạt được sự cân bằng giữa độ trễ điểm an toàn.

Về việc tạm dừng điểm an toàn java - JVM, nhưng chỉ khi mã nằm trong một phương thức chứ không liên quan đến GC, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/48627532/

34 4 0
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