<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>石无言 &#187; JVM</title>
	<atom:link href="http://www.hugstone.com/index.php/archives/tag/jvm/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hugstone.com</link>
	<description>三生石前问一声，人间哪里修正果！</description>
	<lastBuildDate>Wed, 28 Jul 2010 02:11:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Linux系统中JVM内存2GB限制的原因</title>
		<link>http://www.hugstone.com/index.php/archives/479</link>
		<comments>http://www.hugstone.com/index.php/archives/479#comments</comments>
		<pubDate>Fri, 05 Mar 2010 15:07:34 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JVM]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=479</guid>
		<description><![CDATA[(转载：http://www.javaeye.com/topic/368213 )
接触到的一些用户反映在Linux系统中运行的Java应用，内存只能使用到2GB，在Java虚拟机中如果把-Xmx参数设置到2GB左右（约1.5-1.8GB），java进程就根本启动不了。我们通常使用的JVM都是32位[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/479'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>(转载：http://www.javaeye.com/topic/368213 )</p>
<p>接触到的一些用户反映在Linux系统中运行的Java应用，内存只能使用到2GB，在Java虚拟机中如果把-Xmx参数设置到2GB左右（约1.5-1.8GB），java进程就根本启动不了。我们通常使用的JVM都是32位的（64位的JVM会损失10-20%的性能，通常不建议使用），而32位程序的寻址空间应该是4GB才对，为什么Linux上的JVM只能使用2GB的内存呢？ （注：Windows上也有类似的问题）</p>
<p>经过和JDK研发组的人员沟通，终于弄清楚了一些相关的原因。这个问题存在于早期的一些Linux版本中，特别是内核2.5以前的版本，2.6以后的版本就基本上没有这个问题了。原来这些Linux版本多是32位的，内核使用了2GB空间，应用进程就只有2GB了，也就是说一个地址连续的内存块大小的上限是2GB，而JVM的堆空间（heap size）需要连续的地址空间，因此，2GB就是java进程的理论使用的内存上限。</p>
<p>如果java应用需要使用较大的内存，建议使用较新版本的linux，或者修改Linux的应用/内核内存比配置为3GB：1GB。还有就是选择如Solaris等的UNIX操作系统。象Solaris这样的操作系统，在内存管理上没有2GB的限制，因此可以把heap size设置到3.5-3.6GB左右。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/479/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SUN JDK JVM Heap</title>
		<link>http://www.hugstone.com/index.php/archives/449</link>
		<comments>http://www.hugstone.com/index.php/archives/449#comments</comments>
		<pubDate>Thu, 14 Jan 2010 12:27:53 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[Heap]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JVM]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=449</guid>
		<description><![CDATA[<img class="size-medium wp-image-450" title="JVM Heap" src="http://www.hugstone.com/wp-content/uploads/2010/01/Heap.gif" alt="JVM Heap" width="477" height="280" />
(1)young generation
年轻代分三个区。一个Eden区，两个Survivor区。大部分对象在 Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Sur[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/449'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-450" title="JVM Heap" src="http://www.hugstone.com/wp-content/uploads/2010/01/Heap.gif" alt="JVM Heap" width="477" height="280" /></p>
<p>(1)young generation</p>
<p>年轻代分三个区。一个Eden区，两个Survivor区。大部分对象在 Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Survivor区也满了的时候，从第一个Survivor区复制过来的并且此时还存活的对象，将被复制到tenured generation。需要注意，Survivor的两个区是对称的，没先后关系，所以同一个区中可能同时存在从Eden复制过来对象，和从前一个Survivor复制过来的对象，而复制到年老区的只有从第一个Survivor去过来的对象。而且，Survivor区总有一个是空的。<br />
young generation的gc称为minor gc。经过数次minor gc，依旧存活的对象，将被移出young generation，移到tenured generation</p>
<p>(2)tenured generation</p>
<p>生命周期较长的对象，归入到tenured generation。一般是经过多次minor gc，还 依旧存活的对象，将移入到tenured generation。（当然，在minor gc中如果存活的对象的超过survivor的容量，放不下的对象会直接移入到tenured generation）<br />
tenured generation的gc称为major gc，就是通常说的full gc。<br />
采用compaction算法。由于tenured generaion区域比较大，而且通常对象生命周期都比较长，compaction需要一定时间。所以这部分的gc时间比较长。<br />
minor gc可能引发full gc。当eden＋from space的空间大于tenured generation区的剩余空间时，会引发full gc。这是悲观算法，要确保eden＋from space的对象如果都存活，必须有足够的tenured generation空间存放这些对象。</p>
<p>(3)permanent generation</p>
<p>该区域比较稳定，主要用于存放classloader信息，比如类信息和method信息。<br />
对于spring hibernate这些需要动态类型支持的框架，这个区域需要足够的空间。(这部分空间应该存在于方法区而不是heap中)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/449/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
