2012-04-26 6 views
4

일단 String 개체가 생성되면 수정할 수 없습니다. 그러나 작업을 수행하면 JVM에서 새 개체를 만듭니다. 여기에 새로운 객체를 생성하면 JVM이 더 많은 메모리를 소비합니다. 그럼 내가 메모리 문제를 일으키는 것 같아요.?문자열 불변의 문제 문제

+1

무언가를 변경할 수있게하려면 대신 StringBuilder를 사용할 수 있습니다. –

답변

3

당신은 정확합니다. 이 문제는 에 대해 알고있을 가치가 있습니다 (매번 영향을 미치지 않더라도).

당신이 말했듯이, 문자열은 생성 후 변경할 수 없습니다. 문자열은 변경할 수 없으며 변경할 수있는 방법이 많지 않습니다.

그러나, 이러한 분할()와 같은 작업은 백그라운드에서 추가 문자열 객체를 생성되며, 당신이 그들을에 대한 참조로 유지하는 경우 그 문자열의 각각 memory overhead 있습니다.

다른 포스터는 개체가 작고 가비지 수집은 일반적으로 범위를 벗어난 후 오래된 개체를 정리하므로 일반적으로 걱정할 필요가 없습니다.

그러나 특정 작업을 수행하고 대량의 문자열 참조를 보유하면이 문제가 발생할 수 있습니다.

사용 사례에 따라 interning 문자열을 살펴보고 링크 된 페이지의 경고를 주목하십시오.

두 가지 참고 사항 :

1) 하드 코딩 된 문자열 리터럴이의 영향을 감소 자바에 의해 automatically interned 될 것입니다.

2) + 연산자는이 점에서 더 효율적입니다, 그것은 성능 & 메모리 혜택을 제공 아래 문자열 빌더를 사용합니다.

2

아니요. String 인스턴스에 대한 강력한 링크가없는 경우에는 결국 가비지 수집기에서 수집합니다. 예를 들어

: 생성 된 인스턴스가 쓰레기가 될 당신이 지속적으로 새로운 객체의 인스턴스를 생성이 조각에서

while (true) { 
    new String("that is a string"); 
} 

는, 그러나 당신이 OutOfMemoryException이 얻을하지 않습니다 (분명히 더 강력한 링크가 없습니다).

+0

이것은 (a) 문자열이'new String'을 사용하여 거의 만들어지지 않기 때문에 좋은 예가 아닙니다. (b) OP와 같이 문자열을 수정하지 않습니다. – dogbane

+0

@dogbane,'new String()'으로 생성 된 String 인스턴스와 수정 후에 내부적으로 생성 된 String 인스턴스 사이에 어떤 건설적인 차이점이 있습니까? –

+0

게다가이 예에서는 자바 것 자동으로 인턴 문자열 리터럴이 아니 대표적인 예 그래서 - http://stackoverflow.com/questions/1855170/when-should-we-use-intern-method-of-string –

0

생성되는 문제는 가비지가 생성된다는 것입니다. 이 문제는 가비지 수집기를 호출하여 가비지에서 사용하는 메모리를 비우는 것으로 가상 컴퓨터가 해결합니다.

1

새로운 개체에 더 많은 메모리를 사용합니다. 그러나 가비지 컬렉터는 모든 액세스 할 수없는 메모리를 즉시 회수하기 때문에 그 자체로는 문제가 발생하지 않습니다. 물론 새로 생성 된 문자열에 대한 링크를 생성하여 문제가 될 수 있지만 JVM이 아니라 프로그램의 문제 일 수 있습니다.

0

이전 개체를 더 이상 사용하지 않는 즉시 가비지 수집기에서 제거 할 수 있습니다. (어떤 메모리 문제가 발생하기 훨씬 전에 완료됩니다).

데이터 복사를 방지하려면 StringBuilder를 사용하십시오.

0

사용하지 않은 개체는 GC로 수집됩니다.

및 Immutability는 Java에서 많은 이점을 얻었습니다.

자바에서는 가능한 한 많은 불변성을 달성하는 것이 좋습니다.

이들은 Collections 프레임 워크에서도 안전하게 사용할 수 있습니다.

Check this

+0

너무 광범위하게 일반화하고 있습니다. 불변성은 일부 장소에서 유용하지만 다른 장소에서는 유용합니다. 내가 합의한 – Torben

+0

나는 당신이 모든 곳에서 불변성을 사용해야한다고 말한 적이 없다. 나는 단지 많은 이익을 얻었고 Collections.Dven에서 사용할 수 있다고 말했다. Joshua bloch는 Effective java –

1

당신이 거대한 문자열의 작은 문자열을 복용에 대해 알아야 할 가장 큰 메모리 문제. 해당 부분 문자열은 원래 문자열의 char 배열을 공유하며 원래 문자열이 gc'd가 되더라도 거대한 char 배열은 여전히 ​​부분 문자열에 의해 참조됩니다. 해결 방법은 new String(hugeString.substring(i))을 사용하는 것입니다.

0

는 지금까지 내가 (스레드 안전 또는 StringBuffer를) 의 StringBuilder 알고있는 문자열을 관리하고 그들을 변경할 수 있도록하는 데 유용합니다.

메모리에 바이트를 '먹는'하지 않는 거대한 문자열의 일부 문자를 조작 할 수 있습니다.

그것은 또한 concate를위한 더 강력한/속도입니다.

0

문자열 인스턴스가 변경 불가능하기 때문에 jvm에서 재사용 할 수 있습니다. String 클래스는 메모리 문제를 피하기 위해 사용되는 Flyweight Design Pattern을 사용하여 구현됩니다.