Java对象的实例大小在不同的JVM中是不同的

Jas*_* Hu 4 java size object instance

在这里,我发现了一个问题,即同一个类的实例的大小是不是在不同版本的JVM(它是相同的401.6.0_21241.6.0_31).尽管如此,代码是一样的.你以前遇到过类似的问题吗?或者你有什么建议吗?

JDK 1.6.0_21

# java -version 
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)

# java obj.ObjectSize &

# jps | grep ObjectSize
27251 ObjectSize

# jmap -histo 27251 | grep US_ASCII
 145:             1             40  sun.nio.cs.US_ASCII
Run Code Online (Sandbox Code Playgroud)

JDK 1.6.0_31

# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

# java obj.ObjectSize &

# jps | grep ObjectSize
26645 ObjectSize

# jmap -histo 26645 | grep US_ASCII
161:             1             24  sun.nio.cs.US_ASCII
Run Code Online (Sandbox Code Playgroud)

ObjectSize.java

package obj;
import java.util.concurrent.TimeUnit;
import sun.nio.cs.US_ASCII;

public class ObjectSize {

    public static void main(String[] args) {
        US_ASCII as = new US_ASCII();
        System.out.println(as);

        try {
            TimeUnit.MINUTES.sleep(5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

fgy*_*ica 5

我认为你遇到的只是一个源于编译编程语言如何工作的事实,特别是如果它们在VM中运行.

允许虚拟机实现的变化表现不同,例如生成不同大小的Java字节代码 - 只要它们保持相同的Java API.

内存使用的差异真的那么大吗?如果内存大小的增加实际上是一个问题,我敢说你一开始就有内存问题.

如果你使用一个虚拟机以50%的容量工作,而现在正在使用另一个虚拟机,我猜你需要对代码进行一些更深层次的更改.或者在问题上投入更多硬件.;)