1、介紹
打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數量)。
可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。
如果連用SHELL jmap -histo pid>a.log可以將其保存到文本中去,在一段時間后,使用文本對比工具,可以對比
出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024可以將3024進程的內存heap輸出出來到outfile文
件里,再配合MAT(內存分析工具(Memory Analysis Tool),使用參見:
http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)
或與jhat (Java Heap Analysis Tool)一起使用,能夠以圖像的形式直觀的展示當前內存是否有問題。
64位機上使用需要使用如下方式:
jmap -J-d64 -heap pid
2、命令格式
命令行輸入【jmap】幫助提示如下:
C:\>jmap
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-permstat to print permanent generation statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified
,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system
簡單說明:SYNOPSISjmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
3、參數說明
1)options:
executable Java executable from which the core dump was produced.
(可能是產生core dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 唯一id,假如一臺主機上多個遠程debug服務
2)基本參數:
-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件;
live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”.
如果live子參數加上后,只統計活的對象數量.
-permstat 打印classload和jvm heap長久層的信息. 包含每個classloader的名字,活潑性,地址,父classloader
和加載的class數量. 另外,內部String的數量和占用內存數也會打印出來.
-F **.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
-h | -help 打印輔助信息
-J 傳遞參數給jmap啟動的jvm.
pid 需要被打印配相信息的java進程id,可以用jps查問.
4、使用示例
1)[fenglb@ccbu-156-5 ~]$ jmap -histo 4939
2)[fenglb@ccbu-156-5 ~]$ jmap -dump:format=b,file=test.bin 4939
Dumping heap to /home/fenglb/test.bin ...
Heap dump file created
摘要: 方案: 1、用命令行方式提交2、在eclipse中提交作業3、采用eclipse的插件實現項目的提交方案一:用命令行方式提交 其一,前提:成功搭建一個hadoop集群,或成功部署一個偽分布式,并啟動hadoop。其二,提交過程:1、在eclipse中將我們的項目打成一個jar包,放到hadoop的安裝目錄下。2、在命令行中提交作業,這里以hadoop自帶的wordcount程序...
閱讀全文
目錄結構
由于Hadoop要求所有機器上hadoop的部署目錄結構要相同,并且都有一個相同的用戶名的帳戶。
我的三臺機器上是這樣的:都有一個dbrg的帳戶,主目錄是/home/dbrg
Hadoop部署目錄結構如下:/home/dbrg/HadoopInstall,所有的hadoop版本放在這個目錄中。
將hadoop0.12.0壓縮包解壓至HadoopInstall中,為了方便以后升級,建議建立一個鏈接指向要使用的hadoop版本,不妨設為hadoop
[dbrg@dbrg-1:HadoopInstall]$ln -s hadoop0.12.0 hadoop
這樣一來,所有的配置文件都在/hadoop/conf/目錄中,所有執行程序都在/hadoop/bin目錄中。
但是由于上述目錄中hadoop的配置文件和hadoop的安裝目錄是放在一起的,這樣一旦日后升級hadoop版本的時候所有的配置文件都會被覆蓋,因此建議將配置文件與安裝目錄分離, 一種比較好的方法就是建立一個存放配置文件的目錄,/home/dbrg/HadoopInstall/hadoop-config/,然后將 /hadoop/conf/目錄中的hadoop_site.xml,slaves,hadoop_env.sh三個文件拷貝到hadoop- config/目錄中(這個問題很奇怪,在官網上的Getting Started With Hadoop中 說是只需要拷貝這個三個文件到自己創建的目錄就可以了,但我在實際配置的時候發現還必須把masters這個文件也拷貝到hadoop-conf/目錄中 才行,不然啟動Hadoop的時候就會報錯說找不到masters這個文件),并指定環境變量$HADOOP_CONF_DIR指向該目錄。環境變量在 /home/dbrg/.bashrc和/etc/profile中設定。
綜上所述,為了方便以后升級版本,我們需要做到配置文件與安裝目錄分離,并通過設定一個指向我們要使用的版本的hadoop的鏈接,這樣可以減少我們對配置文件的維護。
SSH設置
在Hadoop啟動以后,Namenode是通過SSH(Secure Shell)來啟動和停止各個節點上的各種守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的方式,故我們需要配置SSH使用無密碼公鑰認證的方式。
首先要保證每臺機器上都裝了SSH服務器,且都正常啟動。實際中我們用的都是OpenSSH,這是SSH協議的一個免費開源實現。FC5中默認安裝的OpenSSH版本是OpenSSH4.3P2。
以 本文中的三臺機器為例,現在dbrg-1是主節點,它需要主動發起SSH連接到dbrg-2和dbrg-3,對于SSH服務來說,dbrg-1就是SSH 客戶端,而dbrg-2、dbrg-3則是SSH服務端,因此在dbrg-2,dbrg-3上需要確定sshd服務已經啟動。簡單的說,在dbrg-1上 需要生成一個密鑰對,即一個私鑰,一個公鑰。將公鑰拷貝到dbrg-2,dbrg-3上,這樣,比如當dbrg-1向dbrg-2發起ssh連接的時 候,dbrg-2上就會生成一個隨機數并用dbrg-1的公鑰對這個隨機數進行加密,并發送給dbrg-1;dbrg-1收到這個加密的數以后用私鑰進行 解密,并將解密后的數發送回dbrg-2,dbrg-2確認解密的數無誤后就允許dbrg-1進行連接了。這就完成了一次公鑰認證過程。
對于本文中的三臺機器,首先在dbrg-1上生成密鑰對:
[dbrg@dbrg-1:~]$ssh-keygen -t rsa
這 個命令將為dbrg-1上的用戶dbrg生成其密鑰對,詢問其保存路徑時直接回車采用默認路徑,當提示要為生成的密鑰輸入passphrase的時候,直 接回車,也就是將其設定為空密碼。生成的密鑰對id_rsa,id_rsa.pub,默認存儲在/home/dbrg/.ssh目錄下。然后將 id_rsa.pub的內容復制到每個機器(也包括本機)的/home/dbrg/.ssh/authorized_keys文件中,如果機器上已經有 authorized_keys這個文件了,就在文件末尾加上id_rsa.pub中的內容,如果沒有authorized_keys這個文件,直接cp 或者scp就好了,下面的操作假設各個機器上都沒有authorized_keys文件。
對于dbrg-1
[dbrg@dbrg-1:.ssh]$cp id_rsa.pub authorized_keys
對于dbrg-2(dbrg-3同dbrg-2的方法)
[dbrg@dbrg-2:~]$mkdir .ssh
[dbrg@dbrg-1:.ssh]$scp authorized_keys dbrg-2:/home/dbrg/.ssh/
此處的scp就是通過ssh進行遠程copy,此處需要輸入遠程主機的密碼,即dbrg-2機器上dbrg帳戶的密碼,當然,你也可以用其他方法將authorized_keys文件拷貝到其他機器上
[dbrg@dbrg-2:.ssh]$chmod 644 authorized_keys
這一步非常關鍵,必須保證authorized_keys只對其所有者有讀寫權限,其他人不允許有寫的權限,否則SSH是不會工作的。我就曾經在配置SSH的時候郁悶了好久。
[dbrg@dbrg-2:.ssh]ls -la
drwx------ 2 dbrg dbrg .
drwx------ 3 dbrg dbrg ..
-rw-r--r-- 1 dbrg dbrg authorized_keys
注意每個機器上的.ssh目錄的ls -la都應該和上面是一樣的
接著,在三臺機器上都需要對sshd服務進行配置(其實是可以不用配置的,完成了上面的那些操作了以后SSH就已經可以工作了),在三臺機器上修改文件/etc/ssh/sshd_config
#去除密碼認證
PasswordAuthentication no
AuthorizedKeyFile .ssh/authorized_keys
至此各個機器上的SSH配置已經完成,可以測試一下了,比如dbrg-1向dbrg-2發起ssh連接
[dbrg@dbrg-1:~]$ssh dbrg-2
如果ssh配置好了,就會出現以下提示信息
The authenticity of host [dbrg-2] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH告訴你它不知道這臺主機,但是你不用擔心這個問題,因為你是第一次登錄這臺主機。鍵入“yes”。這將把這臺主機的“識別標記”加到“~/.ssh/know_hosts”文件中。第二次訪問這臺主機的時候就不會再顯示這條提示信息了。
然后你會發現不需要輸入密碼就可以建立ssh連接了,恭喜你,配置成功了
不過,別忘了測試本機ssh dbrg-1