java - Java中的内存分配和管理

标签 java memory-management

有人请澄清我下面的内容,以便更好地掌握java内存分配和管理。谢谢。

Q1) 以下 3 个代码片段之间的区别是什么:为什么存在三个不同的部分? (就内存分配的时候而言)

片段1:

Class C
{

StringBuffer sb = new StringBuffer();

C(){}

}

片段2:

Class C
{

StringBuffer sb;

C()
{
sb = new StringBuffer();
}

}

片段3:

Class C
{

C()
{
StringBuffer sb = new StringBuffer();
}

}

Q2)如何维护在没有任何引用变量的情况下创建的对象。 例如,new C(); new C().Hello(); 如何理解它们的内存管理、默认值、作用域!!

Q3) 以下 2 个片段之间的差异:

片段1

Class C
{
int a;
C(){}
}

片段2

Class C
{
C(){int a;}
}

最佳答案

Q1) 片段 1 和片段 2 是等价的。如果C 类有多个构造函数,就会出现差异。在片段 1 变体中,您只需编写一次初始化,在片段 2 变体中,您需要在每个构造函数中编写初始化。

在片段 3 中,变量 sb 是构造函数中的局部变量,并且仅在构造函数中可见。当构造函数结束时,StringBuffer 对象可以被垃圾回收。

Q2) 不会被维护,创建后会立即被垃圾回收。在 new C().Hello(); 的情况下,仅保证对象存在,直到 Hello() 方法退出。

Q3) 片段 1 声明类字段,片段 2 声明构造函数中的局部变量。

关于java - Java中的内存分配和管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726240/

相关文章:

c++ - 复合模式中的内存管理

java - 禁用父 pom 中所有子模块的 cobertura 测试的最佳方法

java - 如何注册和引用回调接口(interface)?

c - 返回 "local"堆分配对象可能导致内存泄漏

c++ - 当 vector 需要更多内存并分配内存时,指针会发生什么变化?

objective-c - 另一个 "Retain, then Release"问题

c - 在目录中列出文件名并将它们放入字符串中 - 段错误

java - 如何获取没有引用变量的套接字对象?

java - 将 double 值转换为十进制(分数)值 java

java - 带有 Hibernate 和 Spring 的通用 DAO,是不是比这更好的方法?