프로그램 개발 단계

  • A4_prgprecessing1.png
    • (1) Coding
      • 소스 파일을 생성하는 단계
      • 헤더파일(.h)과 소스파일(.c)로 저장
    • (2) Preprocessor
      • 선행처리를 하는 단계
      • 선행처리기는 사람과 컴파일러 사이의 매개 역할을 수행하고, 컴파일을 하기 전 사용자가 정의한 내용들을 처리 담당 한다.
        • # 기호로 시작 한다.
        • 세미콜론(;) 을 붙이지 않는다
        • 하나의 명령은 한 줄에서만 가능하다
        • 소스프로그램의 첫 부분에 있어야 한다.
        • 선행처리기의 종류와 기능

          선행처리기

          기능 

           #include

          파일 포함 

           #define

          매크로 정의 

          #if, #else, #elif, #endif 

          조건부 컴파일 

    • (3) Compile
      • 사람이 작성한 소스 파일을 컴퓨터가 이해할 수 있도록 기계어로 변환하는 과정
      • 소스 파일을 컴파일 하면 컴퓨터가 이해할 수 있는 기계어들로 변환된 목적 파일(.obj)이 만들어 진다.
      • 목적 파일은 혼자 있을 때는 별 쓸모가 없고, 라이브러리 파일과 목적 파일들로 연결되어 하나의 프로그램이 될 때 의미를 가진다.
    • (4) Linking
      • 컴파일된 목적 파일들을 라이브러리 파일과 연결해서 실행 파일(.exe)로 만들어주는 단계
      • 링킹 단계에서 사용되는 도구가 링커(linker)이다.
      • 이 단계는 컴파일할 때 자동적으로 처리가 된다.




'Development > C' 카테고리의 다른 글

C언어의 정의, 특징  (0) 2019.03.24
C언어의 개요

  • C언어의 정의와 특징
    • 프로그래밍 언어이다. (인간과 컴퓨터가 의사소통 할 수 있는 수단)
    • UNIX 운영체제 개발 사용 목적으로 만들어진 언어이다.
      • UNIX 운영체제는 어셈블리 언어로 만들어졌기 때문에 하드웨어 의존도가 높다. (컴퓨터 기종에 따라 호환성 문제를 가지고 있음)
      • ==> 이런 문제를 해결하기 위해 어셈블리 언어와 비슷하게 컴퓨터 하드웨어를 제어할 수 있는 언어로 개발 되었다.
    • 인간의 언어로 프로그램 작성을 하면 컴파일러는 컴퓨터가 이해할 수 있는 기계어로 번역하는 역할을 수행한다.
    • 실제로는 컴파일러와 컴퓨터 사이에 어셈블러라는 통역가가 하나 더 있다.
      • 사람 --- (컴파일러: 기계어와 가까운 어셈블리 코드로 번역) --- (어셈블러: 어셈블리 코드를 기계어(0,1의 바이너리 코드)로 변역) --- 컴퓨터
      • 기계어 : 0과 1로만 이루어진 명령어를 입력해야 기계가 이해할 수 있는 언어이다.
      • 컴파일러 : 사람이 작성한 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 번역해주는 변역 소프트웨어.
      • 어셈블리어 : 기계어와 1:1 대응된 명령을 기술하고, 기계어를 좀 더 이해하기 쉬운 기호 코드로 나타낸 언어이다.
    • 고급 언어(high-level)로 인간이 이해하기 쉬운 언어이다.
    • 하드웨어 제어가 가능(포인터를 이용한 메모리 접근 등)하여 저급언어의 특성을 지니기도 했다.
    • 프로그램 이식성이 높다.


'Development > C' 카테고리의 다른 글

C프로그램 개발 단계  (0) 2019.03.24

3월 23, 2019 10:13:55 오후 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc

경고: The web application [ROOT] registered the JDBC driver [net.sf.log4jdbc.sql.jdbcapi.DriverSpy] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

3월 23, 2019 10:13:55 오후 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc

경고: The web application [ROOT] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

3월 23, 2019 10:13:55 오후 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads

경고: The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

 java.lang.Object.wait(Native Method)

 java.lang.ref.ReferenceQueue.remove(Unknown Source)

 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64)

 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

 java.lang.Thread.run(Unknown Source)


톰캣이 시작하거나 종료할 때는 발생하지 않고, 서버를 중지 시키지 않은 상태에서 파일을 리로드 시키거나 재시작 할 때 에러가 발생했다.

localhost:8080은 잘 뜨나 도대체 이 에러가 갑자기 왜 발생하는지 궁금해졌다.


에러가 발생하는 원인은 톰캣 때문이 아닌 JVM, library 때문이라고 한다.


- Application, Library code에 의해 발생

  • JDBC driver
  • Logging framework
  • ThreadLocal의 object를 저장하고 remove하지 않아서
  • 쓰레드를 시작시키고 멈추지 않아서
- Java API에 의해서도 발생
  • Using the javax.imageio API (the Google Web Toolkit can trigger this)
  • Using java.beans.Introspector.flushCaches() (Tomcat does this to prevent memory leaks caused by this caching)
  • Using XML parsing (the root cause is unknown due to a bug in the JRE)
  • Using RMI (somewhat ironically, causes a leak related to the garbage collector)
  • Reading resources from JAR files


나한테 뜬 에러는 JDBC 관련된 것, ThreadLocal에 객체를 저장하고 지우지 않아서, 쓰레드를 시작하고 중지 시키지 않아서 발생한 것 같다.

그러므로 쓰레드에 대해 간단하게 알아보자.



Java Thread

자바 쓰레드의 정의를 알기 전에 프로세스에 대해 알아야 한다.

프로그래밍 언어로 코딩을 하여 만든 것을 "프로그램"이라고 한다. 그리고 프로그램을 "실행" 시켜 동작하게 만들면 이것을 "프로세스"라고 한다.

이 프로세스는 보통 하나의 처리 경로를 가지고 있고, 직렬적이다. 즉 어떠한 일을 수행할 때 프로그래머가 원하는 순서대로 일을 처리하는 것이다.

그러나 순서가 필요 없는 작업을 할 때 따로 따로 분리해서 동시에 처리를 할 수 있는데, 이 때 자바의 쓰레드를 이용하는 것이다.

자바 쓰레드를 이용하면 하나의 프로세스에서도 병렬적 처리, 즉 여러 개의 경로를 가질 수 있다.

그리고 Thread클래스를 상속 받거나 Runnable 인터페이스를 구현해서 만들어진다. Thread클래스의 start() 메소드를 통해 시작하고 stop() 메소드를 ㅗ통해 중지된다. 그러나 한 두개 쓰레드를 쓸 경우가 아니라면, 쓰레드를 관리하기 위해서 ThreadPool을 사용한다.

Thread의 stop메소드와 ExecutorService의 shutdownNow메소드에는 차이가 있다고 한다.

Thread - stop() : 쓰레드를 무조건 중지 시킨다. 무한반복( while(true)와 같은 )이 있어도 중지를 시킨다.

ExecutorService - shutdownNow() : shutdownNow는 내부 관리되고 있는 쓰레드들이게 인터럽트를 호출만해준다. stop메소드처럼 무한반복문을 중지시키지 못한다. 그리고 내부에는 인터럽트 되어 지지 않는 sleep과 같은 메소드를 통해 대기 상태를 이루고 있다.



+

에러에 뜬 클래스파일의 소스코드를 보니 뭔 말인지 모르겠어서 공부가 더 필요하다.

해결법을 찾아내면 추가하겠다.








REFERENCE

https://knight76.tistory.com/947

https://atin.tistory.com/438

'Development > JAVA' 카테고리의 다른 글

NPE(NullPointerException) 원인과 예방  (0) 2018.10.05

+ Recent posts