Java 我有多少内存';如果我';你会运行我的代码吗?
如果我运行此代码,将获得多大的内存Java 我有多少内存';如果我';你会运行我的代码吗?,java,jvm,Java,Jvm,如果我运行此代码,将获得多大的内存 List<Long> list = new LinkedList<>(); for (long i = 0; i < 4_000_000_000L; i++) { list.add(i); } List List=newlinkedlist(); 对于(长i=0;i
List<Long> list = new LinkedList<>();
for (long i = 0; i < 4_000_000_000L; i++) {
list.add(i);
}
List List=newlinkedlist();
对于(长i=0;i<4\u 000\u 000L;i++){
列表.添加(i);
}
8Gb?可以使用该工具回答此类问题。以下是测试代码:
import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.util.VMSupport;
import java.util.*;
public class JOLTest {
public static void main(String[] args) throws Exception {
List<Long> list = new LinkedList<>();
for (long i = 0; i < 4000L; i++) {
list.add(i);
if((i+1) % 1000 == 0) {
System.out.println("i = "+(i+1));
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
}
}
}
因此,实际上列表中有
(48*n+32)
字节用于n
元素,其中24*n
是Long
实例,24*n
是内部LinkedList$Node
实例,32
是LinkedList
本身。因此,您的问题的答案是192\u 000\u 000\u 032字节
。。。但该测试是针对小型(此类问题可以使用该工具回答。以下是测试代码:
import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.util.VMSupport;
import java.util.*;
public class JOLTest {
public static void main(String[] args) throws Exception {
List<Long> list = new LinkedList<>();
for (long i = 0; i < 4000L; i++) {
list.add(i);
if((i+1) % 1000 == 0) {
System.out.println("i = "+(i+1));
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
}
}
}
所以你实际上有了
(48*n+32)
为列表中的n
元素花费的字节,其中24*n
是Long
实例,24*n
是内部LinkedList$Node
实例,32
是LinkedList
本身。因此,您的问题的答案应该是192*000\u 032字节
…但此测试已执行对于较小的(),可以使用该工具回答此类问题。以下是测试代码:
import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.util.VMSupport;
import java.util.*;
public class JOLTest {
public static void main(String[] args) throws Exception {
List<Long> list = new LinkedList<>();
for (long i = 0; i < 4000L; i++) {
list.add(i);
if((i+1) % 1000 == 0) {
System.out.println("i = "+(i+1));
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
}
}
}
所以你实际上有了
(48*n+32)
为列表中的n
元素花费的字节,其中24*n
是Long
实例,24*n
是内部LinkedList$Node
实例,32
是LinkedList
本身。因此,您的问题的答案应该是192*000\u 032字节
…但此测试已执行对于较小的(),可以使用该工具回答此类问题。以下是测试代码:
import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.util.VMSupport;
import java.util.*;
public class JOLTest {
public static void main(String[] args) throws Exception {
List<Long> list = new LinkedList<>();
for (long i = 0; i < 4000L; i++) {
list.add(i);
if((i+1) % 1000 == 0) {
System.out.println("i = "+(i+1));
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
}
}
}
所以你实际上有了
(48*n+32)
为列表中的n
元素花费的字节,其中24*n
是Long
实例,24*n
是内部LinkedList$Node
实例,32
是LinkedList
本身。因此,您的问题的答案应该是192*000\u 032字节
…但此测试已执行小的(这个问题无法准确回答,其中也有一些错误。1.:8GB=2^33字节,而不是4 bn。2.:anint
是一个字或4字节长。3.:由于结构的原因,也会有一些开销。4.:虚拟机也会产生一些内存开销。long是64位或8字节,所以8*4000000000字节大致是假设的y、 显然,在我给JVM 12Gb内存(-Xmx12g
)之前,您将崩溃很久但是,如果它吃32G,那么它无论如何是不够的。这个问题无法准确回答,而且其中也有一些错误。1.:8GB=2^33字节,而不是4 bn。2.:anint
是一个单词或4字节长。3.:由于结构的原因,也会有一些开销。4.虚拟机也会产生一些内存开销。long是64位或8 b大概是8*4000000000字节。显然,在我给JVM 12Gb内存(-Xmx12g
)之前,你会崩溃很久但是,如果它吃32G,那么它无论如何是不够的。这个问题无法准确回答,而且其中也有一些错误。1.:8GB=2^33字节,而不是4 bn。2.:anint
是一个单词或4字节长。3.:由于结构的原因,也会有一些开销。4.虚拟机也会产生一些内存开销。long是64位或8 b大概是8*4000000000字节。显然,在我给JVM 12Gb内存(-Xmx12g
)之前,你会崩溃很久但是,如果它吃32G,那么它无论如何是不够的。这个问题无法准确回答,而且其中也有一些错误。1.:8GB=2^33字节,而不是4 bn。2.:anint
是一个单词或4字节长。3.:由于结构的原因,也会有一些开销。4.虚拟机也会产生一些内存开销。long是64位或8 b大概是8*4000000000字节。显然,在我给JVM 12Gb内存(-Xmx12g
)之前,你会崩溃很久但是,如果它吃32G,那么它无论如何都是不够的。好的。我用一个Long和Byte的列表尝试了它,并在其中放入了2个值。然后在解析这两个列表的实例时,我得到了java.util。LinkedList@347cdbdfootprint:COUNT AVG SUM DESCRIPTION 2 16 32 java.lang.Long 1 2424 java.util.LinkedList 2 24 48 java.util.LinkedList$Node 5 104(总计)
但我不明白是怎么回事。为什么字节分配的内存也是64字节?@hagrawal,似乎您尝试了32位JVM,对吧?请注意,Long/Byte/etc.是对象,而不是原语,所以您必须为对象标头(其中有指向类的指针,一些位用于支持同步等)花费一些空间。但是,您不必担心字节:只有256个不同的值,它们被缓存(请参见Byte.valueOf
implementation)。因此,您将不会有超过256个字节的对象(假设您不显式调用new Byte()
)很好。我尝试了一个Long和Byte的列表,并在其中放入了2个值。然后在解析这两个列表的实例时,我得到了java.util。LinkedList@347cdbdfootprint:COUNT AVG SUM DESCRIPTION 2 16 32 java.lang.Long 1 24 java.util.LinkedList 2 2448 java.util.LinkedList$Node 5 104(total)
但我不明白怎么做。为什么字节分配的内存也是64字节?@hagrawal,似乎您在32位JVM上尝试过,对吧?请注意,Long/Byte/等是对象,而不是原语,所以您必须为对象标头花费一些空间(它有指向类的指针、一些支持同步的位等)。不过,您不必担心字节:只有256个不同的值,它们是缓存的(请参阅)