根据我的理解,在循环中创建可变对象,就像下面的方法一样,会创建一堆对象,垃圾收集必须处理每个新对象。
for (int i=0; i<1000000000; i++){
Object obj = new Object();
}
与重用同一对象但不需要垃圾回收的方法相反。
Object obj;
for (int i=0; i<1000000000; i++){
obj = new Object();
}
但是当使用在实例化后无法更改的不可变对象时呢?无论如何,垃圾收集仍然必须在这些对象上运行,对吗?如果是这样,那么在这种情况下,这些方法中的任何一个在垃圾收集和性能方面都有所不同吗?
比如说对象是BigDecimal:
for (int i=0; i<1000000000; i++){
BigDecimal number = new BigDecimal(someValue);
}
VS
BigDecimal number;
for (int i=0; i<1000000000; i++){
number = new BigDecimal(someValue);
}
现在我们正在处理不可变对象,这两者有什么不同吗?...除了范围,我知道这两个例子的范围不同。谢谢!
答案 0 :(得分:1)
与重用同一对象但不需要垃圾回收的方法相反。
不,您描述的每个场景都会创建需要收集垃圾的对象。
现在我们正在处理不可变对象,这两者有什么不同吗?
没有。虽然VM可以缓存一些不可变对象,例如Integer
和void mygc() {
//int **max = (int **) 0xbfffffffUL; // the address of the top of the stack
unsigned long stack_bottom;
int **max = (int **) GC_init(); // get the address of the bottom of the stack
int* q;
int **p = &q; // the address of the bottom of the stack
while (p < max) {
//printf("0. p: %u, *p: %u max: %u\n",p,*p,max);
mark(*p);
p++;
}
//utilize sweep and coalesce (coalesce function already written)
}
void mark(int *p) {
int i;
int *ptr;
//code here
}
void sweep(int *ptr) {
// code here
}
int *isPtr(int *p) {
//return the pointer or NULL
int *ptr = start;
//code here
}
类型。