2012-06-04 38 views
8

Đây là 64-bit Windows 7 Enterprise và 64-bit Java 7:Không thể chạy một JVM 64-bit trong 64-bit Windows 7 với một kích thước đống lớn

java version "1.7.0_04" 
Java(TM) SE Runtime Environment (build 1.7.0_04-b20) 
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) 

Điều này xảy ra bằng cách sử dụng vỏ của cả hai C:\Windows\SystemWOW64\cmd.exe (mà tôi đã nghĩ không chính xác là phiên bản 64 bit) với C:\Windows\System32\cmd.exe (mà tôi vừa phát hiện, lịch sự của Pulsar, là một ứng dụng 64 bit mặc dù tên đường dẫn).

Chương trình chính nó là tầm thường:

public class Trivial 
{ 
    public static void main(String[] args) { 
     System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory())); 
     System.out.println("max = " + toMB(Runtime.getRuntime().maxMemory())); 
    } 

    private static long toMB(long bytes) { 
     return bytes/(1024L * 1024L); 
    } 
} 

Tôi chỉ đùa giỡn với nhau -Xmx-Xms đối số để xem những gì sẽ xảy ra. Tôi sẽ có mặc dù điều đó với 64-bit Java trên Windows 64-bit tôi có thể sử dụng khá nhiều bất cứ kích thước tối đa và heap ban đầu tôi muốn, nhưng đó không phải là những gì đang xảy ra.

java -Xmx16G -Xms2G Trivial (ví dụ) hoạt động tốt. Tuy nhiên, java -Xmx16G -Xms4G Trivial mang lại cho tôi:

Error occurred during initialization of VM 
Could not reserve enough space for object heap 

kì quặc (với tôi), java -Xmx16G -Xms3G Trivial đưa ra một lỗi khác nhau:

Error occurred during initialization of VM 
Unable to allocate tables for parallel garbage collection for the requested heap size. 
Error: Could not create the Java Virtual Machine. 
Error: A fatal exception has occurred. Program will exit. 

Cố gắng chia phần chênh lệch giữa 2G3G để xem nếu có một kích thước cụ thể mà điều này xảy ra tôi đã thử java -Xmx16G -Xms2900M Trivial và nó hoạt động. Sau đó, tôi đã thử -Xms2960M và nó đã hoạt động. Với -Xms2970m JVM hỏng:

# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp 
# An error report file with more information is saved as: 
# C:\Users\QuantumMechanic\Temp\hs_err_pid10780.log 

Đó tiếp tục cho đến -Xms2995M khi nó chuyển trở lại "không thể phân bổ bảng cho thu gom rác thải song song" thông điệp và bị mắc kẹt với điều đó như -Xms được tăng thêm.

Điều gì có thể xảy ra? Không khởi chạy cái gì đó từ cmd.exe (thậm chí một cái 64 bit) áp đặt một số giới hạn kích thước quy trình? Windows (hoặc JVM) có yêu cầu một khối bộ nhớ lớn không? (Nhưng sau đó tại sao các thông điệp khác nhau)? Thứ gì khác?

Trả lời

3

Trong một hệ thống 64-bit, bạn có 2^63Bytes của người sử dụng địa chỉ gian, nhưng bạn có thể vẫn chỉ bản đồ dung lượng bộ nhớ thực tế bạn có (vật lý + tệp trang + tệp được ánh xạ).

Khi JVM tạo vùng heap, nó sử dụng C malloc() để yêu cầu một đoạn bộ nhớ ban đầu và sau đó nó sẽ tự quản lý đoạn bởi chính nó. Ngay cả khi bạn không có bất kỳ đối tượng nào trên heap, hệ điều hành vẫn được sử dụng.

Vì bạn đã chỉ định -Xms, đây là giá trị tối thiểu của bộ nhớ, JVM sẽ cố gắng yêu cầu số lượng bộ nhớ đó từ hệ điều hành hoặc không thành công vì nó không thể đáp ứng lệnh của bạn.

Tôi đoán nếu bạn muốn xem lợi thế của Java 64 bit. Có lẽ bạn có thể thử mở một tệp lớn hơn 4GB để truy cập ngẫu nhiên và ánh xạ nó vào một MappedByteBuffer.

+0

Giới hạn không gian hoán đổi có thể. Tôi đã không nghĩ về điều đó. Khi tôi trở lại làm việc vào ngày mai, tôi sẽ kiểm tra cài đặt kích thước trang trên máy tính đó và xem cài đặt của nó. – QuantumMechanic

+3

Nó ** là ** kích thước trao đổi. Thay vì được tự động quản lý, vì một số lý do, tệp trang trên máy tính tôi đang sử dụng được đặt thành kích thước không đổi là 4GB. RAM của máy tính là 8GB, vì vậy tốt nhất là có 12GB bộ nhớ ảo, và tất nhiên có một loạt các chương trình khác đang chạy. Khi tôi tăng kích thước tệp trang, tôi có thể có giá trị '-Xms' cao hơn nhiều. – QuantumMechanic

5

SysWoW64 đề cập đến 32bit Windows on Windows 64. Đơn giản: 32bit windows chạy trên windows 64bit).

Vì vậy, bạn đang yêu cầu một cách rõ ràng để chạy trong trình bao 32 bit cmd.

Xin xem:

http://en.wikipedia.org/wiki/WoW64

+0

Cảm ơn thông tin. Tôi không bao giờ biết rằng \ Windows \ System32' giữ các ứng dụng 64-bit. Tuy nhiên, đó không phải là vấn đề - điều tương tự cũng xảy ra khi tôi sử dụng 'C: \ Windows \ System32 \ cmd.exe'. – QuantumMechanic

Các vấn đề liên quan