工具的浸染域
Java工具不具备与主范例一样的存在时间。用new要害字建设一个Java工具的时候,它会超出浸染域的范畴之外。所以假使利用下面这段代码:
{
String s = new String("a string");
} /* 浸染域的终点 */
那么句柄s会在浸染域的终点处消失。然而,s指向的String工具依然占据着内存空间。在上面这段代码里,我们没有步伐会见工具,因为指向它的独一一个句柄已超出了浸染域的界线。在后头的章节里,各人还会继承进修如安在措施运行期间通报和复制工具句柄。
这样造成的功效即是:对付用new建设的工具,只要我们愿意,它们就会一直保存下去。这个编程问题在C和C++里出格突出。看来在C++里碰着的贫苦最大:由于不能从语言得到任何辅佐,所以在需要工具的时候,基础无法确定它们是否可用。并且更贫苦的是,在C++里,一旦事情完成,必需担保将工具排除。
这样便带来了一个有趣的问题。如果Java让工具依然故我,奈何才气防备它们大量充斥内存,并最终造成措施的“凝固”呢。在C++里,这个问题最令措施员头痛。但Java今后,环境却产生了更改。Java有一个出格的“垃圾收集器”,它会查找用new建设的所有工具,并分辨个中哪些不再被引用。随后,它会自动释放由那些闲置工具占据的内存,以便能由新工具利用。这意味着我们基础不必劳神内存的接纳问题。只需简朴地建设工具,一旦不再需要它们,它们就会自动拜别。这样做可防备在C++里很常见的一个编程问题:由于措施员健忘释放内存造成的“内存溢出”。