java - 설정 - jvm memory structure




새로운 것이 실패한다면? (4)

C ++과 C #에서는 새로운 메모리를 할당 할 수 없을 때 예외가 발생합니다.

Java에서의 새로운 동작에 대한 정보를 찾을 수 없었습니다. 새로운 메모리가 Java (메모리 부족)에서 실패하면 어떻게 될까요?


OutOfMemoryExceptions를 잡을 수는 있지만 권장하지는 않습니다. 그러나 코딩 / 디자인 문제가 아니면 가비지 수집기가 힙 관리를 담당해야합니다.

많은 양의 데이터를 처리하고 메모리를 실행할 것으로 생각되면 실행을 시작하기 전에 사용 가능한 여유 공간을 항상 확인할 수 있습니다 (이 link 에서 코드 스 니펫 복사).

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

실제로 충분한 메모리가 없으면 OutOfMemoryError가 발생합니다. 또한 예외는 생성자 자체에 의해 발생 될 수 있습니다.


OutOfMemoryError 좀 더.

/*License - LGPL
<h3>Recovery from an OutOfMemory Error</h3>
<p>The JavaDocs for Error state, in the first sentence..

<blockquote>"An Error is a subclass of Throwable that indicates
serious problems that a reasonable application should
not try to catch."</blockquote>

<p>This advice has led to the fallacy that an OutOfMemoryError
should not be caught and dealt with.  But this demo. shows
that it is quite easy to recover to the point of providing
the user with meaningful information, and advice on how to
proceed.

<p>I aim to make my applications 'unreasonable'.  ;-)
*/

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JOptionPane;
import javax.swing.JDialog;
import javax.swing.Timer;

import javax.swing.border.EmptyBorder;

import java.util.ArrayList;

/** A demo. showing recovery from an OutOfMemoryError.
Our options once an OOME is encountered are relatively
few, but we can still warn the end user and provide
advice on how to correct the problem.
@author Andrew Thompson */
public class MemoryRecoveryTest {

    public static void main(String[] args) {
        // reserve a buffer of memory
        byte[] buffer = new byte[2^10];
        ArrayList<Object> list = new ArrayList<Object>();
        final JProgressBar memory = new JProgressBar(
            0,
            (int)Runtime.getRuntime().totalMemory());
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                memory.setValue(
                    (int)Runtime.getRuntime().freeMemory() );
            }
        };
        Timer timer = new Timer(500, listener);
        timer.start();

        JDialog dialog = new JDialog();
        dialog.setTitle("Available Memory");
        JPanel memoryPanel = new JPanel();
        memoryPanel.add(memory);
        memoryPanel.setBorder(new EmptyBorder(25,25,25,25));
        dialog.add( memoryPanel );
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
        dialog.addWindowListener( new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        } );

        // prepare a memory warning panel in advance
        JPanel memoryWarning = new JPanel();
        memoryWarning.add( new JLabel(
            "<HTML><BODY>There is not enough memory to" +
            " complete the task!<BR> Use a variant " +
            " of the application that assigns more memory.") );

        try {
            // do our 'memory intensive' task
            while(true) {
                list.add( new Object() );
            }
        } catch(OutOfMemoryError oome) {
            // provide the VM with some memory 'breathing space'
            // by clearing the buffer
            buffer = null;
            // tell the user what went wrong, and how to fix it
            JOptionPane.showMessageDialog(
                dialog,
                memoryWarning,
                "Out of Memory!",
                JOptionPane.ERROR_MESSAGE);
        }
    }
}

특히 메모리 할당 실패를 의미한다고 가정하면 OutOfMemoryError 를 throw해야합니다

Java 가상 머신이 메모리 부족으로 오브젝트를 할당 할 수 없어, 가베지 수집가가 사용 가능한 메모리를 더 이상 사용할 수없는 경우에 Throw됩니다.

Error 모든 하위 클래스와 마찬가지로 기술적으로 catch 할 있다고하더라도 일반적으로 복구 할 수없는 조건입니다.

Error는 합리적인 어플리케이션이 캐치하지 않아야하는 심각한 문제를 나타내는 Throwable의 서브 클래스입니다. 그러한 오류의 대부분은 비정상적인 조건입니다. ThreadDeath 오류는 "정상적인"조건이지만 대부분의 응용 프로그램이 오류를 잡아서는 안되기 때문에 오류의 하위 클래스이기도합니다.

메서드는 메서드 실행 중에 throw 될 수 있지만 catch되지 않는 모든 오류의 하위 클래스를 throws 절에 선언 할 필요가 없습니다. 이러한 오류는 절대로 발생해서는 안되는 비정상적인 조건이기 때문입니다.







memory-management