본문 바로가기

java47

[jks] Caused by: java.io.IOException: Invalid keystore format keytool을 이용해서 jks를 생성하고 주키퍼를 실행하는 중에 키포맷이 틀렸다는 오류가 계속 발생하였습니다.이 경우 몇가지 원인이 있을 수 있는데 제가 발생한 원인은 자바 버전 문제였습니다. Caused by: java.io.IOException: Invalid keystore format 주키퍼를 실행할 때 사용하는 java 와 keytool의 경로가 달라서 오류가 발생하였습니다. JAVA_HOME 설정의 문제로 인해서 java 경로는 /usr/lib/jdk/java 고 keytool은 /usr/local/jdk/bin/keytool 로 자바 버전과 keytool의 버전이 달라서 오류가 발생하였습니다. 정상적으로 발급한 jks가 계속 오류가 발생한다면 다른 버전을 이용하고 있는 것이 아닌지 확인해보.. 2022. 5. 25.
[java] HttpClient 3.1 라이브러리 프록시 설정 httpclient3.1 버전 라이브러리의 프록시 설정을 이용한 GET 메소드 이용 예제입니다. 여러가지 예제를 찾았지만 동작하는 것이 이것 하나였습니다. 추가로 이 자바를 우분투에서 컴파일하고 실행하는 방법은 다음과 같습니다. 2021. 12. 21.
[java] 자바 CLI 환경에서 클래스패스를 디렉토리로 설정 하는 방법 자바를 CLI 로 실행할 때 클래스패스가 많을 때는 파일로 하나씩 추가하는 것보다 디렉토리로 설정하는 것이 더 편합니다. 이때는 디렉토리 경로를 추가해줄 수 있습니다. # 파일 단위로 클래스 패스 추가 java -classpath .:/opt/hbase/lib/hadoop-common-2.7.4.jar:/opt/hbase/lib/hbase-common-1.4.13.jar:/opt/hbase/lib/hbase-client-1.4.13.jar:/opt/hbase/lib/commons-logging-1.2.jar:/opt/hbase/lib/guava-12.0.1.jar:/opt/hbase/lib/commons-collections-3.2.2.jar:/opt/hbase/lib/protobuf-java-2.5.0.. 2021. 12. 12.
[java] Error: Could not find or load main class 오류 처리 자바를 CLI 로 컴파일 하고 실행할 대 이런 오류를 볼 경우가 있습니다. 다양한 원인이 있을 수 있는데 저의 경우는 컴파일할 때 지정한 패키지 경로에 클래스 파일이 존재하지 않아서 였습니다. 자바를 컴파일 할 때 패키지가 지정되어 있다면 디렉토리 구조와 자바에 선언된 패키지가 일치해야 합니다. # 컴파일 $ javac -classpath "/opt/hbase/lib/*:." HBaseExample.java # 실행 $ java -classpath "/opt/hbase/lib/*:." HBaseExample 2021. 12. 12.
[kerberos] Clock skew too great 오류 확인 커버러스 티켓 사용중 발생하는 다음의 오류는 클라이언트 서버와 타켓 서버의 시간 동기화가 이루어 지지 않을 때 발생합니다. date 명령으로 서버의 시간을 확인해 보면 시간이 다른 것을 알 수 있습니다. 시간 동기화를 해주면 문제를 해결할 수 있습니다. Caused by: KrbException: Clock skew too great (37) - PROCESS_TGS at sun.security.krb5.KrbTgsRep.(KrbTgsRep.java:73) 2021. 2. 18.
[java] 자바 VM의 최대 메모리 사용량 확인 방법 자바 vm의 힙사이즈를 설정하는 Xmx 옵션이 여러개 설정되면 가장 마지막의 옵션이 설정됩니다. 다음의 코드는 자바 VM의 최대 메모리 사용량을 출력하는 프로그램입니다. 여기에 VM 옵션을 설정한 결과가 다음과 같습니다. -Xmx2048m Max mem=1820m -Xmx2048m -Xmx4096m Max mem=3641m -Xmx4096m -Xmx2048m Max mem=1820m -Xmx4096m Max mem=3641m 2021. 2. 16.
[java] JVM의 메모리가 Xmx 설정보다 많이 먹는 이유 자바 응용프로그램을 실행하는 중에 Xmx를 4G로 설정했는데 실제 메모리는 7G를 먹고 있어서 원인을 확인해 보았습니다. Xmx는 힙의 최대 메모리를 설정하는 명령입니다. JVM은 힙외에 다양한 요소들로 구성되어 있고 이 부분이 메모리를 사용합니다. # Xmx: 힙의 최대 메모리 사이즈 # MaxPermSize: Permanent Size 최대 메모리 # Xss: 스레드에 할당되는 Stack 사이즈 Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss] 힙영영외 나머지 영역에서 메모리가 필요하여 사용메모리가 늘어납니다. GC: 가비지 수집을 위한 메모리. 사용 중인 개체의 추적을 위한 그래프 생성. G1GC는 더 많은 메모리를 사용합니다.. 2021. 2. 6.
[java] jsvc 명령에서 Invalid JVM name specified server 오류 해결 방법 jsvc를 이용할 때 다음의 오류가 발생하는 경우가 있습니다. Invalid JVM name specified server Cannot locate JVM library file Service exit with a return value of 1 원인 이 오류는 jsvc를 실행할 때 전달하는 jvm의 이름이 틀렸기 때문입니다. JVM의 종류가 다양하기 때문에 자신이 사용하는 JVM의 정보를 확인하고 이 이름을 전달하면 됩니다. OpenJDK나 HotSpot은 jvm이름이 server 이기 때[문에 일반적인 설정에서는 문제가 없으나, 이클립스 VM의 경우 이름이 j9vm 이라서 이런 오류가 발생할 수 있습니다. JVM 이름 확인 JVM이름을 확인하고 이 이름을 JSVC 명령어에서 이요할 수 있습니다. JS.. 2021. 1. 29.
[java] 메모리 사용량 확인 리눅스에서 자바 프로그램의 메모리 사용량을 확인하는 방법은 여러가지가 있습니다. 시스템 전체의 메모리 사용량을 확인할 수도 있고, 프로그램의 메모리 사용량을 확인할 수도 있습니다. 메모리 덤프를 이용하여 메모리가 사용되고 있는 현황을 확인할 수도 있습니다. 시스템의 메모리 사용량 top 시스템 전체의 메모리 사용량 확인 shift + m 으로 메모리 사용량 순으로 정렬 top -p [pid] 로 특정 프로그램의 메모리 사용량 확인 free 시스템 전체의 메모리 사용량 확인 sar 시스템의 메모리 사용량을 주기적으로 확인 자바 프로그램의 메모리 사용량 jmap 메모리 사용확인을 위한 힙덤프 힙덤프를 떠서 분석할 수 있음. pmap 프로그램의 현재 메모리 사용 상태 확인 2021. 1. 10.
[java] DateTimeFormatter를 이용하여 유닉스 시간(Epoch Time)을 밀리세컨드로 출력하는 예제 유닉스 시간은 시각을 표현하는 방식으로 POSIX 시간 또는 Epoch 시간입니다. 자바에서 Epoch시간은 1970년 1월 1일 00시를 기준으로 현재까지의 초를 출력합니다. DateTimeFormatter를 이용하여 Epoch 시간을 밀리세컨드로 출력하는 방법은 아래와 같습니다. 2020. 6. 3.
[log4j] 레이아웃 패턴 기본 설정 log4j 패턴 레이아웃의 기본설정입니다. appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{yyyy-MM-dd HH:mm:ss}] [%-5p] [%c{1}:%L] - %m%n rootLogger.level = debug rootLogger.appenderRef.console.ref = console 출력 [2019-11-04 07:10:15] [INFO ] [Driver:2181] - Starting task [Stage-0:DDL] in serial mode # [%d{yyyy-MM-dd H.. 2019. 11. 4.
[openjdk] open jdk 1.8 다운로드 및 설치 자바의 라이선스 만료로 인하여 윈도우에서 open jdk 설치할 때는 다음과 같이 진행합니다. 깃허브에서 빌드된 자바 다운로드(https://github.com/ojdkbuild/ojdkbuild) 합니다. msi 파일은 실행하여 설치 안내메시지에 따라서 진행하면 됩니다. zip 파일은 원하는 경로에서 압축을 풀고, 환경변수에 JAVA_HOME을 지정합니다. JAVA_HOME은 {JAVA_LOCATION}/bin 까지 설정해야 합니다. 2019. 10. 25.
[java] 가비지 콜렉션의 종류(GC: Garbage Collection) GC의 종류에 대해서 알아보겠습니다. SerialGC 싱글 스레드로 Young 영역, Old 영역을 처리 하나의 스레드를 이용해서 동작하기 때문에 멀티 스레드 환경의 서버 프로그램에서는 부적합 일시 중지에 관대한 클라이언트 프로그램이나 테스트용 프로그램에 적합 java -XX:+UseSerialGC Mark-Sweep-Compact 알고리즘을 이용 Mark: 살아 있는 객체를 선택 Sweep: 선택되지 않은 객체를 정리 Compact: 메모리 공간을 압축 ParallelGC Minor GC를 여러개의 스레드를 이용하여 동시에 처리 Major GC는 싱글 스레드로 처리 SerialGC보다 빠르지만 더 많은 자원을 소모 Mark-Sweep-Compact 알고리즘을 이용 java -XX:+UseParallel.. 2019. 7. 24.
[java] JVM이란? JVM 자바 가상 머신(Java Virtual Machine) 자바 바이트 코드를 실행하는 주체 Linux, Window, Mac 등 OS에 맞게 구현 JVM Spec에 맞춰 구현 Oracle, Eclipse, IBM 등 여러 회사에서 구현 HotSpot, OpenJ9 JVM Language JVM에서 실행가능한 언어 Clojure, Groovy, JRuby, Jython, Kotlin, Scala 자바 바이트 코드 자바 바이트 코드 = 클래스 파일 = .class 컴파일러가 .java 파일을 .class 파일로 해석 자바 컴파일러, 스칼라 컴파일러, 코틀린 컴파일러 등 JVM은 자바 바이트 코드를 해석해서 실행 Write Once, Run Everywhere JVM 주요 모듈 클래스 로더(Class L.. 2019. 7. 8.
[java] 메모리 누수와 힙 덤프 분석 프로그래밍에서 메모리 누수현상(Memory Leak)은 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상입니다. 자바의 메모리 누수 현상은 이전글을 참고 바랍니다. 2019/07/02 - [개념] - [개념] 메모리 누수(Memory Leak) 현상 [개념] 메모리 누수(Memory Leak) 현상 프로그래밍에서 메모리 누수현상(Memory Leak)은 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상입니다. 자바의 메모리 누수 자바에서 메모리 누수는 더이상 사용하지 않는 객체가 가비지 컬렉션(GC).. 118k.tistory.com 힙 덤프 생성 메모리 누수 문제가 발생하면 JVM의 힙 덤프를 이용하여 메모리에 어떤 객체가 생성되어 있는지를 확인할 수 있습니다. JDK와 함께 제공되는.. 2019. 6. 5.
[java] 자바의 가비지 콜렉션(GC: Garbage Collection)과 jstat을 이용한 모니터링 자바는 가비지 콜렉션 기능을 이용해 메모리 관리의 효율성을 제공합니다. 자바의 가비지 콜렉션은 'weak generational hypothesis' 이론에 기반합니다. 이는 신규로 생성한 객체의 대부분은 금방 사용하지 않는 상태가 되고, 오래된 객체에서 신규 객체로의 참조는 매우 적게 존재한다는 것입니다. 이 이론에 기반하여 자바는 Young 영역과 Old 영역으로 메모리를 분할하고, 신규로 생성되는 객체는 Young 영역에 보관하고, 오래동안 살아남은 객체는 Old 영역에 보관합니다. Young 영역은 Eden, S0, S1 영역으로 구분됩니다. 신규로 생성되는 객체는 Eden에 보관되고, Eden 영역이 100% 차게 되면 사용하지 않는 객체는 제거하고 사용되는 객체는 S0 영역으로 이동합니다. 이.. 2019. 6. 4.
[Java] JVM 메모리 구조 및 옵션 JVM의 메모리 구조를 알아보겠습니다. 메모리 공간 메모리 공간은 크게 힙영역과 힙영역이 아닌 공간으로 구분할 수 있습니다. 힙영역은 사용자가 크기를 정할 수 있는 공간입니다. Method : 클래스, 변수, 함수, 정적 변수, 상수 정보 등이 저장되는 영역. 프로그램 전체에서 공유 Stack : 함수 내에서 사용되는 매개변수, 지역변수, 리턴값 등이 저장되는 구역. PC Register: CPU의 Register와 역할이 비슷하고, 현재 수행중인 JVM 명령의 주소값이 저장 Native Method Stack: 네이티브 메소드 호출을 위해 할당되는 구역 Heap : new 명령어로 생성된 객체가 저장되는 영역. GC의 대상이 되는 영역 힙 영역 구조 힙영역은 가비지 콜렉션(GC)의 대상이 되는 영역입니.. 2019. 6. 4.
[java] 자바 가상 머신(JVM : Java Virtual Machine) JVM은 자바 파일(.java)을 컴파일하여 생성한 자바 바이트 코드(.class)를 해석하여 실행하는 인스턴스입니다. 자바는 한번 쓰고, 여러곳에서 사용하는 것을 목표로 하기 때문에 플랫폼에 독립적인 자바 바이트 코드를 생성하여 실행합니다. JVM은 각 플랫폼에 맞게 구현되고, 자바 바이트 코드가 각 플랫폼의 JVM위에서 동작합니다. JVM은 정해진 규격에 맞게 구현되기 때문에 바이트 코드가 같은 결과를 내는 것은 보장합니다. 하지만 처리 속도는 보장하지 않습니다. 각 제조사마다 세부적인 구현은 다르기 때문입니다. JVM의 종류는 다음의 위키에서 확인할 수 있습니다. 그 중에서 오라클의 HotSpot과 IBM JVM이 유명합니다. https://en.wikipedia.org/wiki/List_of_Ja.. 2019. 6. 3.
[java] Executor 클래스를 이용한 멀티 스레드 실행 예제 Executors 클래스를 이용한 멀티 스레드 실행 예제입니다. import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class SchedulerExecutorSample { public static void main(String[] args) { // scheduleAtFixedRate(실행가능객체, 지연시간, 주기, 단위) Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new TimeRunnable(), 0, 1, TimeUnit.SE.. 2019. 4. 19.
[java] 스트림을 이용한 맵리듀스 워드카운트 예제 자바의 스트림을 이용한 맵리듀스 워드카운트 예제는 다음과 같이 작성합니다. 리스트 문자열을 받아서 공백을 기준으로 분할하여 단어의 개수를 세어줍니다. collect()를 이용하여 편리하게 구현할 수 있습니다. 2019. 4. 8.
아파치 커먼즈(Apache Commons) CLI 예제 아파치 커먼즈의 CLI 라이브러리는 프로그램을 실행 할 때 전달하는 옵션값을 파싱하는 라이브러리 입니다. CLI 공식 문서에서 제공하는 Ant 옵션 파싱 예제를 통해 사용방법을 알아보겠습니다. Ant는 다음과 같은 옵션을 가지고 있습니다. ant [options] [target [target2 [target3] ...]] Options: -help print this message -projecthelp print project help information -version print the version information and exit -quiet be extra quiet -verbose be extra verbose -debug print debugging information -emacs p.. 2019. 3. 30.
아파치 커먼즈(Apache Commons) 라이브러리 아파치 커먼즈는 자바로 구현된 라이브러리가 모여있는 프로젝트 입니다. 아파치 커먼즈 홈페이지에서 다운로드 방법과 사용방법을 확인할 수 있습니다. 자주 사용되는 CLI, Collections, DBCP, StringUtils(lang) 등의 라이브러리가 여기에 포함됩니다. 커먼즈 라이브러리는 다음의 세가지 종류가 있습니다. Commons Proper 현재 공개되어 운영 중인 라이브러리 Commons Sandbox 개발중인 라이브러리 Commons Dormant 현재 활동이 없어 거의 개발 되지 않는 라이브러리 Commons Proper 종류 컴포넌트 설명 최신버전 최신배포일자 BCEL 바이트 코드 엔지니어링 라이브러리 - 바이트 코드 분석, 생성, 자바 클래스 변환 6.3 2019-01-28 CLI CLI.. 2019. 3. 29.
[오류] Comparison method violates its general contract! 예외 Java 에서 배열 정렬중에 다음과 같은 오류가 발생할 때가 있다. Comparison method violates its general contract! Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:773) at java.util.TimSort.mergeAt(TimSort.java:510) at java.util.TimSort.mergeForceCollapse(TimSort.java:453) at java.util.TimSort.sort(TimSort.java:250) at .. 2018. 4. 3.
[java] Iterator의 Fail-Fast 방식과 Fail-Safe 방식의 차이점 Fail-Fast와 Fail-Safe 방식의 차이는 다음과 같다. Fail-Fast 방식은 동작중 오류가 발생하면 바로 오류를 알리고, 작업을 중단합니다. Fail-Safe 방식은 동작중 오류가 발생하도 작업을 중단하지 않고 진행합니다. 자바에서는 Iterator가 for 문을 이용한 순환중 데이터가 변경되었을때 Fail-Fast 방식이면 java.util.ConcurrentModificationException 오류를 throw 하고, Fail-Safe 방식이면 동작이 계속된다. Fail-Safe 방식은 ConcurrentHashMap 을 이용할 때만 가능하다. 구현 방법은 다음과 같다. 2018. 3. 6.
[java] HashMap과 HashTable의 차이 HashTable은 자바 1.0 부터 구현된 객체이고, HashMap은 Collections API 에 제공되었다. HashMap은 계속 개선되어 가고 있지만, HashTable은 변경되지 않고 있다. HashTable은 하위 호환성을 위해 존재한다고 볼 수 있다. 가장 큰 차이점은 동기화이다. HashTable은 동기화 되지만, HashMap은 동기화 되지 않는다. HashMap의 동기화를 원한다면 ConcurrentHashMap을 이용하는 것이 좋다. https://stackoverflow.com/questions/40471/differences-between-hashmap-and-hashtable 2018. 3. 6.
[java][디자인패턴] Template Method 패턴 구체적인 처리를 하위 클래스에게 위임하는 패턴이다. 상위 클래스에서 처리의 흐름을 정하고, 하위 클래스에서 구체적인 내용을 결정하는 디자인 패턴을 말한다. 로직을 공통화 할 수 있다. 상위 클래스와 하위 클래스의 제휴 https://github.com/developer-sdk/DesignPattern-Java/tree/master/DesignPattern-Java/src/chap03template 2018. 2. 27.
[java][디자인패턴] Adapter 패턴 '이미 제공되어 있는 것'과 '필요한 것' 사이의 간격을 메우는 디자인 패턴이 어댑터(Adapter) 패턴어댑터 패턴은 랩퍼(Wrapper) 패턴이라고도 한다. 상속(클래스)을 이용하는 것과 인스턴스에 의한 어댑터 패턴을 이용하는 것이 존재 어댑터 패턴은 기존의 클래스를 수정해서 필요한 클래스를 만듭니다. 이 패턴에 의해 필요한 메소드를 재빨리 만들 수 있습니다. 만약 버그가 발생하더라도 기존의 클래스에는 버그가 없기 때문에 어댑터 클래스만 확인하면 되기 때문에 문제점 해결이 빨라집니다. 예제 GitHub 링크 2018. 2. 26.
[java] SimpleDateFormat 을 이용한 날짜 변환 자바에서 SimpleDateFormat 클래스를 이용하여 날짜를 패턴을 이용하여 출력할 수 있다. unixtime을 date 로 변환하는 것도 가능하고,그 반대의 경우도 가능하다. 다음과 같은 형태로 변환이 가능하다. 적용 가능한 패턴은 javadoc을 참고하면 더 좋을 것이다. 그리고 사용에 유의해야 할 점은 Y, y의 대소문자에 따라 내용이 달라 질 수 있기 때문에 년도의 패턴을 잘 구분하여 사용해야 한다. Y는 주차에 따른 년도이고, y는 해당일의 년도이다. 주차에 따른 년도(week year)년 1년이 52주이기 때문에 그에 따른 년도를 출력한다. 그래서 사용상에 주의해야 한다. 2014-12-31Mon Jan 09 00:00:00 KST 2017----------------------2013 2.. 2018. 1. 9.
[Java] Queue 구현 큐는 배열을 이용한다. head, tail의 인덱스를 알려주는 변수를 이용하여 구현할 수 있다. 데이터를 입력할 때 tail을 증가시키고,데이터를 반환할 때는 head를 증가시킨다. 2017. 12. 26.
[예제] Http의 GET, POST 방식으로 데이터 송수신 하기 Java 에서 HTTP로 데이터를 송, 수신하기 위해서는 HttpURLConnection 클래스를 이용한다. http://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/ http://stackoverflow.com/questions/1432961/how-do-i-make-httpurlconnection-use-a-proxy 2017. 12. 13.