Java2005. 3. 22. 10:59
prompt>java -Xms128m -Xms512 ImageTest
[Ljava.lang.Byte;@35ce36

라고 실행하니 잘 작동하더군요.
각각의 파라미터는 버추얼 머신의 초기 힙 메모리와, 최대 힙 메모리를 가리킵니다.

죄송하지만 참 무식한 방법을 동원한 답변이군요;
게다가, X옵션은 스탠다드 옵션이 아닙니다. 그 말인 즉 -_- 선에서 만든 JVM에서만 될 가능성이 짙다는 것이지요.
어쨌거나 JVM메모리 제한 푸는 방법을 물으셨으니 ( -_);;
적어도 Sun의 JVM은저렇습니다.


ps. Image 스펙을 지키며, 파일 캐쉬를 이용한 Image클래스를 하나 만들어 드리려고 했으나, BufferedImage 소스를 조사한후 포기했습니다. ^-^ Image가 인터페이스라면 몰라도, Abstract Class라서 좀 어려울 듯 해요. 대상이 파일이면 그래픽스 얻기도 골치 아프고... ㅠ_ㅠ, 아무래도 깔끔한 코드를 원하신다면 저 방법을 사용해야 할 듯 합니다. 자바 코드상으로는 JVM의 최대 힙영역을 조정할 방법이 없네요.

2004-09-21 08:44:30.0 (papilla 220.122.230.25) D

prompt>java -Xms128m -Xms512m ImageTest
오타났네요 m 붙이셔야해요. Xms뒤에 숫자는 띄어쓰기 없습니다.

2004-12-27 14:29:08.0 (손님 211.192.164.58) D

오타 하나더.. -Xms128m -Xmx512m 로 해야됩니다.
-Xms : 초기 힙 사이즈
-Xmx : 최대 힙 사이즈
Posted by la30321
Java2005. 3. 22. 10:57
안녕하세요.
자바로 짠 어플리케이션을 배포하려 하는데, jre 를 설치하지
않은 컴에서도 돌아가게 하고 싶습니다.
exe 파일로 만들어주는 툴이 있다고 들었는데, jre 를 포함해서
만들어주는 툴이 있는지요?

꼭 알려주세요.
그럼..


2004-07-16 11:49:50.0 (jini 219.248.234.138) D

제이빌더에 그러한 기능이 있습니다.

JVM은 필요로 하지만 실행 파일을 쉽게 만들어 주는툴 입니다.
http://mjava.net

JToEXE 사용법

작성자 : 이 상 문
작성일 : 2002. 1. 7

이 프로그램은 사용해본 결과 class 파일을 exe로 변환해주는 건 아닌 것 같다. 단지 JVM을 exe에서 자동으로 호출해줘서 자바 바이트 코드를 수행할 수 있도록 하는 것이라 보여진다. 아무튼 일반 사용자로서는 보통 프로그램을 실행하듯이 더블클릭만으로도 수행할 수 있도록 만들어주기 때문에 상당히 편리하도록 만들어주는 것만은 확실하다.

JToEXE의 설치

JToEXE 정식 홈페이지는 지금 새로 구축중이라 들어갈 수가 없다. 참고로 주소는 http://www.bravozulu.com/ 이다. 나중에 더 높은 버젼의 JToEXE 를 구할 필요가 있을 때 참조하면 될 것이다. 아무튼 현재는 파일을 소모임 자료실에 가서 구하길 바란다. 현재 버젼은 2.2 이다. 파일은 zip으로 압축이 되어 있고 이것을 풀면 PJ2Exe2_2 라는 디렉토리가 생성된다.

JToEXE의 실행

PJ2Exe2_2 디렉토리 안에 들어가면, 우리가 찾는 JToExe라는 실행 파일이 있다. 이것을 실행하면 빈 창이 하나 뜨게 된다. File 메뉴에서 New 를 선택하고 우리는 Java flatform 2를 이용하기 때문에 JDK2.0을 선택한다. 나도 모든 메뉴에 대해서 다 알고 있지 않기 때문에 중요한 몇 개만 설명할 것이다. 그리고 예제로 사용할 프로그램은 우리가 현재 제작중인 JavaAmp.jar를 이용한다.

command 메뉴


<그림 1> command 메뉴
기본적으로 command 메뉴가 뜬다. 설정하게 되는 메뉴는 4개이다. 첫번째로 Exe name은 우리가 생성할 실행 파일 이름이다. 오른쪽의 Set ".exe" Location 이라는 버튼을 눌러서 적절한 디렉토리를 선택하고 이름을 넣어주면 설정은 끝난다. 참고로 여기에선 D:\my_software\JavaAmp.exe 로 설정했다.
두번째는 VM을 선택하는 부분이다. System 자체의 VM은 기본적으로 윈도우즈 자체에 지원이 되지 않은 것 같다. 설정해본 결과 VM을 찾지 못한다고 나왔다. 그래서 우리는 User defined VM을 이용한다. 이렇게 되면 특정 디렉토리에 들어있는 JVM.dll 파일을 참조하게 되기 때문에 반드시 버젼에 맞는 JRE 를 깔아줘야 한다. Locate VM 버튼을 눌러서 C:\Program Files\JavaSoft\JRE로 이동해보자. 우리는 java sdk 1.3.1_02 버젼을 설치했기 때문에 1.3.1_02 라는 디렉토리가 보일 것이다. 나중에 exe 파일을 실행할 때, 일반적으로 JRE를 설치했음에도 불구하고 JVM.dll 파일을 찾지 못한다는 메시지가 뜨는 경우가 이 디렉토리가 일치하지 않기 때문이다. 나중에 우리가 최종 프로그램을 배포하게 될 경우도 이 문제 때문에 JRE를 함께 배포해야 할 것이라 생각된다. 아무튼 이 디렉토리 내에 bin 디렉토리로 들어가보면 드뎌 JVM.dll 이 들어있음을 발견한다. 이것을 설정하면 된다.
세번째는 main 함수가 들어있는 클래스를 설정하는 부분이다. JavaAmp의 main 함수는 JavaAmp.class 파일에 들어있다. package는 myprojects.javaamp 이므로, 이 부분에 우리가 입력해야 될 것은 myprojects.javaamp.JavaAmp 가 된다.

classpath 메뉴


<그림 2> classpath 메뉴
JRE와 JMF가 설치되어 있다면 JavaAmp를 위한 기본 설정은 되어 있다. 그렇지만, 한 가지 빠진 것이 있다. JavaAmp 구동을 위해서 만든 package가 포함되어 있어야 한다. 이것은 현재 JavaAmp.jar로 묶어 놓은 상태이므로, 이것을 포함시키면 된다. Add Path 버튼을 누르고 jar 파일이 위치해 있는 곳을 설정하자. 여기에서는 exe 파일과 jar 파일을 같은 디렉토리에 존재하도록 하기 위해서 .\JavaAmp.jar 로 설정했다. 이럴 경우에 JavaAmp.jar는 D:\my_software 라는 디렉토리에 있어야 한다.

Icon 메뉴


<그림 3> Icon 메뉴
이것은 실행파일의 Icon을 설정하는 부분이다. 현재는 이 부분에 대해서 설정하지 않았기 때문에 디폴트로 제공되는 Icon이 뜨게 되어 있다. 그렇지만, JavaAmp 자체를 나타내주는 Icon이 필요하다고 생각되면 Icon을 제작해서 이 메뉴에서 포함시켜주면 된다. 빨리 고유 Icon이 생겼으면 바램이 생기네.

Version 메뉴


<그림 4> version 메뉴
version을 관리하고, 파일 정보를 입력할 수 있는 부분이다. free software인 JavaAmp인 경우에는 크게 중요시 할 부분은 보이지 않는다.

글을 마치며...

나머지 메뉴의 경우에는 각자 조사 및 연구해보기 바란다. 사실은 나도 잘 모른다. 그렇지만, 위의 기본적인 메뉴의 사용법만 알더라도 대부분의 변환은 잘 되리라 믿는다. 그럼, 각자 변환을 해보고, 문제가 발생시에는 항상 알려주기 바란다.
Posted by la30321
Java2005. 3. 22. 10:55

http://xper.org/wiki/xp/BabySteps

연재된 앞뒤 페이지 링크를 따라다니면서 읽어보시면 재미있습니다.
이것은 분쟁이 계속되고 있는 도메인이므로, 개인적인 감상은 말하지 않을게요.


2004-06-05 13:10:10.0 (primely 221.150.112.88) D

프로그램 개발에서 테스트는 필수입니다.
이러한 테스트를 자동으로 해준다면 그것만큼 프로그래머의 부담을 줄여주는 것도 없겠죠.. 더 안정화됨 프로그램을 만들 수 있는 것은 물론이구요.

예전에 TDD(Test Driven Development) 스터디를 해보고 실무에 적용해 보고자 했었는데 이 글에서 읽어서 느끼시겠지만 Test case를 만들어 내는데 어려움이 있었습니다. 끝까지 실무에 적용하지는 못했지만 정말 재미있게 개발했던 기억이 나네요

TDD 강추입니다~
Posted by la30321
Java2005. 3. 22. 10:54
출처:java.sun.com

Java

Why Are Thread.stop, Thread.suspend,
Thread.resume and Runtime.runFinalizersOnExit Deprecated?



Why is Thread.stop deprecated?

Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unlocked as the ThreadDeath exception propagates up the stack.) If any of the objects previously protected by these monitors were in an inconsistent state, other threads may now view these objects in an inconsistent state. Such objects are said to be damaged. When threads operate on damaged objects, arbitrary behavior can result. This behavior may be subtle and difficult to detect, or it may be pronounced. Unlike other unchecked exceptions, ThreadDeath kills threads silently; thus, the user has no warning that his program may be corrupted. The corruption can manifest itself at any time after the actual damage occurs, even hours or days in the future.

Couldn't I just catch the ThreadDeath exception and fix the damaged object?

In theory, perhaps, but it would vastly complicate the task of writing correct multithreaded code. The task would be nearly insurmountable for two reasons:
  1. A thread can throw a ThreadDeath exception almost anywhere. All synchronized methods and blocks would have to be studied in great detail, with this in mind.
  2. A thread can throw a second ThreadDeath exception while cleaning up from the first (in the catch or finally clause). Cleanup would have to repeated till it succeeded. The code to ensure this would be quite complex.
In sum, it just isn't practical.

What about Thread.stop(Throwable)?

In addition to all of the problems noted above, this method may be used to generate exceptions that its target thread is unprepared to handle (including checked exceptions that the thread could not possibly throw, were it not for this method). For example, the following method is behaviorally identical to Java's throw operation, but circumvents the compiler's attempts to guarantee that the calling method has declared all of the checked exceptions that it may throw: static void sneakyThrow(Throwable t) {
Thread.currentThread().stop(t);
}

What should I use instead of Thread.stop?

Most uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. (This is the approach that JavaSoft's Tutorial has always recommended.) To ensure prompt communication of the stop-request, the variable must be volatile (or access to the variable must be synchronized). For example, suppose your applet contains the following start, stop and run methods: private Thread blinker;

public void start() {
blinker = new Thread(this);
blinker.start();
}

public void stop() {
blinker.stop(); // UNSAFE!
}

public void run() {
Thread thisThread = Thread.currentThread();
while (true) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}You can avoid the use of Thread.stop by replacing the applet's stop and run methods with:
private volatile Thread blinker;

public void stop() {
blinker = null;
}

public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}

How do I stop a thread that waits for long periods (e.g., for input)?

That's what the Thread.interrupt method is for. The same "state based" signaling mechanism shown above can be used, but the state change (blinker = null, in the previous example) can be followed by a call to Thread.interrupt, to interrupt the wait: public void stop() {
Thread moribund = waiter;
waiter = null;
moribund.interrupt();
}For this technique to work, it's critical that any method that catches an interrupt exception and is not prepared to deal with it immediately reasserts the exception. We say reasserts rather than rethrows, because it is not always possible to rethrow the exception. If the method that catches the InterruptedException is not declared to throw this (checked) exception, then it should "reinterrupt itself" with the following incantation:
Thread.currentThread().interrupt();This ensures that the Thread will reraise the InterruptedException as soon as it is able.

What if a thread doesn't respond to Thread.interrupt?

In some cases, you can use application specific tricks. For example, if a thread is waiting on a known socket, you can close the socket to cause the thread to return immediately. Unfortunately, there really isn't any technique that works in general. It should be noted that in all situations where a waiting thread doesn't respond to Thread.interrupt, it wouldn't respond to Thread.stop either. Such cases include deliberate denial-of-service attacks, and I/O operations for which thread.stop and thread.interrupt do not work properly.

Why are Thread.suspend and Thread.resume deprecated?

Thread.suspend is inherently deadlock-prone. If the target thread holds a lock on the monitor protecting a critical system resource when it is suspended, no thread can access this resource until the target thread is resumed. If the thread that would resume the target thread attempts to lock this monitor prior to calling resume, deadlock results. Such deadlocks typically manifest themselves as "frozen" processes.

What should I use instead of Thread.suspend and Thread.resume?

As with Thread.stop, the prudent approach is to have the "target thread" poll a variable indicating the desired state of the thread (active or suspended). When the desired state is suspended, the thread waits using Object.wait. When the thread is resumed, the target thread is notified using Object.notify. For example, suppose your applet contains the following mousePressed event handler, which toggles the state of a thread called blinker: private boolean threadSuspended;

Public void mousePressed(MouseEvent e) {
e.consume();

if (threadSuspended)
blinker.resume();
else
blinker.suspend(); // DEADLOCK-PRONE!

threadSuspended = !threadSuspended;
}You can avoid the use of Thread.suspend and Thread.resume by replacing the event handler above with:
public synchronized void mousePressed(MouseEvent e) {
e.consume();

threadSuspended = !threadSuspended;

if (!threadSuspended)
notify();
}and adding the following code to the "run loop":
synchronized(this) {
while (threadSuspended)
wait();
}The wait method throws the InterruptedException, so it must be inside a try ... catch clause. It's fine to put it in the same clause as the sleep. The check should follow (rather than precede) the sleep so the window is immediately repainted when the the thread is "resumed." The resulting run method follows:
public void run() {
while (true) {
try {
Thread.currentThread().sleep(interval);

synchronized(this) {
while (threadSuspended)
wait();
}
} catch (InterruptedException e){
}
repaint();
}
}Note that the notify in the mousePressed method and the wait in the run method are inside synchronized blocks. This is required by the language, and ensures that wait and notify are properly serialized. In practical terms, this eliminates race conditions that could cause the "suspended" thread to miss a notify and remain suspended indefinitely.
While the cost of synchronization in Java is decreasing as the platform matures, it will never be free. A simple trick can be used to remove the synchronization that we've added to each iteration of the "run loop." The synchronized block that was added is replaced by a slightly more complex piece of code that enters a synchronized block only if the thread has actually been suspended: if (threadSuspended) {
synchronized(this) {
while (threadSuspended)
wait();
}
}In the absence of explicit synchronization, threadSuspended must be made volatile to ensure prompt communication of the suspend-request.
The resulting run method is:
private boolean volatile threadSuspended;

public void run() {
while (true) {
try {
Thread.currentThread().sleep(interval);

if (threadSuspended) {
synchronized(this) {
while (threadSuspended)
wait();
}
}
} catch (InterruptedException e){
}
repaint();
}
}

Can I combine the two techniques to produce a thread that may be safely "stopped" or "suspended"?

Yes; it's reasonably straightforward. The one subtlety is that the target thread may already be suspended at the time that another thread tries to stop it. If the stop method merely sets the state variable (blinker) to null, the target thread will remain suspended (waiting on the monitor), rather than exiting gracefully as it should. If the applet is restarted, multiple threads could end up waiting on the monitor at the same time, resulting in erratic behavior.
To rectify this situation, the stop method must ensure that the target thread resumes immediately if it is suspended. Once the target thread resumes, it must recognize immediately that it has been stopped, and exit gracefully. Here's how the resulting run and stop methods look: public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
thisThread.sleep(interval);

synchronized(this) {
while (threadSuspended && blinker==thisThread)
wait();
}
} catch (InterruptedException e){
}
repaint();
}
}

public synchronized void stop() {
blinker = null;
notify();
}If the stop method calls Thread.interrupt, as described above, it needn't call notify as well, but it still must be synchronized. This ensures that the target thread won't miss an interrupt due to a race condition.

What about Thread.destroy?

Thread.destroy has never been implemented. If it were implemented, it would be deadlock-prone in the manner of Thread.suspend. (In fact, it is roughly equivalent to Thread.suspend without the possibility of a subsequent Thread.resume.) We are not implementing it at this time, but neither are we deprecating it (forestalling its implementation in future). While it would certainly be deadlock prone, it has been argued that there may be circumstances where a program is willing to risk a deadlock rather than exit outright.

Why is Runtime.runFinalizersOnExit deprecated?

Because it is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock. While this problem could be prevented if the class whose objects are being finalized were coded to "defend against" this call, most programmers do not defend against it. They assume that an object is dead at the time that its finalizer is called.
Further, the call is not "thread-safe" in the sense that it sets a VM-global flag. This forces every class with a finalizer to defend against the finalization of live objects!
Copyright ⓒ 1995-99 Sun Microsystems, Inc. All Rights Reserved.
Suggest a feature or make comments
Sun Java Software



2004-05-21 03:20:40.0 (papilla 220.122.230.33) D

영어에 약하신 분들과, 명확한 이유를 한 눈에 알기 원하시는 분들을 위해서 말씀 드립니다.

Thread가 suspend되었을 당시의 그 Thread가 수행하던 프로시져의 상황을 판단하고 표현할수 있는 기준이 없기 때문입니다. 따라서 프로그래머는 스레드가 정지되는 시점의 상황을 예측하는 것이 불가능합니다. 예를 들어 Thread가 다른 객체나 스레드와 어떠한 동일한 참조를 가지고 있을 경우, Thread가 재개되었을 경우,Thread가 서스펜드 되었을 때와 완전히 같은 상태를 가진다고 보장할 수 없습니다.

또한 Thread가 어떤 독점 자원을 물고 있는 상태에서 서스펜드 된다면 (예를 들어 쓰레드 내부에서 synchronized함수를 호출하고 그 프로시져가 진행되던 도중 suspended된다면) 다른 모든 스레드는 그 자원을 사용할 수 없게 될 것입니다.

결국 Sun은 프로그래머가 Thread를 상속받아 자기 자신만의 Thread를 만들 되, 스스로 Thread가 안전한 장소(프로그래머가 예측할 수 있는)에서 suspend될 수 있도록 (예를 들면 synchronized된 메소드를 호출한경우, 그것을 전부 호출 한 다음에야 suspend된다거나 하는 식의)직접 플래그와 판단 조건과, 스레드의 상태를 추상화 하라고 권고 하는 것입니다.

여기에 대한 자세한 정보가 필요하다면 운영체제론을 다룬 아무 기술서적을 살펴 보더라도 등장할 것입니다. deadlock을 다룬 부분을 찾아 보세요.


ps. 일반적으로 스레드는 절대 서스펜드 될 필요가 될 수 없게끔 전체 스레드 모델을 잘 설계하고 디자인 하는 것이 훨씬 더 중요합니다.
Posted by la30321
Java2005. 3. 22. 10:52
출처:http://raytrust.pe.kr/오광신님

[2004년 4월 19일] 자바 기술을 이용하여 사인드 애플릿 만들기!!!!


-. 아직도 사인드 애플릿을 만들때 마이크로소프트에서 제공하는 방법을 사용하시나요?
이제 더 이상 그렇게 불편하게 하지 않으셔도 됩니다.
더 이상 지원되지 않는 Microsoft SDK for Java 4.0을 설치하실 필요도 없습니다.
자, 이제 자바 기술을 사용하여 사인드 애플릿을 만들어 보세요.
정말이지 제가 게으른 탓에 이제서야 드디어 정리를 했습니다.
제가 보기엔 이 방법이 훨씬 더 나은것 같습니다.
질문이나 문의사항은 게시판을 이용해 주세요..^^;
Posted by la30321