프로그램 전역에서 사용되기 때문에 모든 스레드에서 static필드를 공유하게 됩니다. 이때 한 스레드에서 값을 변경할 경우 다른 모든 스레드에서 영향을 받을 수 있다.
-> 동시성 문제를 야기함
전역적으로 관리되기 때문에 기본적으로 thread safety하지 않으며, synchronize를 사용하여 이를 보장하기 위해서는 추가적인 작업이 필요합니다.
static 멤버는 프로그램이 종료될 때까지 GC로 회수되지 않기 때문에, 많은 수의 static 필드나 메서드가 존재할 경우 메모리에 영향을 미칠 수 있다.
static필드에 데이터가 계속해서 쌓이게 되면 OutOfMemory가 발생할 수 도 있다.
객체 직렬화는 인스턴스에 대해 적용되기 때문에 클래스 자체 정보인 static 멤버는 여기에 포함되지 않습니다.
예를 들어 자주 사용하지만 절대 변하지 않는 변수, 즉 상수의 경우에는 관례적으로 final static을 사용하여 선언합니다. 이 경우 적어도 1바이트 이상의 GC 대상 객체가 사라지게 됩니다. GC가 애초에 대상으로 인식하지 않기 때문에 성능 향상에 도움을 줄 수 있습니다.
다만 단순히 편리하다는 이유로 잘못 사용하게 되면 의도한 바와 달리 예상하지 못한 문제를 야기할 수도 있습니다.