SystemLimitError — 시스템 한계에 도달했을 때의 예외

SystemLimitError — 시스템 한계에 도달했을 때의 예외

시스템 한계(system limit)에 도달했을 때 Elixir가 던지는 예외가 SystemLimitError예요. 예를 들어 너무 큰 아톰(atom)을 만들려고 하면 발생할 수 있어요.

출처: SystemLimitError — An exception raised when a system limit has been reached

본문

아톰은 VM 내부에서 한 번 만들어지면 메모리에서 해제되지 않기 때문에 크기에 상한이 있어요. 너무 큰 아톰을 만들려고 하면 다음과 같은 오류가 나와요.

iex> String.to_atom(String.duplicate("a", 100_000))
** (SystemLimitError) a system limit has been reached

위 예시에서 String.duplicate("a", 100_000)"a"를 10만 개 이어 붙인 문자열을 만들고, String.to_atom/1이 그 문자열을 아톰으로 만들려고 하는데, 이때 시스템 한계를 넘어서 발생한 거예요.

이 예외는 런타임에 문자열을 아톰으로 변환하는 것(String.to_atom/1)의 위험을 보여주는 대표적인 사례예요. 동적으로 들어오는(예: 사용자 입력) 문자열을 아톰으로 만들면 아톰 테이블이 계속 커지거나, 너무 큰 값이면 이 예외까지 발생할 수 있으니 주의해야 해요. 검증된 아톰이 필요한 경우가 아니라면 String.to_existing_atom/1처럼 이미 존재하는 아톰만 사용하는 쪽이 안전해요.

아톰 한계는 VM의 +t 인자로 늘릴 수 있지만, 일반적으로는 동적 데이터를 아톰으로 만들지 않는 것이 근본적인 해결책이에요. 특히 신뢰할 수 없는 외부 입력을 아톰으로 변환하는 코드는 시스템 자원을 고갈시킬 수 있는 위험이 있으니, 아톰이 정말 필요한지 다시 생각해 보는 게 좋아요. 이 예외는 SystemLimitError 구조체이며, 다른 시스템 자원(예: 프로세스 수, 포트 수) 한계에서도 비슷한 예외가 발생할 수 있어요.

더 알아보기

  • 관련 함수: String.to_atom/1, String.to_existing_atom/1
  • 관련 예외: System.EnvError (환경 변수 누락 예외)