﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-yuyee-随笔分类-jvm</title><link>http://www.blogjava.net/yuyee/category/46758.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Dec 2010 23:36:42 GMT</lastBuildDate><pubDate>Mon, 13 Dec 2010 23:36:42 GMT</pubDate><ttl>60</ttl><item><title>JAVA GC</title><link>http://www.blogjava.net/yuyee/archive/2010/10/26/336136.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Mon, 25 Oct 2010 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/10/26/336136.html</guid><description><![CDATA[JAVA GC有很多种算法，比如引用记数，复制标记-清楚，标记-整理，每种算法都有优缺点，看特定场景选择。
<div>比如当很多临时对象时，复制算法比较好，因为周期短，复制的可以少点，如果许多长寿对象，反复复制就不乐观了，这个时候标记-整理比较好。</div>
<div>目前SUN JAVA的GC用的是分代垃圾回收。</div>
<div>分为年轻代，老年代，持久代</div>
<div>年轻代存放生命周期很短的对象，这部分对象在GC的时候，很多已经是非活动对象，因此采用复制算法，只需要将少量的存货对象copy到to space，存货越少，效率越高。</div>
<div>年轻代的GC叫minor gc，经过多次复制，依旧存活的对象将移出年轻代，移到年老代。</div>
<div>年轻代分为：</div>
<div>eden:每当对象创建的时候，总是被分配到这个区域</div>
<div>survivor1:复制算法中的from space</div>
<div>survivor2:复制算法中的to space</div>
<div>年老代：</div>
<div>生命周期长，经过多次minor gc,依旧存活的对象</div>
<div>老年代的GC 叫major gc,通常也叫full gc</div>
<div>采用标记-整理算法。老年区域比较大，需要时间长</div>
<div>minor gc可能引发full gc。当eden+from space空间大于老年代剩余空间时，就会fucc gc,悲观算法</div>
<div>持久代：存放class信息和方法信息的地方，可通过-XX:MaxPermSize来调整最大值</div>
<div>-XX:NewRatio来设置年轻代与年老代比值</div>
<div>-XX:SurvivorRatio设置eden与survivor区的比值</div>
<div>-XX:MaxTenuringThreshold设置垃圾的年龄，如果=0，则表示不经过survivor区，直接进入年老代</div>
<div>-XX：ParallelGCThreads配置并行收集的线程数，最好与CPU数相同</div>
<div>-XX:+UseParallelGC 选择使用并行收集器</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/336136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-10-26 00:56 <a href="http://www.blogjava.net/yuyee/archive/2010/10/26/336136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM内存结构小记</title><link>http://www.blogjava.net/yuyee/archive/2010/10/25/336128.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Mon, 25 Oct 2010 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/10/25/336128.html</guid><description><![CDATA[<span style="font-size: 14px; line-height: 26px; ">&nbsp;&nbsp; &nbsp;JVM内存结构主要包括两个子系统和两个组件。</span>
<div><span style="font-size: 14px; line-height: 26px; ">两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统；两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">Classloader子系统:装载class信息到运行时数据区</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">Executionengine(执行引擎)子系统：执行Class的地方</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">Runtimedataarea(运行时数据区域)组件:经常说的JVM内存，分为5个区域</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">（1）heap(堆)：存放new 出来的对象和数组，由GC管理内存，每个JVM实例一个堆</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">（2）javastack(栈):每个线程一个javastack，只有压栈和出栈2个动作，以桢为单位</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">(3)methodarea(方法区)：每个JVM实例一个，存储类信息，静态的变量</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">(4)</span><span style="font-size: 14px; line-height: 26px; ">ProgramCounter：每个线程都有一个PC寄存器，记录线程执行的下个地址</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">(5)nativemethodstack：保存本地方法进去区域的地址</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">这里heap和</span><span style="font-size: 14px; line-height: 26px; ">methodarea是所有线程共享，而其他3个则是以线程为粒度隔离的。</span></div>
<div><span style="font-size: 14px; line-height: 26px; ">Nativeinterface(本地接口)组件：与本地lib交互，是与其他语言交互的接口，当调用native方法时，不受JVM限制，可能会抛</span><span style="font-size: 14px; line-height: 26px; ">nativeheapOutOfMemory</span></div>
<div>
<div>栈是JVM的内存指令区，JAVA基本类型，JAVA指令代码，常量都保存在stack中，存取速度快，数据可以共享，缺点是栈中的数据大小和生命周期是确定的，不灵活</div>
<div>堆是JVM的内存数据区，对象实例包括他的属性都作为数据存储在heap中，对象实例在heap中分配好后，需要在stack中保存4个字节的heap内存地址，用来定位该对象在heap的位置，找到该实例，可以动态的分配内存大小，生存期不需要告诉编译器，但是存取慢。</div>
<div>例子：对象的方法和属性保存在哪里？</div>
<div>方法信息在方法区中，属性在heap中</div>
<div>另外，对象的静态属性在方法区中。</div>
<div>非静态方法和静态方法：</div>
<div>实例方法有一个隐含的传入参数，该参数就是this,也就是当前对象实例在stack中的地址指针，因为调用非静态方法时，都要先new出来。</div>
<div>静态方法无此隐含参数，不需要new 对象，只要class文件被ClassLoader加载到JVM的stack中，静态方法就能被调用，当然，静态方法取不到heap中的对象属性，因为还没对象呢。。。</div>
<div><br />
</div>
</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/336128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-10-25 22:48 <a href="http://www.blogjava.net/yuyee/archive/2010/10/25/336128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMM小记</title><link>http://www.blogjava.net/yuyee/archive/2010/10/25/336090.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Mon, 25 Oct 2010 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/10/25/336090.html</guid><description><![CDATA[JMM，顾名思义，java memory model。他有3个特征：原子性，可见性，有序性。
<div>JVM系统中都有个一主存，JAVA中所有变量都是存储在主存中，对所有线程都是共享的。</div>
<div>而每条线程都有自己的工作内存，工作内存中保存的是主存中某些变量的值，线程对所有变量的修改都是在工作内存中进行，线程之间无法直接互相访问，变量的传递都是通过主存完成。</div>
<div>可见性：JMM中并发线程修改变量，必须将工作内存中的变量同步到主存后，其他线程才能访问到</div>
<div>有续性：通过JAVA提供的同步机制或者volatile关键字 来保证内存的有序性</div>
<div>JAVA中保证多核系统JMM缓存一致性原则：<span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">happens-before ordering(先行发生排序）</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">JAVA提供了</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">1.synchronized关键字</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">2.volatile关键字</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">3.final关键字</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">4.同步包中的locks</span></div>
<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">5.同步包中的原子类</span></div>
<img src ="http://www.blogjava.net/yuyee/aggbug/336090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-10-25 15:04 <a href="http://www.blogjava.net/yuyee/archive/2010/10/25/336090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些JDK自带的分析工具</title><link>http://www.blogjava.net/yuyee/archive/2010/09/26/332925.html</link><dc:creator>羔羊</dc:creator><author>羔羊</author><pubDate>Sun, 26 Sep 2010 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/yuyee/archive/2010/09/26/332925.html</guid><description><![CDATA[<span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jps:查看JAVA线程ID</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jinof:</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jinfo -flag MaxPermSize &lt;PID&gt;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;查看VM参数信息</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jstat;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jstat -opt &lt;PID&gt; 一般常用-gcutil查看垃圾收集信息，后面还可加一个间隔时间</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jmap:</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">dump的生成工具，生成堆转储文件后可用MAT分析 jmap -dump:format=b,file=XX &lt;pid&gt;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">也可用jmap -histo &lt;PID&gt;将信息输出到控制台</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jconsole:</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">jconsol是jdk自带的一个内存分析工具，它提供了图形界面。可以查看到被监控的jvm的内存信息，线程信息，类加载信息，MBean信息</span>
<div>jdk1.6提供了java visualVM，功能很全，类似Jprofiler</div>
<div>
<div>-XX:+HeapDumpOnOutOfMemoryError:这个参数指定在OOM时产生DUMP</div>
<div>-XX:HeapDumpPath 这个是要保存的 dump文件的路径，后缀为.hprof</div>
</div>
<div>例子：-XX:HeapDumpPath=C:\Documents and Settings\aoxianglin\Application Data\.visualvm\6u18\var\log\heapdump.hprof</div>
<img src ="http://www.blogjava.net/yuyee/aggbug/332925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuyee/" target="_blank">羔羊</a> 2010-09-26 11:29 <a href="http://www.blogjava.net/yuyee/archive/2010/09/26/332925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>