OutOfMemoryError : Requested array size exceeds VM limit JAVA SE

https://plumbr.io/outofmemoryerror/requested-array-size-exceeds-vm-limit

java.lang.OutOfMemoryError:Requested array size exceeds VM limit

Java has got a limit on the maximum array size your program can allocate. The exact limit is platform-specific but is generally somewhere between 1 and 2.1 billion elements.

outofmemoryerror

When you face the java.lang.OutOfMemoryError: Requested array size exceeds VM limit, this means that the application that crashes with the error is trying to allocate an array larger than the Java Virtual Machine can support.

What is causing it?

The error is thrown by the native code within the JVM. It happens before allocating memory for an array when the JVM performs a platform-specific check: whether the allocated data structure is addressable in this platform. This error is less common than you might initially think.

The reason you only seldom face this error is that Java arrays are indexed by int. The maximum positive int in Java is 2^31 – 1 = 2,147,483,647. And the platform-specific limits can be really close to this number – for example on my 64bit MB Pro on Java 1.7 I can happily initialize arrays with up to 2,147,483,645 or Integer.MAX_VALUE-2elements.

Increasing the length of the array by one to Integer.MAX_VALUE-1 results in the familiar OutOfMemoryError:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

But the limit might not be that high – on 32-bit Linux with OpenJDK 6, you will hit the “java.lang.OutOfMemoryError: Requested array size exceeds VM limit” already when allocating an array with ~1.1 billion elements. To understand the limits of your specific environments run the small test program described in the next chapter.

Give me an example

When trying to recreate the java.lang.OutOfMemoryError: Requested array size exceeds VM limit error, let’s look at the following code:

for (int i = 3; i >= 0; i--) {	try {		int[] arr = new int[Integer.MAX_VALUE-i];		System.out.format("Successfully initialized an array with %,d elements.\n", Integer.MAX_VALUE-i);	} catch (Throwable t) {		t.printStackTrace();	}}

The example iterates four times and initializes an array of long primitives on each turn. The size of the array this program is trying to initialize grows by one with every iteration and finally reaches Integer.MAX_VALUE. Now, when launching the code snippet on 64-bit Mac OS X with Hotspot 7, you should get the output similar to the following:

java.lang.OutOfMemoryError: Java heap space	at eu.plumbr.demo.ArraySize.main(ArraySize.java:8)java.lang.OutOfMemoryError: Java heap space	at eu.plumbr.demo.ArraySize.main(ArraySize.java:8)java.lang.OutOfMemoryError: Requested array size exceeds VM limit	at eu.plumbr.demo.ArraySize.main(ArraySize.java:8)java.lang.OutOfMemoryError: Requested array size exceeds VM limit	at eu.plumbr.demo.ArraySize.main(ArraySize.java:8)

Note that before facing java.lang.OutOfMemoryError: Requested array size exceeds VM limit on the last two attempts, the allocations failed with a lot more familiar java.lang.OutOfMemoryError: Java heap space message. It happens because the 2^31-1 int primitives you are trying to make room for require 8G of memory which is less than the defaults used by the JVM.

This example also demonstrates why the error is so rare – in order to see the VM limit on array size being hit, you need to allocate an array with the size right in between the platform limit and Integer.MAX_INT. When our example is run on 64bit Mac OS X with Hotspot 7, there are only two such array lengths: Integer.MAX_INT-1 and Integer.MAX_INT.

What is the solution?

The java.lang.OutOfMemoryError: Requested array size exceeds VM limit can appear as a result of either of the following situations:

  • Your arrays grow too big and end up having a size between the platform limit and the Integer.MAX_INT
  • You deliberately try to allocate arrays larger than 2^31-1 elements to experiment with the limits.

In the first case, check your code base to see whether you really need arrays that large. Maybe you could reduce the size of the arrays and be done with it. Or divide the array into smaller bulks and load the data you need to work with in batches fitting into your platform limit.

In the second case – remember that Java arrays are indexed by int. So you cannot go beyond 2^31-1 elements in your arrays when using the standard data structures within the platform. In fact, in this case you are already blocked by the compiler announcing “error: integer number too large” during compilation.

But if you really work with truly large data sets, you need to rethink your options. You can load the data you need to work with in smaller batches and still use standard Java tools, or you might go beyond the standard utilities. One way to achieve this is to look into the sun.misc.Unsafe class. This allows you to allocate memory directly like you would in C.


[그것이 R고 싶다] 도서 리뷰 기타

8월초 찌는 더위를 피하고 지식 습득(?) 이라는 핑계를 대고 교보문고에 갔다가

제목이 재미 있는 신간 하나를 발견, 바로 [그것이 R고 싶다], 유명 고발 프로그램 방송의 타이틀을 패러디한 센스에서 

일단 한표를 준다.


안그래도 최근 R 관련 서적을 두권 정도 보고 있었던지라 관심이 가서 일단 빨리 훑어본 후에 리뷰를 정리한다.

도서의 상세 정보는 아래 링크를 참고


PART 1은 본론을 위한 서론(?)과 설치에 관한 내용이라 빨리 넘어 갔다.

단, 2.1.2 MRO 설치하기는 주목할 필요가 있었다. 

다른 출판사의 R 서적에서는 언급이 없었던 MS 버전이고 멀티 쓰레드를 지원한다고 하니 성능 향상을 원하는 분들은 참고하시길.

PART 2, 3는 R의 기본 문법과 함수, 실전 데이터 분석을 다루는데 이미 다른 서적에서 봤던 내용들이 대부분이라 빠르게 넘어갔다.

약간 아쉬운 점은(개인적인 느낌인지 모르겠지만) 분량의 한계로 인해 설명이 좀 부족해보인다.

PART 4, 이 부분이 제일 괜찮았던 내용이다. 다른 책에서는 다루지 않은 아마존 클라우드를 이용하는 법과,

R 마크다운, shiny 에 대한 내용이 있다. 이부분 역시 분량이 많지 않은 관계로 맛보기만.

결론은 적당한 분량에 R을 처음 사용하는 독자에게는 괜찮을듯 하고, 분량의 한계는 어쩔 수 없으므로 필요하다면 다른 서적을 참고하자.

그리고 요즘 한빛미디어에서 출판되는 많은 책들이 컬러 인쇄로 나오는 것으로 보이며, 

이 책도 챠트나 그림 많이 나오는데 컬러 인쇄로 인한 가독성이 좋아 만족스러웠다.


Hortonworks Data Platform 3.0 NoSQL/Big Data/DB


influxdb vs mysql NoSQL/Big Data/DB



influxDB는 mysql과 같지만, 좀 다르다.

- database 그대로 사용

- measurement : mysql의 테이블과 같은 개념

- tag : indexed column

- field : not indexed column



데이터 보관 주기 설정은 아래처럼, SQL 과 거의 같아서 사용하기 편함

CREATE RETENTION POLICY oneweek ON telegraf DURATION 7d REPLICATION 1

ALTER RETENTION POLICY oneweek ON telegraf DEFAULT

Grafana로 라즈베리파이 모니터링하기 라즈베리 파이

https://brunch.co.kr/@sunghyunlim/27

...

반드시 업데이트와 인스톨 해야( sudo apt-get update && sudo apt-get install telegraf ), 인스톨만 하면 안된다.

Preparing to unpack .../telegraf_1.7.1-1_armhf.deb ...
Unpacking telegraf (1.7.1-1) ...
telegraf (1.7.1-1) 설정하는 중입니다 ...
Created symlink /etc/systemd/system/multi-user.target.wants/telegraf.service → /lib/systemd/system/telegraf.service.

Installing InfluxDB


sudo apt-get install influxdb

Preparing to unpack .../influxdb_1.6.0-1_armhf.deb ...
Unpacking influxdb (1.6.0-1) ...
influxdb (1.6.0-1) 설정하는 중입니다 ...
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.


grafana 설치는 성공했으나 브라우저 실행하면 자바스크립트 에러가 한무데기...

결국 파이에서 grafana는 삭제하고 윈도우에 설치해서 확인, 디스크 사용량은 나오다 안나오네...



1 2 3 4 5 6 7 8 9 10 다음

Google Analytics