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


파일의 변경 사항 확인하는 법


  • git log -p : 
    • 로그에서 출력되는 버전 간의 차이점을 출력하고 싶을 때 사용
    • commit과 commit 사이에 소스상의 차이점을 알 수 있다.
  • git diff (버전 id1)..(버전 id2) :
    • 두 버전간 소스 코드상의 차이점을 비교할 때 사용
    • 각각의 commit은 고유 번호를 가지고 있다.
  • git diff :
    • add되는 파일, 즉 commit하기 전에 이전 버전과의 차이점을 비교할 때 사용

  • git log, git diff 종료 방벙 : q + Enter
  • git bash에서 복사, 붙여넣기
    • 복사 : Ctrl + Insert
    • 붙여넣기 : Shift + Insert

jungd@DESKTOP-KCGRLA3 MINGW64 ~/git_project/gitfth (master)
$ git log -p

commit f6626ce8b1c5df971684a817cdf44c4c225ccba3
Author: username<email>
Date:   Tue Mar 19 23:14:45 2019 +0900

    4

diff --git a/f1.txt b/f1.txt
index e77ea5a..bf2a181 100644
--- a/f1.txt     //버전3에서의 f1.txt파일 내용
+++ b/f1.txt //버전4에서의 f1.txt파일 내용
@@ -1 +1 @@
-souce : 2     //버전3에서는 내용
+f1.txt :44     //버전4에서의 내용

commit af291caa485e5defcb6eff80423a8ce7e4085b51
Author: username<email>
Date:   Tue Mar 19 23:07:59 2019 +0900

    3

diff --git a/f3.txt b/f3.txt
new file mode 100644
index 0000000..e77ea5a
--- /dev/null //버전2의 내용, 파일이 없음.
+++ b/f3.txt //버전3의 내용, f3.txt 파일이 있음
  //버전3에서 f3.txt 파일이 추가 됐다. 라는 내용
@@ -0,0 +1 @@
+souce : 2     //버전3에서의 f3.txt의 초기 내용
  //버전3이 만들어지면서 f3.txt 파일이 생성되었고, 그 내용은 source : 2 였다는 것임




jungd@DESKTOP-KCGRLA3 MINGW64 ~/git_project/gitfth (master)
$ git diff
diff --git a/f1.txt b/f1.txt
index bf2a181..579b555 100644
--- a/f1.txt
+++ b/f1.txt
@@ -1 +1 @@
-f1.txt :44 //그 이전
+f1.txt :5 //현재
=> 작업을 할 때 커밋하기전에 자기가 작업한 내용이 문제가 있는지 없는지를 마지막으로 리뷰할 수 있는 기회를 제공.
 코드들의 차이점을 통해서 실수한게 없는지 확인할 수 있는 마지막 기회를 버전관리 시스템이 제공한다.

jungd@DESKTOP-KCGRLA3 MINGW64 ~/git_project/gitfth (master)
$ git add f1.txt

jungd@DESKTOP-KCGRLA3 MINGW64 ~/git_project/gitfth (master)
$ git diff

jungd@DESKTOP-KCGRLA3 MINGW64 ~/git_project/gitfth (master)
$ //commit 후 git diff를 해보면 아무것도 안 뜬다.



버전의 효용은 버전 간의 차이점을 알 수 있고, 과거 특정한 시점의 내용을 알 수 있으며 과거로 돌아갈 수 있다.


+ Recent posts