<?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>Java Object size &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/java-object-size/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Sun, 03 May 2020 11:45:40 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创]在Java中如何计算一个Object的size</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8java%e4%b8%ad%e5%a6%82%e4%bd%95%e8%ae%a1%e7%ae%97%e4%b8%80%e4%b8%aaobject%e7%9a%84size/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8java%e4%b8%ad%e5%a6%82%e4%bd%95%e8%ae%a1%e7%ae%97%e4%b8%80%e4%b8%aaobject%e7%9a%84size/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Fri, 16 Aug 2013 06:41:21 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Java Object size]]></category>
		<category><![CDATA[Java对象占用内存大小]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=6993</guid>

					<description><![CDATA[<p>
我之所以要计算一个Object的size，是因为有一个项目里要缓存一些Object，想在unit test里预估一下每个Object占用的内存大小，从而估计出服务器的内存可以缓存多少Object。<br />
<span id="more-6993"></span><br />
于是Google了一下，找到到<a href="http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个网页</span></a>和<a href="http://stackoverflow.com/questions/9368764/calculate-size-of-object-in-java" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个网页</span></a>。后面那个链接中提到了一个非常有用的library：<a href="https://github.com/DimitrisAndreou/memory-measurer" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">memory-measurer</span></a>，著名的<a href="https://code.google.com/p/guava-libraries/" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Guava</span></a>库也在内部使用了它。从它的介绍：</p>
<blockquote>
<div>
		A small tool that is very handy when e.g. you design data structures and want to see how much memory each one uses. To do this, it uses a simple reflection-based object-traversing framework (ObjectExplorer).</div></blockquote>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8java%e4%b8%ad%e5%a6%82%e4%bd%95%e8%ae%a1%e7%ae%97%e4%b8%80%e4%b8%aaobject%e7%9a%84size/" class="read-more">Read More </a>]]></description>
										<content:encoded><![CDATA[<p>
我之所以要计算一个Object的size，是因为有一个项目里要缓存一些Object，想在unit test里预估一下每个Object占用的内存大小，从而估计出服务器的内存可以缓存多少Object。<br />
<span id="more-6993"></span><br />
于是Google了一下，找到到<a href="http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个网页</span></a>和<a href="http://stackoverflow.com/questions/9368764/calculate-size-of-object-in-java" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个网页</span></a>。后面那个链接中提到了一个非常有用的library：<a href="https://github.com/DimitrisAndreou/memory-measurer" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">memory-measurer</span></a>，著名的<a href="https://code.google.com/p/guava-libraries/" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Guava</span></a>库也在内部使用了它。从它的介绍：</p>
<blockquote>
<div>
		A small tool that is very handy when e.g. you design data structures and want to see how much memory each one uses. To do this, it uses a simple reflection-based object-traversing framework (ObjectExplorer). On it, it builds two facilities:</div>
<div>
		&nbsp;</div>
<div>
		* MemoryMeasurer, which can estimate the memory footprint of an object graph in bytes. This requires installing a javaagent when running the JVM, e.g. by passing -javaagent:path/to/object-explorer.jar.</div>
<div>
		* ObjectGraphMeasurer does not need a javaagent, and can also give a much more qualitative measurement than MemoryMeasurer - it counts the number of objects, references, and primitives (of each kind) that an object graph entails.</div>
</blockquote>
<div>
	我们可以看出来，要得到一个Object的大小，只需要像下面这样用就可以了：</p>
<pre class="brush:java;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
System.out.println(MemoryMeasurer.measureBytes(new HashMap&lt;String, String&gt;()));
</pre>
<p>	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	接下来，把对这个package的依赖添加到你的项目中：</p>
<ul>
<li>
			如果你的项目是Ant管理的，那么，把jar包拷贝到你项目里的jar包目录下</li>
<li>
			如果你的项目是Maven管理的，貌似作者还没有把该项目加入到Maven central repo中，所以我不知道pom.xml该怎么改</li>
</ul>
<p>	然后你会发现，就算你已经添加好了依赖，在IDE中直接运行这个unit test，还是会报错，无法运行。错误提示大概是下面这个样子：</p>
<div>
<blockquote>
<div>
				java.lang.ExceptionInInitializerError</div>
<div>
				at ...</div>
<div>
				Caused by: java.lang.IllegalStateException: Instrumentation is not setup properly. <span style="color:#0000ff;">You have to pass </span><span style="color:#ff0000;">-javaagent:path/to/object-explorer.jar</span><span style="color:#0000ff;"> to the java interpreter</span></div>
<div>
				at com.google.common.base.Preconditions.checkState(Preconditions.java:145)</div>
<div>
				at objectexplorer.InstrumentationGrabber.checkSetup(InstrumentationGrabber.java:20)</div>
<div>
				at objectexplorer.InstrumentationGrabber.instrumentation(InstrumentationGrabber.java:25)</div>
<div>
				at objectexplorer.MemoryMeasurer.&lt;clinit&gt;(MemoryMeasurer.java:21)</div>
</blockquote>
<div>
			错误信息已经说得比较清楚了，要向Java interpreter传递一个参数：</p>
<pre class="brush:plain;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
-javaagent:testlib/object-explorer.jar
</pre>
<p>			在这里，testlib/object-explorer.jar 是我的object-explorer.jar在项目中的相对路径。<br />
			问题是，这个参数填到哪里去呢？<br />
			<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
			前面已经说了，我是在unit test中运行的，所以，这跟IDE有关。我用的是IntelliJ，应该像下面这样设置：<br />
			<span style="background-color:#00ff00;">『1』</span>点击IntelliJ菜单 Run&rarr;Edit Configurations&rarr;在左栏的列表中选择你的那个unit test，则右边的对话框设置的是此unit test的属性。<br />
			<span style="background-color:#00ff00;">『2』</span>在对话框中的&ldquo;VM options&rdquo;一项中，我们看到它已经填上了&ldquo;-ea&rdquo;，现在要加上前面提到的参数，变成：</p>
<pre class="brush:plain;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
-ea -javaagent:testlib/object-explorer.jar
</pre>
<p>			然后再重新运行unit test，成功！打印了出了Object的size。</p>
<p>			<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
			<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
			转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
			感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
				<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
</p></div>
</p></div>
</div>

			<!--[syntaxhighlighter]-->
			<!--代码高亮，请勿编辑-->
			<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shCore.js"></script><script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushJava.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushPlain.js"></script>

			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shCoreCk.css" />
			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shThemeCk.css" />
			<script type="text/javascript">
			SyntaxHighlighter.defaults['class-name']	= '';
			SyntaxHighlighter.defaults['smart-tabs']	= true;
			SyntaxHighlighter.defaults['tab-size']		= 2;
			SyntaxHighlighter.defaults['gutter']		= true;
			SyntaxHighlighter.defaults['quick-code']	= true;
			SyntaxHighlighter.defaults['collapse'] 		= false;
			SyntaxHighlighter.defaults['auto-links']	= true;
			SyntaxHighlighter.defaults['toolbar']		= true;
			SyntaxHighlighter.all();
			</script>
			<!--[/syntaxhighlighter]-->]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8java%e4%b8%ad%e5%a6%82%e4%bd%95%e8%ae%a1%e7%ae%97%e4%b8%80%e4%b8%aaobject%e7%9a%84size/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
