레이블이 Windows인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Windows인 게시물을 표시합니다. 모든 게시물 표시

2020년 6월 23일 화요일

윈도우 서버에서 영문 요일을 구하여 오라클 백업 배치 파일 작성

@echo off
for /f %%i in ('powershell ^(get-date^).DayOfWeek') do set week=%%i
cd c:\backup
del %week%_*.* /q
exp ID/PW file=%week%_backup.dmp log=%week%_backup.log statistics=none

Task Manager에서 작업할 내용을 추가
 - 로그인 안돼어 있을 경우에도 실행되도록 설정
























 - 실행할 시간 설정
























 - 수행할 배치 파일 설정

2019년 1월 15일 화요일

윈도우즈 7, 8, 10 DISM 또는 SFC 명령을 이용한 시스템 파일 복구

[출처 : http://blog.naver.com/ ]

Windows OS를 사용하다 보면 시스템 파일의 이미지 손상으로 오작동하는 경우가 있습니다.


DISM 또는 SFC 명령을 이용한 시스템 파일 복구 방법을 정리했습니다.

아래의 작업 방법은 윈도우즈8.1기준으로 설명합니다. 윈도우즈10도 같습니다. 윈도우즈7은 sfc /scannow 만 실행합니다.



작업 방법 1. Windows 구성 요소 저장소에서 시스템 파일 손상 여부 확인 및 복구

1.  윈도우즈 로고 + X 키를 누르고 명령 프롬프트(관리자)를 선택합니다. 아래 명령어 입력 후 enter를 누룹니다.(입력이 어려울 경우 복사 후 명령 프롬프트에서 마우스 우측 키를 누르고  붙여넣기 합니다.)

2. 손상을 복구할 수 있는지 여부를 확인 점검합니다.

Dism /Online /Cleanup-Image /CheckHealth


3. 선택적 실행. 이미지에서 손상된 구성 요소 저장소를 검사합니다. 이 작업은 20 %에서 잠시 멈추어 있습니다. PC에 따라 완료되는 시간이 오래 소요될 수 있습니다.(20분 이상)

Dism /Online /Cleanup-Image /ScanHealth

4. 이미지에서 손상된 구성 요소 저장소를 검사한 다음 자동으로 복구 작업을 합니다. 이 작업은 20 %에서 잠시 멈추어 있습니다. PC에 따라 완료되는 시간이 오래 소요될 수 있습니다.(20분 이상)

Dism /online /cleanup-image /restorehealth

5.  이 후 다음 명령을 이용하여 시스템 검사를 시도 합니다. PC에 따라 완료되는 시간이 오래 소요될 수 있습니다.(20분 이상) 시스템 파일에 문제가 있는지를 탐색하며, 복구가 가능한 부분은 복구가 진행이 됩니다.

sfc /scannow

6. 오류 메시지가 출력되면 Dism.exe는 작업 방법 2 번을 참고해 오류를 수정합니다. sfc.exe 는 작업 방법 3번을 참고해 복구를 시도해 봅니다.

7. 시스템을 다시 시작하신 후 이후에 문제점을 확인합니다

참고:

DISM 또는 시스템 업데이트 준비 도구를 사용하여 Windows 손상 오류 수정

https://support.microsoft.com/ko-kr/kb/947821



/////////////////////////////////////////////////////////////////////////////////////////////////////////





작업 방법 2: Dism.exe 명령으로 윈도우즈 설치 파일을 이용해 복원하기

1. 실행하고 있는 윈도우즈의 버전을 확인합니다.

윈도우즈 로고 + R 키를 누르고 실행 창에서 아래의 명령을 입력 후 확인을 누룹니다.

winver

2. OS 버전을 확인하셨다면 현재 실행하고 있는 OS와 같은 설치 파일이 필요합니다.

설치 디스크가 있을 경우 디스크를 이용하시면 돼고 없을 경우 아래의 사이트에서 현재 실행하고 있는 OS와 같은 ISO 설치 파일을 다운로드 받습니다.

Windows 7 디스크 이미지(ISO 파일) 다운로드

https://www.microsoft.com/ko-kr/software-download/windows7

Windows 8.1용 설치 미디어 만들기

http://windows.microsoft.com/ko-kr/windows-8/create-reset-refresh-media

윈도우즈10 다운로드

https://www.microsoft.com/ko-kr/software-download/windows10

3. 윈도우즈 로고 + X키를 누르고 파일 탐색기를 실행 후 다운로드 받은 *.iso 파일을 더블 클릭합니다. 가상 디스크가 설치된 드라이버 명을 확인합니다.

4. 윈도우즈 로고 + X 키를 누르고 명령 프롬프트(관리자)를 선택합니다. 아래의 명령 입력 후 설치 파일의 인덱스 번호를 확인합니다. G는 파일 탐색기에서 확인된 윈도우즈 가상 디스크의 설치 파일의 드라이버 명입니다. 입력이 어려울 경우 복사 후 마우스 우측키를 누르고 명령 프롬프트에 붙여넣기합니다.

dism /Get-WimInfo /wimFile:G:\sources\install.wim

또는

dism /Get-WimInfo /wimFile:G:\sources\install.esd

인덱스 확인 후 더 자세한 정보를 볼려면 아래의 명령을 입력합니다. 마지막 1은 확인한 인덱스 번호 2이면 2로 변경함

dism /Get-WimInfo /wimFile:G:\sources\install.wim /Index:1

또는

dism /Get-WimInfo /wimFile:G:\sources\install.esd /Index:1

5. 인덱스 번호와 install.wim 파일의 경로를 지정합니다. 아래의 명령 중 하나를 선택 후 입력합니다. 마지막의 1은 인텍스 번호입니다. 2일 경우 2로 변경합니다. 검사가 100% 완료가 되면, 결과 메시지를 확인합니다

Dism /Online /Cleanup-Image /RestoreHealth /Source:wim:G:\sources\install.wim:1

또는

Dism /Online /Cleanup-Image /RestoreHealth /Source:wim:G:\sources\install.wim:1 /limitaccess

다운로드 받은 파일이 install.esd 파일일 경우 아래의 명령 중 하나를 선택 후 입력합니다.

Dism /Online /Cleanup-Image /RestoreHealth /Source:esd:G:\sources\install.esd:1

또는

Dism /Online /Cleanup-Image /RestoreHealth /Source:esd:G:\sources\install.esd:1 /limitaccess

또는 C:$Windows.~BT 폴더 설치 파일이 있을 경우

Dism /Online /Cleanup-Image /RestoreHealth /Source:esd:C:\$Windows.~BT\Sources\Install.esd:1 /limitaccess

참고:

DISM - Repair Windows 10 Image

http://www.tenforums.com/tutorials/7808-dism-repair-windows-10-image.html

6. 시스템을 다시 시작합니다. 아래의 명령을 입력 후 최종적으로 확인해 봅니다

손상을 복구할 수 있는지 여부를 확인 점검합니다.

Dism /Online /Cleanup-Image /CheckHealth


https://youtu.be/o7eExyPMqRY



/////////////////////////////////////////////////////////////////////////////////////////////////////////





작업 방법 3: SFC.exe 명령 실행 후 C:\Windows\WinSxS 폴더를 이용해 손상된 시스템 파일을 직접 찾아 복원하기

1. 윈도우즈 로고 + X 키를 누르고 명령 프롬프트(관리자)를 선택합니다. (입력이 어려울 경우 복사 후 명령 프롬프트에서 마우스 우측 키를 누르고  붙여넣기 합니다.) sfc /scannow 명령 실행 후 오류가 있을 경우 C:\Logs\CBS\CBS.log 파일을 확인 후 파일을 복구할 것입니다. 아래의 명령을 입력하면 바탕화면에 sfcdetails.txt 파일이 생성됩니다. CBS.log 파일의 오류 정보를 추출합니다.

findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log >"%userprofile%\Desktop\sfcdetails.txt"

Sfcdetails.txt 파일에는 다음과 같은 형식을 사용합니다.

12:31:20, Info                  CSI    000026ba [SR] Repairing corrupted file [l:23 ml:24]"\??\C:\Windows\System32"\[l:9]"Accessibility.dll" from store

2. 파일의 손상되지 않은 복사본으로 손상된 시스템 파일을 직접 대체하는 방법을 시도할 것입니다.

윈도우즈 로고+E 키를 누르고 파일 탐색기를 실행합니다. 아래의 경로를 찾아 갑니다.

C:\Windows\WinSxS

3. 바탕화면에서 sfcdetails.txt  파일을 열어 오류 정보를 확인해 봅니다. 로그 파일의 정보로 오류 파일명을 확인 후 복구해 볼수 있습니다. 예) C:\windows\system32\Accessibility.dll 파일에 오류가 있다면 파일 탐색기에서 오른쪽 상단에 Accessibility.dll 파일명을 입력 후 키보드에서 enter 키를 누룹니다. Accessibility.dll 파일을 검색합니다.

4. Accessibility.dll 파일을 검색 후 없을 경우는 작업방법4로 넘어갑니다. Accessibility.dll 파일이 있을 경우 다음 작업을 이여합니다.

5. 오류가 있는 C:\windows\system32\Accessibility.dll 파일의 경로에 보안 접근 권한때문에 Accessibility.dll 파일을 붙여넣기할 수 없습니다. 파일 접근 권한을 변경할 것입니다.

6. 명령 프롬프트에서 아래의 명령을 입력 후 키보드에서 enter 키를 누룹니다. 손상된 시스템 파일의 소유권을 획득합니다.

예)

takeown /f C:\windows\system32\Accessibility.dll
또는

지정한 디렉터리 및 모든 하위 디렉터리에 도구가 작동하도록 지정
takeown /F C:\windows\system32\Accessibility.dll /R

7. 관리자가 손상된 시스템 파일에 대한 모든 권한 획득합니다.

예)

icacls C:\windows\system32\Accessibility.dll /grant administrators:F
또는

이름에 지정된 디렉터리 아래의 일치하는 모든 파일/디렉터리에서 이 작업을 수행하도록 지정
icacls C:\windows\system32\Accessibility.dll /grant administrators:F /T /C

8. C:\Windows\WinSxS 폴더에서 검색한 Accessibility.dll 파일을 선택 후 마우스 우측 키를 누르고 복사합니다.

9. 파일 탐색기를 이용해 C:\windows\system32\Accessibility.dll 파일이 있는 경로를 찾아갑니다.

10. 복사한 Accessibility.dll 파일을 C:\windows\system32 경로에 붙여넣기합니다. 파일을 손상되지 않은 복사본으로 손상된 시스템 파일을 대체합니다.  시스템에서 파일을 사용할 경우 복사 후 붙여넣기할 수 없을 수도 있습니다. 안전모드 명령 프롬프트로 진입하신 후 설치해 볼 수도 있습니다.

11. 이 전에 변경한 파일 보안 접근 권한을 복구해 주어야합니다. 보안을 강화하기 위해 접근 권한을 변경할 것입니다. TrustedInstaller 가 소유 권한을 가집니다.

예)

icacls C:\windows\system32\Accessibility.dll /setowner "NT SERVICE\TrustedInstaller"

또는

icacls C:\windows\system32\Accessibility.dll /setowner "NT SERVICE\TrustedInstaller" /T /C

12.  administrators 는 읽기 및 실행 권한을 가집니다.  계속 sfcdetails.txt 파일에서 오류 파일을 찾아 반복합니다. 3번에서 12까지 박복합니다.

예)

icacls C:\windows\system32\Accessibility.dll /grant:r administrators:RX

또는

icacls C:\windows\system32\Accessibility.dll /grant:r administrators:RX  /T /C

13. 시스템을 다시 시작합니다. sfc /VERIFYONLY 명령을 입력 후 최종적으로 확인해 봅니다.

https://youtu.be/1ckLl8WaKDQ



/////////////////////////////////////////////////////////////////////////////////////////////////////////



작업 방법 4: SFC.exe 명령 실행 후 윈도우즈 설치 파일을 이용해 손상된 시스템 파일을 직접 찾아 복원하기

1. 윈도우즈 로고 + X 키를 누르고 명령 프롬프트(관리자)를 선택합니다. (입력이 어려울 경우 복사 후 명령 프롬프트에서 마우스 우측 키를 누르고  붙여넣기 합니다.) sfc /scannow 명령 실행 후 오류가 있을 경우 C:\Logs\CBS\CBS.log 파일을 확인 후 파일을 복구할 것입니다. 아래의 명령을 입력하면 바탕화면에 sfcdetails.txt 파일이 생성됩니다. CBS.log 파일의 오류 정보를 추출합니다.

findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log >"%userprofile%\Desktop\sfcdetails.txt"

Sfcdetails.txt 파일에는 다음과 같은 형식을 사용합니다.

12:31:20, Info                  CSI    000026ba [SR] Repairing corrupted file [l:23 ml:24]"\??\C:\Windows\System32"\[l:9]"Accessibility.dll" from store

2. 실행하고 있는 윈도우즈의 버전을 확인합니다.

윈도우즈 로고 + R 키를 누르고 실행 창에서 아래의 명령을 입력 후 확인을 누룹니다.

winver

3. OS 버전을 확인하셨다면 현재 실행하고 있는 OS와 같은 설치 파일이 필요합니다.

설치 디스크가 있을 경우 디스크를 이용하시면 돼고 없을 경우 아래의 사이트에서 현재 실행하고 있는 OS와 같은 설치 파일을 다운로드 받습니다.

Windows 7 디스크 이미지(ISO 파일) 다운로드

https://www.microsoft.com/ko-kr/software-download/windows7

Windows 8.1용 설치 미디어 만들기

http://windows.microsoft.com/ko-kr/windows-8/create-reset-refresh-media

윈도우즈10 다운로드

https://www.microsoft.com/ko-kr/software-download/windows10



4. 파일의 손상되지 않은 복사본으로 손상된 시스템 파일을 직접 대체하는 방법을 시도할 것입니다. 먼저 윈도우즈 로고 + X 키를 누르고 디스크 관리를 선택합니다. 새로운 파티션을 하나 생성합니다. 5GB하나 생성 후 새 파티션에 윈도우즈 시스템 파일을 마운트할 것입니다. 5120을 입력하시면 5GB를 만들 수 있습니다. 작업이 끝난 후 윈도우즈 시스템 파일을 손쉽게 지울수도 있습니다. 아래의 링크 참고합니다.

윈도우즈8 파티션 나누기

http://www.nextstep.co.kr/234



5. 윈도우즈 로고 + X키를 누르고 파일 탐색기를 실행 후 다운로드 받은 *.iso 파일을 더블 클릭합니다. 가상 디스크가 설치된 드라이버 명을 확인합니다.

6. 윈도우즈 로고 + X 키를 누르고 명령 프롬프트(관리자)를 선택합니다. 아래의 명령 입력 후 인덱스 번호를 확인합니다. G는 파일 탐색기에서 확인된 윈도우즈 가상 디스크의 설치 파일의 드라이버명입니다.

예)

dism /Get-WimInfo /wimFile:G:\sources\install.wim

또는

dism /Get-WimInfo /wimFile:G:\sources\install.esd

인덱스 확인 후 더 자세한 정보를 볼려면 아래의 명령을 입력합니다. 마지막 1은 확인한 인덱스 번호 2이면 2로 변경함

dism /Get-WimInfo /wimFile:G:\sources\install.wim /Index:1

또는

dism /Get-WimInfo /wimFile:G:\sources\install.esd /Index:1

7. 디스크 관리로 만든 새 파티션에 mount 폴더를 하나 만들어 놓습니다. 파일 탐색기로 install.wim 파일의 경로을 확인 후 아래의 명령을 입력합니다. 1은 인덱스 번호, H:\mount 는 디스크 관리로 새로 만든 파티션에 윈도우즈 설치 파일의 압축을 풀 폴더 경로입니다.

예)

Dism /Mount-Image /ImageFile:G:\sources\install.wim /index:1 /MountDir:H:\mount /ReadOnly

install.esd 는 install.wim 파일로 변경 후 작업을 해야합니다.  H:\mountWIM 폴더를 하나 만듭니다. 이 작업은 pc의 성능에 따라 최소 1시간 이상의 시간이 걸릴 수도 있습니다. 6번을 참고해 인텍스 번호를 확인 후 명령을 입력합니다.

dism.exe /Export-Image /SourceImageFile:G:\sources\Install.esd /SourceIndex:1 /DestinationImageFile:H:\mountWIM\Install.wim /Compress:max

Install.wim 파일을 mount 폴더에 압축을 해제합니다.

Dism /Mount-Image /ImageFile:H:\mountWIM\Install.wim /index:1 /MountDir:H:\mount /ReadOnly

참고:

DISM을 사용하여 이미지 탑재 및 수정

https://technet.microsoft.com/ko-kr/library/hh824814.aspx?f=255&MSPPError=-2147217396

install.esd 를 install.wim 변경 방법

http://deploymentresearch.com/Research/Post/445/Deploying-Windows-10-build-9860-using-MDT-2013-Lite-Touch

8. 바탕화면에서 sfcdetails.txt  파일을 열어 오류 정보를 확인해 봅니다. 로그 파일의 정보로 오류 파일명을 확인 후 복구해 볼수 있습니다. 예) C:\windows\system32\Accessibility.dll 파일에 오류가 있다면 파일의 경로를 확인 후 아래의 명령처럼 입력합니다. 손상된 시스템 파일의 소유권을 획득합니다.

예)

takeown /f C:\windows\system32\Accessibility.dll
또는

지정한 디렉터리 및 모든 하위 디렉터리에 도구가 작동하도록 지정
takeown /F C:\windows\system32\Accessibility.dll /R

9. 관리자가 손상된 시스템 파일에 대한 모든 권한 획득합니다.

예)

icacls C:\windows\system32\Accessibility.dll /grant administrators:F
또는

이름에 지정된 디렉터리 아래의 일치하는 모든 파일/디렉터리에서 이 작업을 수행하도록 지정
icacls C:\windows\system32\Accessibility.dll /grant administrators:F /T /C

10.  손상되지 않은 복사본으로 손상된 시스템 파일을 대체합니다. 이렇게 하려면 마운트한 H:\mount 드라이버에서 H:\mount\windows\system32\Accessibility.dll 파일을 찾아 C:\windows\system32\Accessibility.dll  파일을 선택 후 마우스 우측키를 눌러 복사 및 붙여넣기 하거나 아래의 명령을 입력후 enter 키를 누릅니다. 시스템에서 파일을 사용할 경우 복사 후 붙여넣기할 수 없을 수도 있습니다. 안전모드 명령 프롬프트로 진입하신 후 설치해 볼 수도 있습니다.

예)

xcopy H:\mount\windows\system32\Accessibility.dll C:\windows\system32\Accessibility.dll

또는

비어 있는 경우를 포함하여 디렉터리와 하위 디렉터리를 복사

xcopy H:\mount\windows\system32\Accessibility.dll C:\windows\system32\Accessibility.dll /E

11. 보안을 강화하기 위해 접근 권한을 변경할 것입니다. TrustedInstaller 가 소유 권한을 가집니다.

예)

icacls C:\windows\system32\Accessibility.dll /setowner "NT SERVICE\TrustedInstaller"

또는

icacls C:\windows\system32\Accessibility.dll /setowner "NT SERVICE\TrustedInstaller" /T /C

12.  administrators 는 읽기 및 실행 권한을 가집니다.  계속 sfcdetails.txt 파일에서 오류 파일을 찾아 반복합니다. 8번에서 12까지 박복합니다.

예)

icacls C:\windows\system32\Accessibility.dll /grant:r administrators:RX

또는

icacls C:\windows\system32\Accessibility.dll /grant:r administrators:RX  /T /C

13. 시스템을 다시 시작합니다. sfc /VERIFYONLY 명령을 입력 후 최종적으로 확인해 봅니다.

14. 디스크 관리로 새로 생성한 파티션을 합칩니다. 마운트한 윈도우즈  설치 파일이 제거 됩니다.

참고:

시스템 파일 검사기 도구를 사용하여 손실되거나 손상된 시스템 파일을 복구하려면

https://support.microsoft.com/ko-kr/kb/929833

2018년 5월 28일 월요일

Windows에서 Bat로 ftp 파일 가져오기

[ 출처 : http://cafe.naver.com/ ]

Windows에서 Bat로 ftp 파일 가져오기

open xx.xx.xx.xx
ftpid xx
ftppasswd xxxx
bin
hash
prompt
put "x:\xxxx\xxxx\xxxx.dmp"
quit

2018년 5월 16일 수요일

Windows에서 날짜 시간을 파일명으로 쓰기

[출처 : http://www.dreamy.pe.kr/ ]

[방법 1]
@set YEAR=%date:~0,4%
@set MONTH=%date:~5,2%
@set DAY=%date:~8,2%
@set HOUR=%time:~0,2%
@set MINUTE=%time:~3,2%
@set SECOND=%time:~6,2%

@set POSTFIX=%YEAR%-%MONTH%-%DAY%_%HOUR%-%MINUTE%-%SECOND%

mkdir "log_%POSTFIX%"
cd "log_%POSTFIX%"


[방법 2]
@set YEAR=%date:~0,4%
@set MONTH=%date:~5,2%
@set DAY=%date:~8,2%
@set HOUR=%time:~0,2%
@set MINUTE=%time:~3,2%
@set SECOND=%time:~6,2%

@set POSTFIX=%YEAR%-%MONTH%-%DAY%_%HOUR%-%MINUTE%-%SECOND%

mkdir "log_%POSTFIX%"
cd "log_%POSTFIX%"

추가 Cammand창의 언어 코드 변환하기
CHCP 437  <-- 영문으로 변경
CHCP 949  <-- 한글로 변경

[출처 :  https://serverfault.com/ ]
파워셀을 이용한 방식

@echo off
for /f %%i in ('powershell ^(get-date^).DayofWeek') do set week=%%i
echo %week%

*Output
Sunday

#현재일에서 하루를 빼 줄 경우 
for /f %%i in ('powershell ^(get-date^).AddDay(-1)') do set week=%%i
echo %week%

* Output
Saturday

#현재일자 출력 포맷 변경시
for /f %%i in ('powershell ^(get-date -uFormat %y%m%d^).AddDay(-1)') do set date=%%i
echo %date%

* Output
191001

2017년 5월 24일 수요일

시트 보호 비밀번호 없이 해제 하기

[ 출처 : http://blog.naver.com/ ]

시트 보호가 되어 있는 엑셀 문서일 경우 비밀번호를 모르면 내용 편집이 불가할 때 편법으로 수정할 수 있는 방법임.
1. 시트 보호된 엑셀 파일을 임의의 위치에 저장하고 확장자를 ZIP로 변경하고 압축을 푼다.







2. 압축을 푼 폴더의 xl\worksheets\sheet1.xml 파일을 메모장으로 연다.
sheetProtection로 시작해서 scenarios="1"로 끝나는 부분을 삭제









3. 해당 파일 저장 후 재압축 후 확장자를 xlsx로 변경한 후 파일을 열면 수정 가능함.







2016년 10월 10일 월요일

마우스 우클릭 막은 사이트 해제하기


파이어폭스의 부가기능 Greasemonkey의스크립터를 이용한 방법
http://userscripts.org/로 이동하여 검색 기능에 naver로 검색한다.
 검색결과중 Anti-Disabler for Naver Pro+Last Update를 설치한다.
















2016년 8월 17일 수요일

CMD 명령어를 활용한 시스템 분석 – 여러가지 명령어들

[출처 : http://www.sharedit.co.kr/ ]


<CMD 명령어 모음>
모든 명령어는 win + R키나 cmd 명령창에서 실행하실 수 있습니다
아랫쪽에 SYSINTERNALS 도구와 NIRSOFT 도구, 기타 명령어 목록도 있습니다

$$ CMD 명령어
$ .MSC

eventvwr.msc(이벤트뷰어)
gpedit.msc(로컬 그룹 정책 설정)
secpol.msc(로컬 보안 설정)
wmimgmt.msc(WMI 관리자)
certlm.msc (인증서관리자 – 로컬컴퓨터)
certmgr.msc(인증서관리자 – 현재사용자)
fsmgmt.msc(공유폴더)
lusrmgr.msc(로컬 사용자 및 그룹)
printmanagement.msc(프린터 관리)
wf.msc(방화벽고급관리자)
devmgmt.msc (장치 관리자)(= hdwwiz.cpl)
compmgmt.msc(컴퓨터관리)
perfmon.msc(성능모니터)
taskschd.msc(작업 스케쥴러)
comexp.msc (구성요소 COM,COM+,DCOM 서비스)(= dcomcnfg.exe)




$ .EXE

$ winmgmt.exe (WMI 관리도구)
$ color.exe (프롬프트 색상을 바꿉니다)
        # 흰 색상에 검정글씨로 바꿉니다
        $ color f0


$ fsquirt.exe (블루투스를 이용한 파일 송수신)
$ getmac.exe (MAC주소를 출력하는 프로그램)
        # MAC주소를 자세히 확인합니다
        $ getmac.exe /v


$ label.exe (디스크 볼륨레이블 지정)
$ pnputil.exe (pnp 디바이스 열거/설치/삭제)
        # c:\drivers에 모든 패키지를 추가합니다
        $ pnputil.exe -a c:\drivers\*.inf

        # 패키지를 열거합니다
        $ pnputil.exe -e


$ psr.exe (단계레코더)
$ qprocess.exe (tasklist의 단순형 프로그램)
$ launchtm.exe (작업관리자)(taskmgr.exe와 동일합니다)
$ makecab.exe (cab 파일 만들기)
$ narrator.exe (음성지원 나레이터)
$ ping.exe (ping을 날리는 프로그램)
$ pathping.exe (ping + 패킷이 전달되는 루트를 추적합니다)
$ ftp.exe (ftp 클라이언트 프로그램)
$ useraccountcontrolsettings.exe (UAC 세팅)
$ bdehdcfg.exe (bitlocker 드라이브 준비도구)
$ dfrgui.exe (디스크 조각 모음)
$ changepk.exe (윈도우즈 제품키 입력)
$ certutil.exe (인증서 유틸리티)
$ diskpart.exe (디스크 파티션 설정)
$ eventcreate.exe (사용자 지정 이벤트 생성)
$ chkntfs.exe (디스크검사 예약)
        $ chkntfs.exe c: /c

$ chkdsk.exe (디스크 검사)
$ certreq.exe (요청을 인증기관으로 제출하는 유틸리티)
$ mrt.exe(악성소프트웨어 제거도구)
$ cprintui.exe(프린터 UI)
$ sigverif.exe(File Signature Verification Tool)
$ resmon.exe(리소스 모니터)
$ robocopy.exe (견고한 파일복사)
        # desktop에 있는 파일들을 c:\test에 복사합니다
        # 비어있는 디렉토리 제외, Multi Thread 20개 사용, 복사실패 시 1번 재시도, 대기시간 1초, 7개의 하위디렉토리 복사
        $ robocopy.exe C:\Users\edward\Desktop c:\test /S /MT:20 /R:1 /W:1 /LEV:7



$ xcopy.exe (파일복사 프로그램)
        # deskop에 있는 파일들을 c:\test에 복사합니다
        # 하위 디렉토리, 오류가 생겨도 계속 복사, 조용히 복사, 겹치는 파일 묻지 않고 복사, 특성을 복사, 숨겨진파일과 시스템파일 모두 복사합니다
        $ xcopy.exe C:\Users\edward\Desktop c:\test /s /c /q /y /k /h
        # WebcacheV01.dat 파일을 바탕화면에 복사합니다 (taskhost, dllhost 프로세스를 먼저 종료해야합니다)
        $ xcopy.exe /s /h /i /y “%Localappdata%\Microsoft\Windows\Webcache\*.dat” %userprofile%\desktop



$ copy.exe (간단한 파일복사)
$ charmap.exe(문자표)
$ wbemtest.exe(WMI 테스터)
$ magnify.exe(돋보기)
$ setx.exe
        # path 환경변수를 영구적으로 설정합니다
        $ setx.exe path “%path%;경로” /m  

$ shutdown.exe (컴퓨터 종료)
        # 컴퓨터를 바로 강제로 종료합니다
        $ shutdown.exe /s /t 0 /f

        $ shutdown.exe /r /t 0 /f
        $ shutdown.exe /l


$ tlntsvr.exe (텔넷서버실행) (추가기능 설치에서 telnet을 설치해야합니다)
$ tlntadmn.exe (텔넷서버관리) (윈도우8부터는 없어진듯합니다)
$ wbadmin.exe(윈도우 백업관리자)
$ fsutil.exe(디스크 구성 도구)
$ fltmc.exe(필터 드라이버 로딩 언로딩 목록 보기)
$ cleanmgr.exe(디스크 정리)
$ sndvol.exe (스피크 볼륨 콘트롤)
$ wevtutil.exe(이벤트로그 수집도구)
$ slidetoshutdown.exe (화면을 슬라이드해서 종료)
$ esentutl.exe(서버데이터베이스 관리 도구)
        # 해당 .dat 파일의 상태를 확인합니다
        $ esentutl.exe /mh WebCacheV01.dat
        # 해당 .dat 파일이 dirty shutdown 상태이면 clean shutdown 상태로 고쳐줍니다
        $ esentutl.exe /p WebCacheV01.dat



$ mmc.exe (콘솔 루터)
$ msconfig.exe (시스템 구성요소 유틸리티)
$ mstsc.exe (원격 데스크톱 연결)
$ odbcad32.exe(odbc 데이터 원본 관리자)
$ wuapp.exe(윈도우 업데이트)
$ dxdiag.exe (다이렉트X 정보)
$ msinfo32.exe (시스템 정보)
$ slui.exe (라이센스 등록)
$ slmgr.exe (라이센스 등록2)
        $slmgr.exe /ipk /dlv /ato


$ osk.exe (화상 키보드)
$ wmplayer.exe (미디어 플레이어)
$ mkdir.exe (디렉토리 만들기)
$ mklink.exe (바로가기 폴더 만들기)
        # aaa 폴더의 바로가기 폴더 bbb를 만듭니다
        $ mklink.exe /d c:/bbb c:/aaa


$ taskmgr.exe (작업 관리자)
$ cmd.exe (명령 프롬프트)
$ explorer.exe (윈도우 탐색기)
$ rstrui.exe(시스템복원)
$ systeminfo.exe(시스템정보)
$ taskkill.exe (프로세스 종료)
        # 메모장 프로세스를 강제로 자식노드까지 전부 종료합니다
        $ taskkill.exe /f /im “notepad.exe” /t


$ tasklist.exe (프로세스 목록)
        $ tasklist.exe /svc /fi “imagename eq <processname>”
        $ tasklist.exe /svc /fi “services eq <servicename>”
        $ tasklist.exe | find /i “explorer”

$ timeout.exe (지정된 시간을 기다리는 프로그램)
        $ timeout.exe /t 100 /nobreak

$ tskill.exe (간단한 프로세스 종료 프로그램)
$ systempropertiesadvanced.exe (시스템속성 – 고급)
$ systempropertiesdataexecutionprevention.exe (시스템속성 – 데이터실행방지 dep)
$ systempropertiecomputername.exe (시스템속성 – 컴퓨터이름)
$ systempropertieshardware.exe (시스템속성 – 장치관리자)
$ systempropertiesperformance.exe (시스템속성 – 성능옵션)
$ systempropertiesremote.exe (시스템속성 – 원격)
$ gpupdate.exe(그룹 정책 업데이트)
        $ gpupdate.exe /force


$ cmdkey.exe(자격증명 저장 관리)
        $ cmdkey.exe /add:<targetname> /user:<username> /pass:<password>

$ find.exe (특정 문자열 찾기)
        # mysql_ed.sql 파일에서 create가 들어간 구문을 찾습니다
        $ find.exe mysql_ed.sql “create” /n /i

        # abc.txt 파일의 라인 수를 셉니다
        $ find.exe /c /v abc.txt “”

        # 현재 동작하는 프로세스 중 대소문자를 구분하지 않고 sql 글자가 들어간 구문을 검색합니다
        $ tasklist.exe | find.exe /i “sql”



$ optionalfeatures.exe(윈도우 기능 켜기/끄기)
$ forfiles.exe (하위파일까지 전체탐색)(루프돌리는 배치파일 만들 때 유용)
$ regedit.exe (레제스트리 GUI 편집도구)
$ regsvr32.exe (COM 모듈 등록/해제)
$ cleanmgr.exe(Disk Clean Up)
$ rundll32.exe
        # 절전 모드
        $ rundll32.exe powrprof.dll SetSuspendState 0,1,0
        # 환경 변수
        $ rundll32.exe sysdm.cpl EditEnvironmentVariables
        # 화면 잠금
        $ rundll32.exe user32.dll LockWorkStation
        # 자격증명 저장 관리
        $ rundll32.exe keymgr.dll KRShowKeyMgr


$ runas.exe (권한상승 후 프로그램 실행)
$ snippingtool.exe(캡처도구)
$ dcomcnfg.exe(구성요소 COM,COM+,DCOM 서비스)(=comexp.msc)
$ winver.exe(윈도우버전)
$ where.exe (Linux find와 비슷한 명령어, 검색명령어)
        # 바탕화면에서 edw로 시작하는 파일을 전부 검색합니다
        $ where.exe edw* /r c:\users\gyurs\Desktop\


$ control.exe (제어판)
$ sc.exe (서비스컨트롤 명령어)
$ powercfg.exe (전원옵션 명령어)
$ soundrecorder.exe (음성 녹음기)
$ reg.exe (레지스트리 추가/수정 명령어)
        # 해당 레지스트리 값을 추가합니다 (psexec을 사용하기 위해)
        $ reg.exe add hklm\software\microsoft\windows\currentversion\policies\system /v localaccounttokenfilterpolicy /t reg_dword /d 1 /f
        # UAC 세팅을 해제합니다 (재부팅 필요)
        $ reg.exe add hklm\software\microsoft\windows\currentversion\policies\system /v enablelua /t reg_dword /d 0 /f
        # IPC$의 기본공유를 해제합니다
        $ reg.exe add hkey_local_machine\system\currentcontrolset\control\lsa\ /v restrictanonymous /t reg_dword /d 2 /f
        # ADMIN$, C$의 기본공유를 해제합니다
        $ reg.exe add hkey_local_machine\system\currentcontrolset\services\lanmanserver\parameters /v autosharewks /t reg_dword /d 0 /f


$ net.exe (네트워크 설정 명령어)

$ NET STATS
        # 시스템 마지막 부팅시간을 확인합니다
        $ net stats work

$ NET SHARE
        # IPC$ 자동공유를 중지합니다 (C$, ADMIN$도 삭제할 수 있습니다)
        $ net.exe share IPC$ /delete
        # IPC$ 자동공유를 다시 설정합니다
        $ net.exe share IPC$ /grant:gyurse,full

$ NET USER
        # ashley 라는 계정을 생성합니다. 비밀번호는 qwer1234 fullname은 Iron Man, comment는 hello guys, 계정은 활성화상태입니다
        $ net.exe user ashley qwer1234 /add /fullname:”Iron Man” /comment:”hello guys” /active:yes
        
        # ashley의 자세한 정보를 확인합니다
        $ net.exe user ashley

        # ashley 계정을 삭제합니다
        $ net.exe user ashley /delete

$ NET LOCALGROUP
        # ashleygroup 이라는 이름의 localgroup을 생성합니다 comment도 같이 생성합니다
        $ net.exe localgroup ASHLEYGROUP /add /comment:”here is ashley world”

        # ashley 계정을 ASHLEYGROUP 그룹에 추가시킵니다
        $ net.exe localgroup ASHLEYGROUP ashley /add

$ NET USE
        # localhost의 컴퓨터 자체에 계정명 ashley, 패스워드 qwer1234로 접속합니다 (사용자와 연결이 아닙니다)
        $ net.exe use \\localhost\IPC$ /user:ashley qwer1234

        # localhost의 share라는 폴더에 계정명/패스워드로 접속합니다
        $ net.exe use \\localhost\share /user:ashley qwer1234


$ NET TIME
        # localhost의 시간을 확인할 수 있습니다
        $ net time \\localhost




$ msg.exe (네트워크 사용자들에게 메세지 보내는 명령어)
        # 컴퓨터의 모든 사용자들에게 5초동안 유효한 hello guys 메세지를 보냅니다
        $ msg.exe * /v /time:5 hello guys

        # localhost의 모든 세션 사용자들에게 hello guys2 메세지를 보냅니다
        $ msg.exe * /server:localhost /v /w hello guys2



$ subst.exe (디렉토리, 주소를 가상 드라이브로 치환해주는 명령어)
        # c:\temp 경로를 X: 드라이브로 치환합니다
        $ subst.exe X: C:\temp\

        # X 드라이브에 접속합니다
        $ cmd> X:

        # 해당 치환경로를 삭제합니다
        $ subst.exe X: /d




$ netsh.exe (IP, 방화벽 등등 네트워크 설정 명령어 )

$ NETSH ADVFIREWALL (cmd> wf를 통해 확인할 수 있습니다)
        # 새로운 방화벽 허용룰을 추가합니다 이름은 TCP-445이고 tcp 445번 포트의 접속을 허용합니다
        $ netsh.exe advfirewall firewall add rule name=”TCP-445″ dir=in action=allow protocol=tcp localport=445

        # tcp-445라는 이름을 가진 방화벽 정책을 확인합니다
        $ netsh.exe advfirewall firewall show rule name=”tcp-445″

        # 현재 방화벽 설정을 파일로 저장하고 나중에 가져올 수 있습니다
        $ netsh.exe advfirewall export c:\advfirewallpolicy.wfw
        $ netsh.exe advfirewall import c:\advfirewallpolicy.wfw

        # 현재 방화벽 설정을 볼 수 있습니다
        $ netsh.exe advfirewall firewall show rule name=all | more

        # 2000 – 3000 번 포트 접속을 막습니다
        $ netsh.exe advfirewall firewall add rule name=”Block_2000_3000″ dir=in action=block protocol=tcp localport=2000-3000


$ NETSH INTERFACE
        # 네트워크 인터페이스 목록을 확인합니다
        $ netsh.exe interface show interface

        # 모든 네트워크 인터페이스 목록을 확인합니다
        $ netsh.exe interface dump

        # 원격포트가 443번인 모든 ipv4 tcp 연결을 확인합니다
        $ netsh.exe interface ipv4 show tcpconnections remoteport=443

        # ipv4 프로토콜의 여러 매개변수들을 확인합니다
        $ netsh.exe interface ipv4 show global

        # 현재 네트워크카드의 IP 관련된 설정을 확인합니다
        $ netsh.exe interface ipv4 show config

        # IP를 DHCP로 설정합니다
        $ netsh.exe interface ip set address name =”Ethernet” source=dhcp
        $ netsh.exe interface ip set dns “Ethernet” dhcp



$ .CPL (CONTROL PANEL 제어판)

$ powercfg.cpl(전원옵션)
$ firewall.cpl(방화벽 관리)
$ desk.cpl(디스플레이)
$ appwiz.cpl(프로그램추가/제거)
$ main.cpl(마우스)
$ mmsys.cpl(사운드 및 오디오장치)
$ hdwwiz.cpl (장치관리자)(= devmgmt.msc)
$ sysdm.cpl(시스템속성)
$ inetcpl.cpl(인터넷속성)
$ netplwiz.cpl(사용자계정2) (= control userpasswords2)
$ ncpa.cpl(네트워크 연결)
$ wscui.cpl(관리센터)
$ timedate.cpl(날짜 시간 속성)
$ control /name Microsoft.NetworkandSharingCenter(네트워크 공유센터)
$ control desktop(개인 설정)
$ control /name Microsoft.Troubleshooting(문제해결)
$ control userpasswords(사용자 계정)
$ control userpasswords2 (사용자계정2) (= netplwiz)
$ control printers(장치 및 프린터)
$ control folders(폴더옵션)
$ control keyboard(키보드 옵션)
$ control admintools(관리 도구)




———————————————————————————————————–
<SYSINTERNALS & NIRSOFT 명령어>
$$ SYSINTERNALS 명령어

$ psexec.exe (원격명령어 실행 도구)
        # 원격컴퓨터에서 실행해야할 명령어들
        # ADMIN$, IPC$ 공유가 설정되어있어야 합니다
        $ net.exe share

        # 타겟컴퓨터에 해당 레지스트리 값을 추가합니다
        $ reg.exe add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

        # 타겟컴퓨터에 445번 포트를 개방합니다
        $ netsh.exe advfirewall firewall add rule name=”TCP-445″ dir=in action=allow protocol=tcp localport=445

        # 타겟컴퓨터 Start -> Run -> secpol.msc -> Local Policies -> Security Options -> Network Access: Sharing > and security model for local accounts > Classic – local users authenticate as themselves

        # 내컴퓨터, psexec 명령어를 사용합니다
        $ psexec \\172.30.1.15 -u <hostname> -p <password> <command>



$$ NIRSOFT 명령어
$ nircmd.exe (nirsoft cmd)
        # 프로그램을 hide 모드로 실행합니다
        $ nircmd.exe exec hide <processname>




———————————————————————————————————-
<기타 여러 프로그램들 명령어>
$$ 기타 여러 프로그램들 명령어

$ pscp.exe (putty 파일 전송 프로그램)
        # pscp를 이용해 tempuser 계정과 qwer1234 비밀번호를 사용해서 원격에  tigerk 하위폴더의 모든 내용을 내 컴퓨터의 바탕화면에 복사합니다
        $ pscp.exe -r -pw qwer1234 tempuser@210.113.90.70:C:\\Users\\tigerk0430\\Desktop\\tigerk c:\\users\\gyurs\\Desktop

2016년 6월 17일 금요일

Windows 성능 분석 – CPU 성능데이터 분석

[ 출처 : https://codeclassic.wordpress.com/ ]

Windows에 내장된 성능모니터를 사용하면, 원하는 기간에 대한 서버 또는 PC의 시스템 자원 활용도를 분석할 수 있습니다.
기본적으로 [시작]-[실행]을 클릭하고, ‘PerfMon’을 실행하여, 아래의 화면을 표시할 수 있습니다.

























본 문서와 블로그에서는 성능모니터 도구 사용법 자체보다는, 시스템의 자원의 각 요소를 모니터링 하는 방법을 다루고자 합니다.
성능모니터 도구 사용법이 익숙하지 않다면, 아래의 자료를 참고할 수 있습니다.

성능 모니터링 시작 가이드http://technet.microsoft.com/ko-kr/library/dd744567%28v=ws.10%29.aspx 
시스템의 자원은 CPU, 메모리, 디스크, 네트워크 등, 크게 4가지 요소로 이루어져 있습니다.
그 중 CPU에 대해서는 보통 CPU 활용도, 커널 관련 입출력 등의 성능 카운터를 종합적으로 분석하게 됩니다.

카운터 소개 – [성능 카운터 정보 : 성능오브젝트\카운터(인스턴스명) ]


Processor\%Processor Time (_Total)
프로세서 사용 시간의 백분율이며, 전체 CPU시간에서 유휴 CPU시간을 제외한 시간의 백분율입니다.
CPU 사용률이 높으면, 어떤 사용자 프로세스가 CPU시간을 많이 쓰는지, 또는 시스템에서 소비하는 것인지 구분해 판단하게 됩니다.
Processor\%Privileged Time (_Total)
전체 CPU시간에서, 유휴 CPU시간과 사용자 CPU시간(User mode)을 제외한, 즉 시스템(커널)의 CPU 활용률 입니다.
사용자 프로세스나 일반 응용프로그램 이외에도 시스템의 CPU 사용률이 높아서 성능에 문제가 생기는 경우도 있습니다.
예를 들면, 네트워크 관련 드라이버, 그래픽 드라이버 등의 문제,
또는 사용자 프로그램의 지나친 커널 구성요소 호출에 의해서도
이 성능카운터의 값이 매우 높게 나타날 수 있습니다.

Process\%Processor Time (프로세스명)
특정 프로세스의 CPU 사용률입니다. IIS의 경우 웹응용프로그램 프로세스인 w3wp.exe를 모니터 하게 됩니다.

System\Context Switches/sec
프로세서가 실행할 대상 쓰레드를 변경한 수입니다. 다른 쓰레드의 실행은 비단 멀티쓰레드 응용프로그램 실행에 한정되는 것이 아니라,
시스템의 여러 프로세스를 실행하면서, 또는 단일 쓰레드 프로그램이라도 커널API를 호출하여 수행하면서 변경이 일어나게 됩니다.
Context Switch가 매우 많으면, CPU사용률과는 별개로 CPU 처리 지연의 원인이 될 수 있습니다.

System\System Calls/sec
시스템 전체에서의 운영 체제 서비스 루틴의 호출 수입니다. Context Switch와 마찬가지로 지나치게 많은 호출이 발생하면,
CPU성능에 영향을 주게 됩니다.

System\Processor Queue Length
실행 준비가 되어 있는 쓰레드 중에서, 프로세서 큐(대기열)에 있는 쓰레드 수입니다. 일반적으로 프로세서가 바쁘지 않다면,
대기열의 길이는 ‘0’이 됩니다. 따라서, CPU 상태가 현재 여유가 있는지, 아니면 매우 바빠서 추가로 명령을 실행할 여유가 없는 건인지 판단하는
매우 중요한 카운터입니다.












성능 카운터의 모니터링 위에서 언급된 카운터를 모두 추가하여, 차트로 모니터링을 하거나, 일정 기간 데이터를 파일로 기록해 두었다가 나중에 분석할 수 있습니다.
성능 모니터 도구의 세부 기능을 활용하면, 성능 기록뿐 아니라, 알림, 로그 분석 등을 통해 유용한 정보를 확인할 수 있습니다.



 

Windows의 성능, 특히 CPU성능의 분석을 위해 모니터링이 필요한 카운터를 정리해보았습니다.



프로세서 병목의 판단
이번에는 수집된 성능 데이터를 기반으로,
CPU 병목을 정의하는 과정에 대해 정리해 보고자 합니다.
먼저 시스템의 성능과 CPU사용률(%Processor Time)에 대한
기본적인 이해가 필요할 것으로 생각됩니다.
각 성능 요소(카운터)의 정의는 이전 글에서 살펴보았습니다.

프로세서 성능의 분석에서 CPU사용률은, 불과 20%미만이라도 CPU병목으로 판단될 수 있고, 75%이상이어도 CPU병목이 아닐 수 있습니다.
CPU 사용률이 10%이지만, 과도한 Context Switch나 System call이 발생하면,
이것 역시 CPU병목을 유발할 수 있고,
CPU 사용률이 80%인 경우, WWW 서비스나 DB서버가 작업을 수행하는데 전혀 문제가 없다면, 병목이 있다고 판단하기 어렵습니다.

특히 CPU 사용률이 80%인 경우, 응용프로그램의 추가 명령어 수행을 필요로 했다면, 적시에 실행 가능한 상태였고,
80%인 경우도 여전히 프로세서의 유휴 상태가 존재했으며,
프로세서의 추가로 성능이 향상될 것이라고 기대하기도 분명하지 않습니다.
무엇보다도, H/W기술자가 아닌, 서비스 운영 담당자에게는
이러한 병목의 판단과 성능 지연 여부가 중요한 의미를 갖습니다.

그러므로, CPU병목은, 시스템 성능에서 CPU의 처리 지연이 발생한 것의 정의를,
시스템의 핵심기능을 수행하기 위해,
프로세서 용량이 부족한 것인지를 기준으로 판단하는 것이 필요합니다.
이러한 판단을 위해, 앞에서 여러 카운터를 사용해 데이터를 수집하는 방법을 살펴보았습니다.

Processor\%Processor Time (_Total)
Processor\%Privileged Time (_Total) Process\%Processor Time (프로세스명 – W3WP.EXE, SQLSERVR.EXE 등)System\Context Switches/secSystem\System Calls/sec
System\Processor Queue Length

위에 언급된 모든 카운터는 모두 의미를 담고 있습니다.
특히 시스템 성능을 모니터링 할 경우 꼭 필요한 요소입니다.
한편으론, 위의 카운터는 2 종류로 나눌 수 있는데, 하나는 상태를 나타내는 정보(사용량)이고,
다른 하나는 지연 여부를 확인할 수 있는 정보(성능지표)입니다.

즉 %Processor Time은 사용률을, Context Switches의 경우는 프로세서의 컨텍스트 변경수를 의미하며,
그 수의 많고 적음을 보게 됩니다.
반면에, Processor Queue Legnth(PQL, 프로세서 처리 대기열의 길이(쓰레드수))는
이러한 지연 여부(처리 지연 발생 여부)를 판단하는데 큰 도움이 됩니다.

엄청난 문자열 연산이나 계산으로 CPU사용률이 높았거나,
또는 잦은 시스템(커널) 루틴의 명령 수행으로 Context Switch가 높았건 간에,
결국은 PQL에 반영됩니다.
즉, PQL이 ‘0’이 아니라면, 프로세서가 너무 바쁜 관계로,
이미 처리할 준비가 되어있는 작업 쓰레드(프로세서가 살펴봐 주기를 바라는 사용자 프로그램)
에 가서 처리를 수행하지 못하는 것이므로, CPU성능병목 판단의 중요한 지표가 됩니다.

정의된 성능병목과 병목을 유발한 원인은 별개의 문제입니다.
프로세서가 병목이라고 해서, 성능 저하나 서비스 장애 원인이
CPU성능이라고 보는 것은, 열심히 일한 프로세서 입장에선 억울할겁니다.
프로세서가 처리할 응용프로그램의 설계된 동작에 직접적인 영향을 받고,
DB의 설계에도 영향을 받으며, 잘못 설치된 드라이버(커널CPU),
잘못 작성한 코드로 업데이트 된 백신 등도 원인이 됩니다.

그러므로, 객관적인 성능 자료를 바탕으로 정리된 분석이 중요합니다.
참고로, 성능 문제가 있을 경우, PerfMon사용을 걱정하는 경우가 있는데,
PerfMon은 참 (1)가볍고, (2)성능에 우려가 있을 때 꼭 실행이 필요한 프로그램입니다.
수집대상(필요한 카운터)과 수집기간, 주기를 주의해서 사용하면 도움이 됩니다.
예를 들어 분석하고 싶은 카운터만 1일 동안,
매 10초 간격 등으로 설정하여 수집하면, 시스템에 큰 부담을 주지 않습니다.










































성능 분석을 위한, CPU 관련 카운터 추가 정보
Processor\%Processor Time (_Total)
Processor\%Privileged Time (_Total)
CPU 사용률, 커널 사용률 등은 그 값 자체로 성능분석에 중요한 의미가 있으며,
일시적이 아니라 지속적으로 높은 사용률을 유지하게 되면,
CPU성능이 시스템이 운영하는 핵심 서비스 성능에 영향을 주고 있다고 볼 수 있습니다.

따라서, 시스템(커널) 사용 시간, 응용프로그램 프로세스 별 사용률 등을 종합적으로 보고, 판단합니다.
단일 프로세스의 단일 쓰레드가 CPU시간을 대부분 소비할 경우, 더 빠른 CPU 추가가 결론이 될 수 있습니다.
서버에서는 PQL 값이 더욱 명확하게 프로세서 병목과, 프로세서 추가 필요성을 정의하는데 도움이 됩니다.

Process\%Processor Time (프로세스명 – W3WP.EXE, SQLSERVR.EXE 등)
프로세스 성능 오브젝트 이하의 %Processor Time은 최대값이 100x프로세서수 입니다.
즉, 프로세서가 4개인 경우 400%가 최대값이 됩니다.
CPU는 프로세스라는 논리적인 메모리 공간 보다는,
실제 수행할 명령어를 포함하고 있는 쓰레드를 대상으로 작업을 수행하며,
하나의 프로세스는 여러개의 쓰레드를 포함할 수 있기 때문입니다.
4개의 CPU가 MyApp이라는 프로세스 안에, 4개의 쓰레드만 계속 실행하는 경우,
그 예가 될 수 있습니다. (CPU 100% x 4)

성능 병목의 분석 과정에서, 이 값이 높으면 문제라고 보기 보다는,
핵심 서비스가 프로세서를 잘 활용할 수 있는가의 측면도 중요합니다.프로세서는 기본적으로 메인보드에 있는 칩이라고 봅니다.
CPU를 마치 같이 일하는 동료라고 보고,
IDLE(?)하게 만들어야 잘 설계된 것이라고 생각하진 않습니다.

System\Context Switches/secSystem\System Calls/sec
일반적으로 서버 시스템의 서비스는 단일 쓰레드 응용프로그램보다는
잘 설계된 다중 쓰레드 서비스 프로그램이 매우 유리합니다.
Context Switch는 프로세서가 처리할 명령어셋이 변경/로드되는 경우에 발생하며,
다중 쓰레드 설계로 인해 증가하는 부분보다는, 커널 루틴 호출로 인해 발생하는 경우가 큽니다.
특히 서버의 프로세서가 1-2개인 경우, Context Switch에 의해 병목을 유발하는 경우가 있습니다.
이 경우 CPU 사용률이 낮은데도, PQL은 커지게 될 수 있습니다.

’System’ 성능 오브젝트의 카운터들은 프로세서당 값으로 분석하므로,
프로세서가 4개인 경우, 해당값에서 4로 나눈 값으로 병목을 판단합니다.

예를 들어, Context Switches/sec가 20000인 경우,
CPU가 한 개라면 힘겨운 상황이지만, 4개라면 5000/sec 정도로, 상대적으로 가볍게 볼 수 있습니다.
주로 검색되는 문서에서는 프로세서당 5000개 또는 10000개 이상을 병목으로 보기도 하지만,
과거, 프로세서 속도가 1.X GHz, 2.0GHz에서 테스트 된 결과이기도 해서,
선택적으로 판단할 필요가 있습니다.

System\Processor Queue Length
프로세서당 처리 대기 쓰레드 수가 지속적으로 ‘0’이 아닌 값이면,
프로세서 병목으로 인해 시스템 성능이 지연되는 것으로 판단할 수 있습니다.
CPU 병목 판단의 임계값으로 프로세서당 ‘2’ 이상의 값을 사용할 수 있습니다.
























2016년 3월 2일 수요일

랜섬웨어 목구툴

[ 출처 :  http://www.sharedit.co.kr/ ]
[ 참조 : http://blog.naver.com/ssorin/ ]                                                                                                                            [Tool 다운]

먼저 바이러스를 먼저 제거한다.[참조]

랜썸웨어로 .ccc 암호화 된 file들이 많이 있었는데, TeslaDecoder를 사용해서 모두 복구를 할 수 있게 되었네요~ ^^*

===== 랜썸웨어로 암호화된 file 복구법 =====
( 현재 teslaCrypt 0.3.4a ~ 2.2.0까지 보구 가능 : ecc, ezz, exx, xyz, zzz, aaa, abc, ccc, vvv, … 복구 )

1. TeslaDecoder down 받아 압축 해제 ( http://download.bleepingcomputer.com/BloodDolly/TeslaDecoder.zip )

2. 압축 해제된 directory에서 TeslaViewer.exe를 실행 시킴

3. teslaviewer의 [Browser…] 버튼을 눌러 암호화된 file 한개를 읽어 들이면 그림에서 처럼 encrypt 정보가 표시됨



































4. 하단의 [Create work.txt] 버튼을 누르면 Teslaviewer.exe 가 있는 folder에 work.txt가 생성됨
5. work.txt file을 연후 상단에 있는 PrivateKeyBC의 SharedSecret1*PrivateKeyBC의 dec 값을 복사한다.

 6. 공개키를 소인수 분해한 값들을 찾아 주는 Yafu program을 다운 받아 압축을 해제한다. http://download.bleepingcomputer.com/td/yafu.zip

7. 방금 압축해제한 folder에서 RunYafu.exe program을 찾아 실행시킨 후 가운데 있는 [TuneYafu] 버튼을 눌러 yafu 실행 환경을 최적화 시켜 준 후(CMD 창이 열려 작동후 자동으로 닫힌 후) Runyafu를 닫음, 다른건 건드릴 필요없이 아래 그림의 동그라미 친 버튼만 누르면 됨 (몇분 소요됨)


8. 다시 압축해제한 folder에서 자신의 OS가 32bit이면 factorX86.bat, 64bit이면 factorX64.bat batch file을 실행시킨다.

9. Enter DEC SharedSecret1*PrivateKeyBC: 부분에 조금전 5. 에서 복사했던 십진값을 붙여넣기 한다. ( CMD 창 Title에서 오른 마우스 클릭후, [편집] -> [붙여넣기] )

 10. Amount of Threads: 에 자신의 CPU core에 맞게 2 또는 4 등을 입력하고 Enter키를 누른다.
( 결과 나오기까지 시간 많이 소요됨 )

11. 결과로 나온 ***factors found*** 아래에 P1, P2, … 의 내용들을 선택하여 복사한다. ( CMD 창의 title에 우측 마우스 버튼을 누른후, [편집]->[표시]를 한후 복사할 부분을 마우스 드래그하여 선택, title에서 우 클릭후, [편집]->[복사] )

12. TeslaDecoder folder로 다시 돌아 가서, TeslaRefactor.exe file을 실행시킨후, 앞에서 복사한 내용을 붙여 넣기 한 후에 값에 대한 내용만 남겨 두고, = 앞부분을 모두 지워준다.



































13. Public key(hex) 부분에 5.의 work file에서 PublicKeyBC =  에 해당하는 16진 값을 복사하여, 붙여 넣고 [Find private key] 버튼을 클릭하면, [Private key(hex)]에 복구를 위한 16진 암호가 나타나는 데, 이것을 복사해둔다.

14. TeslaDecoder folder의 TeslaDecoder.exe를 실행시킨 후, [Set key] 버튼을 누른 후key(hex)에 앞에서 복사한 key 값을 붙여넣기 한후, Extension 부분에서 해당 확장자를 선택한후, [Set key] 버튼을 클릭한다.



























15. [Decrypt Folder] 버튼을 클릭한 후 암호화된 file이 저장되어 있는 folder를 선택한다.

16. 대화창이 나타나면서 암호화된 file을 복구후에 삭제할 것인지를 묻는데, 삭제하려면 [예(y)]를 보존하려면 [아니오(N)]를 클릭하여 암호화된 file을 복구한다.



















{ http://www.factordb.com 싸이트에서 이미 등록된 암호키라면 FactorDB에서 암호를 찾을 수 있어 6~13번까지 건너뛸 수 있지만, 존재하지 않을 가능성이 높기 때문에 건너 뛰었음 }


[출처 :  http://www.parkoz.com/ ]

다운로드 페이지 링크 (영문 설명 포함)
http://esupport.trendmicro.com/solution/en-US/1114221.aspx
다운로드 링크
http://solutionfile.trendmicro.com/SolutionFile/EN-1114221/RansomwareFileDecryptor%201.0.1569%20MUI.zip
CRYP1 의 경우 CRYPTXXX V3 선택하여 복구



2015년 12월 11일 금요일

노트북의 무선랜 공유 하기

노트북 무선랜 공유 하기

무선 장치가 켜진 상태에서 도스창에서 다음과 같이 입력하여 지원 가능한지 확인

netsh wlan show drivers












































무선랜 지원되는것을 확인 하였으며 공유 모드로 변경한다.
netsh wlan set hostednetwork mode=allow ssid=무선표시명 key=접속키
무선 연결 속성에서 아래와 같이 변경 후
































무선 랜 서비스 시작
netsh wlan start hostednetwork

무선랜 서비스 중단
netsh wlan stop hostednetwork


2015년 2월 9일 월요일

Tomcat 메모리 설정

윈도우 서버에 톰캣을 인스톨하지 않고 복사해서 사용할 경우 메모리 설정

톰캣의 실행 파일에 아래와 같이 설정을 추가한다.
%Tomcat_home%\bin\Catalina.bat에 아래 라인을 추가한다.

set CATALINA_OPTS=-Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m

java.lang.OutOfMemoryError: PermGen space 에러가 발생되면 MaxPermSize를 늘려주면 됨.
기본이 80M로 상기 에러가 발생되면 설정값을 키워주면 된다.
만약 상기 에러로 로그 조정 후 실제로 늘어 났는지 확인 하려면 Java_Home의 Jconsole.exe를 실행하면
아래와 같은 화면에서 확인 가능하다.


설정시 JAVA_OPTS와  CATALINA_OPTS가 있는데 둘중 아무것에나 설정을 해주면된다.
차이점이라면  JVM runtime 옵션은 같으나 JAVA_OPTS의 경우JVM stop 명령일 때도 동작을 한다.


자바관련 메모리 옵션



























설정 관련 한글 위키

JVM Options

목차


[편집] 개요


[편집] 왜 JVM Option을 알아야 하는가

Java 언어는 하드웨어/OS에 독립적이다. 즉, Java로 작성된 Application은 아무런 수정없이 JVM이 구동가능한 어떤 OS에서도 동작한다. 하지만 이것은 "동작"의 독립성일 뿐 "성능"의 독립성이 아니다.
특정 OS의 특정 JDK 버전에서 아무런 성능 문제없이 구동되었던 Application이 다른 OS나 다른 버전의 JDK에서는 심각한 성능 문제를 겪는 사례가 종종 있다. Java 언어와 Bytecode는 독립성을 가지고 있지만, Bytecode를 실행하는 JVM은 그렇지 않기 때문이다. 이러한 종류의 성능 문제를 해결하려면 JVM이 제공하는 Options들에는 어떤 것이 있고 Option의 적용에 따라 어떤 차이가 나타나는지 정확하게 이해해야 한다.



[편집] Standard vs. Non-Standard Option

Standard Option은 JVM 표준이다. 즉 Sun HotSpot JVM, IBM JVM, BEA JRockit JVM, HP HotSpot JVM 등 모든 JVM이 동일한 Option을 제공한다.
반면 Non-Standard Option은 JVM의 표준이 아니다. 따라서 JVM의 버전과 OS 종류에 따라 존재여부가 결정된다. 언제든지 추가되거나 없어지기도 한다. 이런 면에서 Non-Standard Option들은 골칫거리처럼 여겨질 수 있다. 하지만, 다음과 같은 측면에서 반드시 필요한 존재이기도 하다.
  • JVM 구동에 필요한 설정값(Configuration Value)를 지정할 수 있다.
  • 성능 개선에 필요한 Parameter 값을 지정할 수 있다.
  • Bug나 오동작에 의한 Workaround로 활용할 수 있다.
Non-Standard Option을 모르더라도 Java Application을 작성하고 구동하는데 전혀가 문제가 없을 수도 있다. 하지만 조그만한 오동작이나 성능 저하만 발생해도 Non-Standard Option 도움 없이는 해결할 수 없는 경우가 많다. 따라서 시스템 관리자나 개발자들은 중요한 Non-Standard Option들에 대해 어느 정도 이해하고 있어야 한다.
Non-Standard Option은 다음 두 개의 범주로 구분된다.
  • -X Option: 일반적인 Non-Standard Option이다. Macro한 측면에서의 JVM 제어 기능을 제공한다. -X Option은 JVM마다 다르지만 일부 Option들은 마치 Standard Option처럼 사용된다.
  • -XX Option: -X Option보다 보다 세밀한 제어 기능을 제공한다. Micro한 측면에서의 JVM 기능을 제공한다. 세밀한 성능 튜닝이나 버그에 대한 Workaround를 위해서 주로 활용된다. -XX Option은 JVM 종류에 따라 완전히 다르다.

[편집] Option 지정하기

JVM Option을 지정하는 방법의 예는 다음과 같다.
  1. 단일값: -client Option과 같이 옵션을 지정하면 그 자체로 의미를 지닌다.
  2. 크기(Size): -Xmx1024m과 같이 크기(K,M,G)를 지정한다.
  3. 숫자(Int): -XX:SurviorRatio=10과 같이 숫자값을 지정한다.
  4. 문자열(String): -agentlib:hprof=cpu=samples과 같이 문자열을 지정한다.
  5. Boolean: -XX:+PrintGCDetails 혹은 -XX:-PrintGCDetails와 같이 +/-를 이용해서 활성화/비활성 여부를 지정한다.

[편집] Sun HotSpot JVM (1.5 기준)


[편집] Standard Options

Option Description
-client Client HotSpot JVM을 사용한다. Client HotSpot JVM은 Desktop용 Application을 구동하는데 유리하다. 성능 최적화(Optimization) 과정을 간략화함으로써 Application의 시작 시간을 최소화한다.
-server Server HotSpot JVM을 사용한다. Server HotSpot JVM은 Server용 Application을 구동하는데 유리하다. 성능 최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행한다. Application의 시작 시간은 느리지만, 일정 시간이 흐르면 Client HotSpot JVM에 비해 훨씬 뛰어난 성능을 보장한다. (참고)Jdk 1.5부터는 Server-Class 머신인 경우에는 -server 옵션이 기본 적용된다. Server-Class 머신이란 2장 이상의 CPU와 2G 이상의 메모리를 갖춘 머신을 의미한다.
-d32 32bit JVM을 사용한다. 32bit JVM은 메모리를 최대 2G까지만 사용할 수 있다. 반면 일반적인 수행 성능 64bit JVM에 비해 뛰어난 경우가 많다. 따라서 큰 크기의 Java Heap을 사용하지 않는 경우에는 비록 64bit 머신이라고 하더라도 32bit JVM을 사용하는 것이 권장된다.
-d64 64bit JVM을 사용한다. 64bit JVM에서 사용가능한 메모리의 크기에는 사실상 제한이 없다. 대형 Application들의 경우 수G ~ 수십G의 Java Heap을 사용하는 경우가 많다.
-agentlib:<libname>[=<options>] Native Agent Library를 로딩한다. Native Agent Library란 JVMPI/JVMTI를 구현한 Library를 의미하며 C/C++로 구현된다. JVM은 Unix/Linux에서는 lib<libname>.so 파일이, Windows에서는 <libname>.dll 파일을 탐색한다. 해당 파일은 현재 Directory나 PATH 변수에 등록된 Directory에 존재해야 한다. (참조) JDK 1.4까지는 HProf를 실행시키기 위해 -Xrunhprof:option=value 옵션을 사용한다. JDK 1.5부터는 -Xagentlib:hprof=option=value 옵션이 권장된다. -Xrunhprof 옵션은 차후 없어질 수 있다.
-agentpath:<pathname>[=<options>] -agentlib 옵션과 동일한 기능이다. Library 이름 대신 Full Path 명을 준다.
-javaagent:<jarpath>[=<options>] Java Agent Library를 로딩한다. Java Agent는 Native Agent가 C/C++로 구현되는 것과 달리 Java로 구현된다. java.lang.instrument Package를 통해 Java Agent를 구현하는 필요한 Interface가 제공된다. Java Agent는 BCI를 통해 Runtime에 Class들의 Bytecode를 변경하는 방법을 통해 작업을 수행한다.

[편집] Non-Standard Options (-X)

Option Description
-Xbootclasspath[/a|/p]:<path> Boot class path를 제어한다. /a 옵션은 Boot class path의 제일 뒤에 Append, /p 옵션은 제일 앞에 Prepend한다. 일반적인 환경에서는 Boot class path를 제어할 필요가 없다. Java Core Library(rt.jar 등)등에 대해 Reverse Engineering을 수행하고 행동 방식을 변경하고자 할 경우에 주로 활용된다.
-xcheck:jni
-Xint Intepreter 모드로만 ByteCode를 실행한다. Interpreter 모드로 실행될 경우에는 JIT Compile 기능이 동작하지 않는다. 이 옵션을 활성화하면 실행 속도이 다소 저하될 수 있다. 따라서 HotSpot Compiler의 버그로 문제가 생길 때만 사용이 권장된다.
-Xnoclassgc Class Garbage Collection을 수행하지 않는다.
-Xloggc:<file> GC Log를 기록할 파일명을 지정한다. 파일명을 지정하지 않으면 Standard Out이나 Standard Error 콘솔에 출력된다. 주로 -XX:+PrintGCTimeStamps, -XX:+PrintGCDetails 옵션과 같이 사용된다.
-Xmixed Mixed 모드로 ByteCode를 실행한다. HotSpot JVM의 Default 동작 방식이며, -Xint 옵션과 상호 배타적인 옵션이다.
-Xmn<size> Young Generation이 거주하는 New Space의 크기를 지정한다. 대개의 경우 이 옵션보다는 -XX:NewRatio 옵션이나 -XX:NewSize 옵션을 많이 사용한다.
-Xms<size> Java Heap의 최초 크기(Start Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.
-Xmx<size> Java Heap의 최대 크기(Maximum Size)를 지정한다. Java Heap은 -Xms 옵션으로 지정한 크기로 시작하며 최대 -Xmx 옵션으로 지정한 크기만큼 커진다. Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤드를 최소화하기 위해서이다.
-Xrunhprof[:help][:option=value,...] HProf(Heap and CPU Profiling Agent)를 실행한다. HProf는 JVMPI/JVMTI를 이용해 구현된 Sample Profiler이다. 비록 Sample에 불과하지만, 많은 경우 HProf만으로도 상당히 유용한 정보들을 얻을 수 있다.
-Xrs OS Signal사용을 최소화한다. 가령 이 옵션을 켜면 kill -3 [pid] 명령을 수행해도 Thread dump가 발생하지 않는다.
-Xss<size> 개별 Thread의 Stack Size를 지정한다. 예를 들어 Thread Stack Size가 1M이고, Thread가 최대 100개 활성화된다면, 최대 100M의 메모리를 사용하게 된다. 대부분의 경우 기본값(Default)을 그대로 사용하는 것이 바람직하다. 많은 수의 Thread를 사용하는 Application의 경우 Thread Stack에 의한 메모리 요구량이 높아지며 이로 인해 Out Of Memory Error가 발생할 수 있다. 이런 경우에는 -Xss 옵션을 이용해 Thread Stack Size를 줄여주어야 한다.

[편집] Non-Standard Options (-XX)

-XX 옵션 중 Boolean 유형은 접두어로 +를 붙이면 활성화(Enable), -를 붙이면 비활성화(Disable)를 의미한다.
Option Default Description
-XX:+AggressiveHeap False 말 그대로 Heap을 Aggressive(공격적)하게 사용하는 옵션이다. 이 옵션이 활성화되면 JVM은 현재 Application을 Memory-Intensive한 것으로 간주하고 Heap 공간을 최대한 사용하게끔 관련된 다른 옵션 값들을 결정한다. 가령 UseParallelGC 옵션을 활성화시키고, Java Heap의 크기를 Physical Memory의 최대치에 가깝게 설정한다.
이 옵션은 비록 사용하기는 간편하지만, 일반적으로 잘 사용되지는 않는다. 대부분의 경우, 개별적인 옵션들을 이용해 좀 더 세밀한 튜닝을 시도한다.
-XX:+CMSClassUnloadingEnabled False CMS CollectorPermanent Generation에 대해 GC 작업을 수행하지 않으며, Class 메타데이터에 대한 Unloading 작업 또한 수행하지 않는다. 따라서 Application의 특성상 많은 수의 Class를 동적으로 생성하고 Loading하는 경우에는 Permanent Generation에서 Out Of Memory Error가 발생할 수 있다. 이런 경우에는 이 옵션과 함께 CMSPermGenSweepingEnabled 옵션을 사용해서 Permanent Generation에 대한 GC 작업과 Class Unloading 작업을 활성화한다. JDK 1.5까지는 이 두 옵션을 모두 활성화해야 Class Unloading이 이루어진다. JDK 1.6부터는 CMSPermGenSweepingEnabled 옵션을 활성화하지 않아도 이 옵션이 작동한다.
-XX:CMSFullGCsBeforeCompaction=<value> -1 CMS Collector에서 Compaction(압축)을 수행하기 전에 Full GC를 수행할 회수를 지정한다. 일반적인 Full GC는 Compaction 작업을 수반한다. 반면에 CMS CollectorFull GC는 Compaction을 수행하지 않는다. 이로 인해 Heap의 Fragmentation이 발생할 수 있지만, Full GC에 의한 Pause Time을 최소화할 수 있다는 장점이 있다.
이 옵션은 Compaction의 발생 시점을 제어하는 역할을 한다. 예를 들어 이 값이 "1"인 경우, Concurrent Full GC가 아직 종료되지 않은 시점에 새로운 Concurrent Full GC 작업이 시작되면(1), Compaction이 수반된다. 만일 이 값이 "0"인 경우에는 Concurrent Full GC는 "항상" Compaction을 수반한다. 따라서 CMS Collector를 사용하는 환경에서 Heap Fragmentation에 의한 문제가 발생하는 경우에는 "0"의 값을 부여하는 것이 Workaround가 될 수 있다.
-XX:+CMSIncrementalMode False Full GC 작업을 Incremental하게 진행한다. 일반적으로 CMS CollectorOld Generation가 어느 정도 이상 점유되면 Concurrent Full GC 작업을 시작한다. 반면 이 옵션이 활성화되면 Old Generation의 사용률과 무관하게 백그라운드에서 점진적으로(Incremental) Old Generation에 대한 GC 작업을 수행한다. 이 옵션을 사용하면 CMSInitiatingOccupancyFraction 옵션은 무시된다.
이 옵션을 활성화하면 Throughput은 다소 줄어들고, Response Time은 좀 개선되는 경향이 있다. 따라서 GC 작업 Pause를 더 줄이고 싶을 경우에 사용할 수 있다.
-XX:CMSInitiatingOccupancyFraction=<value> -1 CMS Collection이 시작되는 임계값을 결정한다. 만일 이 값이 "50"이면 Old Generation이 50% 이상 사용되면 Concurre Full GC가 시작된다. 이 값의 기본값은 "-1"이다. 이 경우에는 CMSTriggerRatio 옵션과 MinHeapFreeRatio 옵션이 임계치로 사용된다. 임계치의 계산 공식은 다음과 같다.
Start Ratio = 100-MinHeapFreeRatio(=40) + MinHeapFreeRatio(=40) * (CMSTriggerRatio(=80)/100) = 92
즉, CMSInitiatingOccupancyFraction 옵션이 지정되지 않으면 Old Generation이 92% 정도 사용될 때 Concurrent Full GC가 시작된다.
이 옵션을 지정하면 50%에서 시작하여, 옵션으로 지정된 값까지 점진적으로 임계값을 조정한다. 만일 임계값을 고정하고자 할 경우에는 UseCMSInitiatingOccupancyOnly 옵션을 활성화해야 한다.
이 옵션의 값이 작으면 CMS Collection이 그만큼 빨리 동작하기 때문에 Promotion Failure에 의한 Stop The World GC 작업이 발생할 확률이 그만큼 줄어든다.
-XX:+CMSPermGenSweepingEnabled False CMS Collector는 기본적으로 Permanent Generation에 대해 Collection을 수행하지 않는다. 따라서 많은 수의 Class를 Loading하는 경우 Out Of Memory Error가 발생할 수 있다. 이 옵션을 활성화하면 Permanent Generation에 대한 Collection을 수행한다. JDK 1.5까지는 이 옵션과 함께 CMSClassUnloadingEnabled 옵션을 활성화해야 동작한다.
-XX:CompilerCommandFile=<file> .hotspot_compiler Compiler Command File의 위치를 지정한다.
-XX:+DisableExplicitGC False System.gc 호출에 의한 Explicit GC를 비활성화한다. RMI에 의한 Explicit GC나 Application에서의 Explicit GC를 원천적으로 방지하고자 할 경우에 사용된다.
-XX:GCHeapFreeLimit=<Percentage> 5 Parallel Collector를 사용할 때 GC도중 Out Of Memory Error의 발생을 방지하는데 도움을 준다. GC로 확보해야할 Free Space의 하한선을 결정한다. 이 값은 Max Heap 크기에 대한 Free 공간 크기의 비율이며 기본값은 "5"이다. 즉 Parallel Collection 후 확보해야할 Free 공간 크기가 적어도 Max Heap 크기의 5% 이상이 되도록 보장하는 것이다.
-XX:GCTimeLimit=<Percentage> 90 Parallel Collector를 사용할 때 GC도중 Out Of Memory Error의 발생을 방지하는데 도움을 준다. 전체 JVM 수행시간 대비 Parallel Collection 수행 시간의 상한선를 결정한다. 기본값은 "90"이다. 즉 Parallel Collection이 전체 수행 시간의 90%까지 사용할 수 있게 된다.
-XX:+HeapDumpOnOutOfMemoryError False Out Of Memory Error가 발생하면 Heap Dump를 File에 기록한다. JDK 1.6 부터 지원되는 옵션이다.
-XX:MaxGCMinorPauseMillis=<Value> None Minor GC에 의한 Pause Time을 <value>ms 이하가 되게끔 Heap 크기와 기타 옵션들을 자동으로 조정하는 기능을 한다. 이 값은 목표값(Target)이지 고정값이 아니다. Minor GC에 의한 Pause Time이 길 경우에 Workaround로 사용할 수 있다.
-XX:MaxGCPauseMillis=<Value> None GC에 의한 Pause Time을 <value>ms 이하가 되게끔 Heap 크기와 기타 옵션들을 자동으로 조정하는 기능을 한다. MaxGCMinorPauseMillis 옵션과 마찬가지로 목표값으로서의 역할을 한다. GC에 의한 Pause Time이 길 경우에 Workaround로 사용할 수 있다.
-XX:MaxHeapFreeRatio=<Value> 70 Heap Shrinkage를 수행하는 임계치를 지정한다. 예를 들어 이 값이 70이면 Heap의 Free 공간이 70% 이상이 되면 Heap 크기가 축소된다. MinHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다.
-XX:MaxNewSize=<Value> None Young Generation의 최대 크기를 지정한다. Young Generation의 시작 크기는 NewSize 옵션에 의해 지정된다.
-XX:MaxPermSize=<Value> None Permanent Generation의 최대 크기를 지정한다. Permanent Generation의 시작 크기는 PermSize 옵션에 의해 지정된다. 많은 수의 Class를 Loading하는 Application은 PermSizeMaxPermSize 옵션을 이용해 Permanent Generation의 크기를 크게 해주는 것이 좋다. Permanent Generation의 크기가 작을 경우에는 Out Of Memory Error가 발생할 수 있다.
-XX:MinHeapFreeRatio=<Value> 40 Heap Expansion을 수행하는 임계치를 지정한다. 예를 들어 이 값이 40이면 Heap의 Free 공간이 40% 미만이 되면 Heap 크기가 확대된다. MaxHeapFreeRatio 옵션과 함께 Heap의 크기 조정을 담당한다.
-XX:NewRatio=<Value> OS/JDK Version마다 다름 Young GenerationOld Generation의 비율을 결정한다. 예를 들어 이값이 2이면 Young:Old = 1:2 가 되고, Young Generation의 크기는 전체 Java Heap의 1/3이 된다.
-XX:NewSize=<Value> OS/JDK Version마다 다름 Young Generation의 시작 크기를 지정한다. Young Generation의 크기는 NewSize 옵션(시작 크기)과 MaxNewSize 옵션(최대 크기)에 의해 결정된다.
-XX:OnError=<Command> None Fatal Error가 발생할 경우(예: Native Heap에서의 Out Of Memory Error), <Command>로 지정된 OS 명령문을 수행한다. 비정상적인 JVM 장애 현상을 좀 더 자세하게 분석하고자 할 경우에 주로 사용된다.
-XX:OnError="pmap %p" 
 --> JVM에서 Fatal Error가 발생하면 Process ID에 대해 pmap 명령을 수행한다.
-XX:OnOutOfMemoryError=<Command> None Out Of Memory Error가 발생할 경우, <Command>로 지정된 OS 명령문을 수행한다. JDK 1.6에 추가된 옵션으로, Out Of Memory Error가 Java에서 얼마나 보편적으로 발생하는지를 알 수 있다.
-XX:OnOutOfMemoryError="pmap %p" 
 --> JVM에서 Fatal Error가 발생하면 Process ID에 대해 pmap 명령을 수행한다.
-XX:ParallelGCThreads=<value> CPU 개수 Parallel Collector를 사용할 경우, GC작업을 수행할 Thread의 개수를 지정한다. 기본값은 CPU 개수이다. 즉, Parallel GC 작업을 수행하기 위해 시스템 전체의 CPU를 최대한 활용한다. 하나의 Machine에 여러 개의 JVM을 구동하는 환경이나, 하나의 Machine을 여러 종류의 Application이 공유해서 사용하는 환경에서는 이 옵션의 값을 낮게 설정해서 GC Thread의 개수를 줄임으로써 성능 개선을 꾀할 수 있다. Context Switching에 의한 성능 저하를 막을 수 있기 때문이다.
-XX:PermSize=<size>
Permanent Generation의 최초 크기를 지정한다. Permanent Generation의 최대 크기는 MaxPermSize 옵션에 의해 지정된다. 많은 수의 Class를 로딩하는 Application은 큰 크기의 Permanent Generation을 필요로 한며, Permanent Generation의 크기가 작아서 Class를 로딩하는 못하면 Out Of Memory Error가 발생한다.
-XX:PretenureSizeThreshold=<value> 0 일반적으로 Object는 Young Generation에 최초 저장된 후 시간이 흐름에 따라 Tenured Generation으로 Promotion된다. 하지만, Object의 크기가 Young Generation보다 큰 경우 JVM은 Old Generation에 Object를 직접 저장하기도 한다. PretenuredSizeThreshold 옵션을 이용하면 Young Generation을 거치지 않고 직접 Old Generation에 저장하게끔 할 수 있다. 가령 이 옵션의 값이 1048576(1M)이면, 1M 크기 이상의 오브젝트는 Old Generation에 바로 저장된다.
큰 크기의 오브젝트를 Old Generation에 직접 저장함으로써 불필요한 Minor GC를 줄이고자 하는 목적으로 사용된다.
-XX:+PrintGCApplicationStoppedTime False Application에서 Stop이 발생한 경우 소요된 시간 정보를 기록한다. 이 시간은 GC 작업 자체에 의한 Stop 뿐만 아니라 JVM의 내부적인 이유로 Application Thread들을 Stop 시킨 경우를 포함한다.
-XX:+PrintGCDetails False GC 발생시 Heap 영역에 대한 비교적 상세한 정보를 추가적으로 기록한다. 추가적인 정보는 {GC 전 후의 Young/Old Generation의 크기, GC 전 후의 Permanent Generation의 크기, GC 작업에 소요된 시간} 등이다. Minor GC가 발생한 경우 PrintGCDetails 옵션의 적용 예는 아래와 같다.
[GC [DefNew: 64575K->959K(64576K), 0.0457646 secs] 196016K->133633K(261184K), 0.0459067 secs]]
위의 로그가 의미하는 바는 다음과 같다.
  • GC 전의 Young Generation Usage = 64M, Young Generation Size = 64M
  • GC 전의 Total Heap Usage = 196M, Total Heap Size = 260M
  • GC 후의 Young Generation Usage = 9.5M
  • GC 후의 Total Heap Usage = 133M
  • Minor GC 소요 시간 = 0.0457646 초
Major GC가 발생한 경우 PrintGCDetails 옵션의 적용 예는 아래와 같다.
111.042: [GC 111.042: [DefNew: 8128K->8128K(8128K), 0.0000505 secs]
111.042: [Tenured: 18154K->2311K(24576K), 0.1290354 secs] 26282K->2311K(32704K), 0.1293306 secs]
위의 로그는 Minor GC 정보 외에 다음과 같은 Major GC 정보를 제공한다.
  • GC 전의 Tenured Generation Usage = 18M, Tenured Generation Size = 24M
  • GC 후의 Tenured Generation Usage = 2.3M
  • Major GC 소요시간 = 0.12초
(참고) PrintGCDetails + PrintGCTimeStamps 옵션의 조합이 가장 보편적으로 사용된다.
-XX:+PrintGCTimeStamps False GC가 발생한 시간을 JVM의 최초 구동 시간 기준으로 기록한다. (참고) PrintGCDetails + PrintGCTimeStamps 옵션의 조합이 가장 보편적으로 사용된다.
-XX:+PrintHeapAtGC Fasle GC 발생 전후의 Heap에 대한 정보를 상세하게 기록한다. PrintHeapAtGC 옵션과 PrintGCDetails 옵션을 같이 사용하면 GC에 의한 Heap 변화 양상을 매우 정확하게 파악할 수 있다. 아래에 PrintHeapAtGC 옵션의 적용 예가 있다.
0.548403: [GC {Heap before GC invocations=1:
Heap
par new generation total 18432K, used 12826K [0xf2800000, 0xf4000000, 0xf4000000]
eden space 12288K, 99% used<1> [0xf2800000, 0xf33ff840, 0xf3400000]
from space 6144K, 8% used<2> [0xf3a00000, 0xf3a87360, 0xf4000000]
to space 6144K, 0% used<3> [0xf3400000, 0xf3400000, 0xf3a00000]
concurrent mark-sweep generation total 40960K, used 195K<4>[0xf4000000, 0xf6800000, 0xf6800000]
CompactibleFreeListSpace space 40960K, 0% used [0xf4000000, 0xf6800000]
concurrent-mark-sweep perm gen total 4096K, used 1158K<5> [0xf6800000, 0xf6c00000, 0xfa800000]
CompactibleFreeListSpace space 4096K, 28% used [0xf6800000, 0xf6c00000]
0.549364: [ParNew: 12826K<6>->1086K<7>(18432K<8>), 0.02798039 secs] 13022K->1282K(59392K)
Heap after GC invocations=2:
Heap
par new generation total 18432K, used 1086K [0xf2800000, 0xf4000000, 0xf4000000]
eden space 12288K, 0% used<10> [0xf2800000, 0xf2800000, 0xf3400000]
from space 6144K, 17% used<11> [0xf3400000, 0xf350fbc0, 0xf3a00000]
to space 6144K, 0% used<12> [0xf3a00000, 0xf3a00000, 0xf4000000]
concurrent mark-sweep generation total 40960K, used 195K<13> [0xf4000000, 0xf6800000, 0xf6800000]
CompactibleFreeListSpace space 40960K, 0% used [0xf4000000, 0xf6800000]
concurrent-mark-sweep perm gen total 4096K, used 1158K<14> [0xf6800000, 0xf6c00000, 0xfa800000]
CompactibleFreeListSpace space 4096K, 28% used [0xf6800000, 0xf6c00000]
} , 0.0297669 secs]
-XX:SoftRefLRUPolicyMSPerMB=<value> 1000(ms) Soft ReferenceJava Heap에서 밀려나는 주기를 설정한다. 기본값이 1000ms(1초)이다. JDK 1.3.1까지는 Soft Reference는 GC 작업 발생시 항상 메모리에서 해제되었다. 하지만 이후 버전에서는 Free Memory에 비례해 일정 시간 정도 메모리에 보관하게끔 변경되었다. 가령 이 값이 1000(1초)이면, Heap의 Free Memory 1M마다 바로 직전에 참조된 시간에서 1초가 지나지 않았다면 메모리에서 해제하지 않는다. 이 값을 크게 부여하면 Soft Reference가 그만큼 오래 메모리에 머물고 사용 효율이 높아진다. 반면 메모리 점유율이 높아진다. 따라서 Applicaiton에서 Soft Reference를 많이 사용하고, Free Memory가 많지 않은 상황에서는 이 값을 낮출 필요가 있다. 반면 Soft Reference에 기반하여 Cache를 구현하고, Free Memory에 여유가 있는 상황에서는 이 값을 높임으로써 성능 향상을 꾀할 수 있다.
-XX:SurvivorRatio=<value> 5~6(OS/Version마다 다름) Survivor SpaceEden Space의 비율을 지정한다. 만일 이 값이 6이면, To Survivor Ratio:From Survivor Ratio:Eden Space = 1:1:6이 된다. 즉, 하나의 Survivor Space의 크기가 Young Generation의 1/8이 된다. Survivor Space의 크기가 크면 Tenured Generation으로 옮겨가지 전의 중간 버퍼 영역이 커지는 셈이다. 따라서 Full GC의 빈도를 줄이는 역할을 할 수 있다. 반면 Eden Space의 크기가 줄어들므로 Minor GC가 자주 발생하게 된다.
-XX:+TraceClassLoading False Class Loading을 추적하는 메시지를 뿌릴지의 여부를 지정한다. TraceClassUnloading 옵션과 함께 ClassLoader 문제를 추적하고자 할 때 사용된다.
-XX:+TraceClassUnloading False Class Unloading을 추적하는 메시지를 뿌릴지의 여부를 지정한다. TraceClassLoading 옵션과 함께 ClassLoader 문제를 추적하고자 할 때 사용된다. 이 옵션은 JDK 1.6에서 추가되었다.
-XX:+UseAdaptiveSizePolciy True Parallel Collector를 사용할 경우 Young Generation의 크기를 Adaptive하게 적용할 지의 여부를 지정한다. Parallel Collector의 목적은 Throughput을 최대화하는 것이며, 이 목적에 따라 Young Generation의 크기를 JVM 스스로 조정한다.
(주의) Adaptive Size를 사용하는 경우 Young Generation의 크기가 잘못 계산되어 Full GC를 과잉 유발하는 것과 같은 오동작을 하는 경우가 있다. 이럴 경우에는 이 옵션의 값을 False(-XX:-UseAdaptiveSizePolicy)로 변경해주어야 한다.
-XX:+UseCMSCompactAtFullCollection True CMS Collector에 의한 Concurrent GC 수행 시 Compaction 작업을 수행할 지의 여부를 지정한다. 이 값이 True이면, Old Generation의 Fragmentation에 의해 Promotion Failure가 발생할 때 Stop The World 방식의 Full GC를 수행하며 Compaction이 이루어진다. JDK 1.4.2부터는 True가 Default 값이다. 좀 더 자세한 내용은 CMSFullGCsBeforeCompaction 파라미터를 참조한다.
-XX:+UseCMSInitiatingOccupancyOnly False Concurrent Full GC를 수행할 기준으로 최초에 지정된 비율을 고정적으로 사용할지의 여부를 지정한다. 최초의 비율은 CMSInitiatingOccupancyFraction 옵션에 의해 지정된다.
CMS Collector를 사용하는 환경에서 Full GC가 자주 발생하는 경우 CMSInitiatingOccupancyFraction 옵션의 값을 낮게(50이하)로 지정하고, 이 옵션의 값을 True로 지정하는 방법을 많이 사용한다.
-XX:+UseConcMarkSweepGC False CMS Collector를 사용할 지의 여부를 지정한다. GC Pause에 의한 사용자 응답 시간 저하 현상을 줄이고자 할 경우에 사용이 권장된다.
-XX:+UseParallelGC 환경에 따라 다름 Parallel Collector를 사용할 지의 여부를 지정한다. JDK 1.4까지는 False가 기본값이다. JDK 1.5부터는 서버급 머신인 경우에는 True, 클라이언트급 머신일 경우에는 False가 기본값이다. 서버급 머신이란 CPU가 2개 이상, Physical RAM이 2G 이상인 머신을 의미한다. 큰 크기의 Young Generation이 일반적인 엔터프라이즈 환경에서는 Parallel Collector를 사용함으로써 Minor GC에 의한 GC Pause를 최소화할 수 있다. Parallel CollectorYoung Generation에 대해서만 작동한다는 사실에 주의하자. Old Generation에 대해 Parallel Collection을 사용하고자 하는 경우에는 UseParallelOldGC 옵션을 사용한다.
-XX:+UseParallelOldGC False Old Generation에 대해 Parallel Collection을 수행할 지의 여부를 지정한다. JDK 1.6에서 추가된 옵션이다.
-XX:+UseParNewGC 환경에 따라 다름 CMS Collector를 사용하는 경우에 한해서, Young Generation에 대해서 Parallel Collection을 수행할 지의 여부를 지정한다. 이 옵션과 UseParallelGC, UseParallelOldGC 옵션과의 차이를 명확하게 구분해야 한다.
-XX:+UseSerialGC 환경에 따라 다름 Serial Collector를 사용할 지의 여부를 지정한다. JDK 1.4까지는 Default 값이 True이다. JDK 1.5에서는 UseParallelGC 옵션에서 설명한 것처럼 머신의 등급에 따라 Default 값이 결정된다.

[편집] IBM JVM (1.5 기준)

Sun Hotspot JVM이 반드시 Command Line에서 JVM Option을 지정해주어야 하는 반면, IBM JVM에서는 다음과 같은 세 가지 방법으로 Option을 지정할 수 있다.
  • Command Line: java -Xgcpolicy:optthruput 과 같은 형태로 지정
  • Options File: –Xoptionsfile 옵션을 이용해서 Option을 모아둔 Text File을 지정. Optionsfile은 다음과 같은 형태이다.
#My options file
-X<option1>
-X<option2>=\<value1>,\
      <value2>
-D<sysprop1>=<value1>
  • IBM_JAVA_OPTIONS 환경변수: IBM_JAVA_OPTIONS 환경변수에 값을 지정(예: IBM_JAVA_OPTIONS=-X<option1> -X<option2>=<value1>)



[편집] Standard Options

Option Description
-memorycheck:<optiton> JVM 내부에서 발생하는 Memory Leak을 추적하기 위한 용도로 사용된다. JVM 기술지원 엔지니어들이 사용하는 용도로 보면 정확한다. JVM 자체는 C/C++로 구현되었다. 따라서 JVM 내부에서 발생하는 Memory Leak은 Java에서 발생하는 것과는 달리 진정한 의미에서는 Memory Leak으로 이해할 수 있다. 다음과 같은 옵션들이 제공된다(IBM JVM Diagnositics Guide에서 발췌)
  • all - The default if just -memorycheck is used. Enables checking of all allocated and freed blocks on every free and allocate call. This check of the heap is the most thorough and should cause the JVM to exit on nearly all memory-related problems very soon after they are caused. This option has the greatest impact on performance.
  • quick - Enables block padding only. Used to detect basic heap corruption. Pads every allocated block with sentinel bytes, which are verified on every allocate and free. Block padding is faster than the default of checking every block, but is not as effective.
  • nofree - Keeps a list of already used blocks instead of freeing memory. This list is checked, along with currently allocated blocks, for memory corruption on every allocation and deallocation. Use this option to detect a dangling pointer (a pointer that is "dereferenced" after its target memory is freed). This option cannot be reliably used with long-running applications (such as WAS), because "freed" memory is never reused or released by the JVM.
  • failat=<number of allocations> - Causes memory allocation to fail (return NULL) after <number of allocations>. Setting <number of allocations> to 13 will cause the 14th allocation to return NULL. Deallocations are not counted. Use this option to ensure that JVM code reliably handles allocation failures. This option is useful for checking allocation site behavior rather than setting a specific allocation limit.
  • skipto=<number of allocations> - Causes the program to check only on allocations that occur after <number of allocations>. Deallocations are not counted. Used to speed up JVM startup when early allocations are not causing the memory problem. As a rough estimate, the JVM performs 250+ allocations during startup.
  • callsite=<number of allocations> - Prints callsite information every <number of allocations>. Deallocations are not counted. Callsite information is presented in a table with separate information for each callsite. Statistics include the number and size of allocation and free requests since the last report, and the number of the allocation request responsible for the largest allocation from each site. Callsites are presented as sourcefile:linenumber for C code and assembly function name for assembler code. Callsites that do not provide callsite information are accumulated into an "unknown" entry.
  • zero - Newly allocated blocks are set 0 instead of being filled with the 0xE7E7xxxxxxxxE7E7 pattern. Setting to 0 helps you to determine whether a callsite is expecting zeroed memory (in which case the allocation request should be followed by memset(pointer, 0, size)).
-showversion Java의 버전과 기본적인 사용법에 대한 정보를 제공한다.
-verbose:<option> Option에 따라 상세 정보를 출력한다. 다음과 같은 옵션이 제공된다.
  • class - Class Loading 정보를 Standard Err에 출력한다. 출력 예는 아래와 같다.
class load: java/io/FilePermission
class load: java/io/FilePermissionCollection
class load: java/security/AllPermission
...
class load: test
class load: test from: file:/C:/Documents/Java_Test/GC%20dump/
  • dynload - Class Loading에 대한 매우 상세한 정보를 제공한다. 클래스명, 클래스 크기, 로딩 시간등의 정보를 포함한다. 출력 예는 아래와 같다.
<  Class size 6594; ROM size 7056; debug size 0> 
<  Read time 128 usec; Load time 126 usec; Translate time 222 usec>
<Loaded java/security/BasicPermissionCollection from c:\IBM\WebSphere\AppServer\java\jre\lib\core.jar>
<  Class size 4143; ROM size 3264; debug size 0>
<  Read time 103 usec; Load time 81 usec; Translate time 117 usec>
<Loaded java/security/Principal from c:\IBM\WebSphere\AppServer\java\jre\lib\core.jar>
<  Class size 239; ROM size 248; debug size 0>
<  Read time 44 usec; Load time 23 usec; Translate time 20 usec>
<Loaded test>
<  Class size 370; ROM size 448; debug size 0>
<  Read time 0 usec; Load time 28 usec; Translate time 39 usec>
  • gc - GC 작업에 대한 정보를 제공한다. 자세한 내용은 GC Dump를 참조한다.
  • jni - JNI 호출에 대한 정보를 제공한다. 출력 예는 아래와 같다.
<JNI ReleaseStringChars: buffer=41EC45B8>
<JNI GetStaticMethodID: gc_dump.main ([Ljava/lang/String;)V>
<JNI GetMethodID: java/lang/reflect/Method.getModifiers ()I>
<JNI GetMethodID: java/lang/String.<init> ([B)V>
<JNI FindClass: java/lang/Object>
<JNI GetMethodID: java/lang/Object.finalize ()V>
<JNI FindClass: java/lang/ref/Reference>
<JNI GetMethodID: java/lang/ref/Reference.enqueueImpl ()Z>
  • sizes - Memory 사용과 관련된 설정값을 출력한다. 출력 예는 아래와 같다.
 -Xmca32K              RAM class segment increment
 -Xmco128K            ROM class segment increment
 -Xmns0K                initial new space size
 -Xmnx0K                maximum new space size
 -Xms4M                 initial memory size
 -Xmos4M               initial old space size
 -Xmox1047608K     maximum old space size
 -Xmx1047608K       memory maximum
 -Xmr16K               remembered set size
 -Xmso32K             OS thread stack size
 -Xiss2K                java thread stack initial size
 -Xssi16K              java thread stack increment
 -Xss256K             java thread stack maximum size
 -Xscmx16M          shared class cache size
  • stacks - Thread 별로 Java/C Stack의 사용 크기를 출력한다. 출력 예는 아래와 같다.
JVMVERB000I Verbose stack: "Thread-1" used 188/3756 bytes on Java/C stacks
JVMVERB000I Verbose stack: "Thread-2" used 516/3756 bytes on Java/C stacks
JVMVERB000I Verbose stack: "main" used 1368/0 bytes on Java/C stacks
JVMVERB000I Verbose stack: "Finalizer thread" used 456/2308 bytes on Java/C stacks
JVMVERB000I Verbose stack: "Gc Slave Thread" used 232/3060 bytes on Java/C stacks

[편집] Non-Standard Options

Option Default Description
-Xalwaysclassgc -Xclassgc 옵션에 의해 결정됨 Global Collection이 발생할 때 Class GC를 수행할 지의 여부를 지정한다. classgc 옵션과 동일한 값이며, Default는 True이다.
-Xbootclasspath
Sun JVM의 bootclasspath 옵션과 동일
-Xcheck:jni False Sun JVM의 check:jni 옵션과 동일
-Xclassgc True Classloader가 변했을 때만 Class GC를 수행할 지의 여부를 결정한다.
-Xcodecache<size> OS/Hardware Architecture에 따라 결정됨
-Xcomp
-Xjit:count=0 옵션을 사용한 것과 동일. z/OS에서만 사용되며, deprecated 옵션이다.
-Xcompactexplicitgc False System.gc() 호출에 의한 Explicit GC가 발생했을 경우 항상 Compaction을 수행할 지의 여부를 결정한다. Sun Hotspot JVM의 경우에는 System.gc() 호출이 발생할 경우 반드시 Full GC를 수행한다. 반면 IBM JVM의 경우에는 이전 GC 작업에서 Compaction이 발생하지 않은 경우에만 Compaction을 수행한다.
-Xcompactgc False System GCGlobal GC가 발생할 때마다 Compaction을 수행한다.
-Xconcurrentbackground 1 Response Time Collector에 서 Concurrent Mark를 수행할 Background Thread의 개수를 지정한다. Concurrent Background Thread는 Application Thread의 성능을 다소 저하시킬 수 있으므로 하나만 구동하는 것이 바람직하다. 단, Concurrent Mark 작업이 잘 진행되지 않아 문제가 생기는 경우에는 이 값을 키우는 것이 해결책이 될 수 있다.
-Xconcurrentlevel<value>

-Xconmeter<option>

-Xdisableexcessivegc False GC 작업에 지나치게 많은(Excessive) 시간이 소요된 경우에 Out Of Memory Error를 유발하지 않도록 지정한다.
-Xdisableexplicitgc False System.gc() 호출에 의한 GC 작업을 비활성화한다. 이 옵션을 사용하면 System.gc()를 호출하더라도 GC 작업이 발생하지 않는다. RMI에 의한 불필요한 GC 작업이나 사용자의 실수에 의한 강제적인 GC 작업을 방지하고자 하는 목적으로 사용된다.
-Xdisablejavadump False Java Dump의 생성을 비활성화시킨다. IBM JVM은 치명적인 Error나 Signal을 받으면 Java Dump를 생성함으로써 사후 문제를 디버깅할 수 있도록 한다. 특정 문제로 인해 지나치게 많은 Dump가 생성될 때 이 옵션을 비활성시키는 경우가 있다.
-Xdisablestringconstantgc False Interned String에 대한 GC 작업을 비활성화한다.
-Xenableexcessivegc True GC 작업에 지나치게 많은(Excessive) 시간이 소요된 경우에 Out Of Memory Error를 유발하도록 지정한다. disableexcessivegc와 반대의 역할을 한다.
-Xenablestringconstantgc True Interned String에 대한 GC 작업을 활성화한다. disablestringconstantgc 옵션과 반대의 역할을 한다.
-Xgcpolicy<option> optthruput Garbage Collector의 종류를 결정한다.
  • optthruput: Throughput Collector를 사용한다. 처리량(Throughput)을 최적화할 목적으로 사용되며, Default Collector이다.
  • optavgpause: Response Time Collector를 사용한다. 응답시간(Response Time)을 최적화할 목적으로 사용된다. GC에 의한 Pause Time을 최소하기 위해 Concurrent Mark/Sweep 작업을 수행한다. Throughput Collector에 비해 처리량으로 다소(5~10%) 떨어진다.
  • gencon: Concurrent Generational Collector를 사용한다. IBM JDK 1.5에서 추가되었다. Sun Hotspot JVM의 CMS Collector와 거의 동일한 방식으로 동작하다.
  • subpool: Subpool Collector를 사용한다.
-Xgcthreads<value> CPU# Throughput Collector는 Mark & Sweep 작업을 Parallel하게, 즉 동시에 여러 Thread를 사용해서 수행한다. 이 옵션을 통해 Parallel GC를 수행할 Thread 수를 지정한다. 기본적으로 CPU 개수를 모두 활용한다. 만일 하나의 Machine에서 여러 JVM을 구동하거나, 다른 종류의 Application과 JVM이 공존하는 경우에는 이 값을 줄임으로써 Context Switching에 의한 성능 저하를 피할 수 있다.
gcworkpackets

int

iss

-Xjit:<options> True(JIT 컴파일을 사용함) JIT 컴파일 옵션을 결정한다. <options>가 지정되지 않으면 단순히 JIT 컴파일을 활성화한다. 이 옵션은 JIT 컴파일러의 버그로 인해 JVM 장애에 대해 Workaround로 많이 활용된다. JIT 컴파일러의 버그에 의한 JVM Crash가 발생할 경우에는 다음과 같은 유형의 Error Stacktrace가 기록된다.
...
TR_GlobalRegisterAllocator::perform()
TR_OptimizerImpl::performOptimization()
TR_OptimizerImpl::performOptimization()
TR_OptimizerImpl::optimize()
...
이 경우에는 다음과 같은 옵션을 이용해서 JIT 컴파일을 제어할 수 있다.
# Inlining을 비활성화한다.
-Xjit:disableInlining
-Xjit:{java/lang/Math.max(II)I}(disableInlining)

# 특정 메소드를 Optimization에서 제외한다.
-Xjit:exclude={java/lang/Math.max(II)I} ...
아래 옵션들은 JIT 컴파일러에 문제가 발생한 경우 이를 좀 더 쉽제 추적하고자 할 때 사용된다.
count=<n>
   <n>번 째 수행에서 Method를 JIT 컴파일한다. JIT 문제를 추적할 때는 "0"의 값을 사용함으로써 보다 빨리 컴파일이 이루어지도록 한다.    
optlevel=[noOpt | cold | warm | hot | veryHot | scorching]
   [비최적화 ~ 최고 최적화]까지 JIT 컴파일에 의한 최적화 레벨을 지적한다.
verbose
   JIT 컴파일 과정에서 사용된 정보와 컴파일 과정을 출력한다.
아래에 -Xjit:verbose 옵션의 출력 예가 있다. count 값은 1000, optlevel 값은 warm이 기본값임을 알 수 있다.
JIT type: Testarossa (Full)
JIT options specified:
    verbose
options in effect:
    bcount=250
    catchSamplingSizeThreshold=1100
    classLoadPhaseInterval=500
    classLoadPhaseThreshold=155
    code=512 (KB)
    codepad=0 (KB)
    codetotal=0 (KB)
    count=1000
    ...
    stack=256
    target=ia32-win32
    verbose=1
 
+ (warm) java/lang/Double.doubleToRawLongBits(D)J @ 0x41630014-0x41630030
+ (warm) java/lang/System.getEncoding(I)Ljava/lang/String; @ 0x41630054-0x41630145
+ (warm) java/lang/String.hashCode()I @ 0x4163017C-0x4163024A
+ (warm) java/util/HashMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @ 0x4163027C-0x416304AF
+ (warm) java/util/Locale.toLowerCase(Ljava/lang/String;)Ljava/lang/String; @ 0x416304DC-0x416307FF
...
+ (warm) java/io/FileOutputStream.writeBytes([BIILjava/io/FileDescriptor;)V @ 0x41636C34-0x41636D45|-
loainitial

loamaximum

loaminimum

lp

maxe

maxf

maxt

mca

mco

mine

minf

mint

mn

mns

mnx

mo

moi

mos

mox

mr

mrx

ms

mso

mx

noaot

noclassgc

nocompactexplicitgc

nocompactgc

-Xnojit False JIT 컴파일 옵션을 사용하지 않는다.
noloa

nopartialcompactgc

nosigcatch

nosigchain

optionsfile

oss

partialcompactgc

quickstart

realtime

rs

runhprof

samplingExpirationTime

scmx

shareclasses

sigcatch

sigchain

softrefthreshold<number>

ss

ssi

thr

verbosegclog:<file>