仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 489|回复: 9
打印 上一主题 下一主题

[学习教程] 发布一篇从Java代码到Java堆

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:02:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
主要缺点就是:速度比较慢,没有C和C++快
优化使用程序代码的内存利用并非一个新主题,可是人们一般并没有很好地舆解这个主题。本文将扼要先容Java进程的内存利用,随后深切切磋您编写的Java代码的内存利用。最初,本文将展现进步代码内存效力的办法,出格夸大了HashMap和ArrayList等Java汇合的利用。
背景信息:Java历程的内存利用
经由过程在命令行中实行java大概启动某种基于Java的两头件来运转Java使用程序时,Java运转时会创立一个操纵体系历程,就像您运转基于C的程序时那样。实践上,年夜多半JVM都是用C大概C++言语编写的。作为操纵体系历程,Java运转时面对着与其他历程完全不异的内存限定:架构供应的寻址才能和操纵体系供应的用户空间。
架构供应的内存寻址才能依附于处置器的位数,举例来讲,32位大概64位,关于年夜型机来讲,另有31位。历程可以处置的位数决意了处置器能寻址的内存局限:32位供应了2^32的可寻址局限,也就是4,294,967,296位,大概说4GB。而64位处置器的可寻址局限分明增年夜:2^64,也就是18,446,744,073,709,551,616,大概说16exabyte(百亿亿字节)。
处置器架构供应的部分可寻址局限由OS自己占用,供应给操纵体系内核和C运转时(关于利用C大概C++编写的JVM而言)。OS和C运转时占用的内存数目取决于所用的OS,但一般数目较年夜:Windows默许占用的内存是2GB。残剩的可寻址空间(用术语来暗示就是用户空间)就是可供运转的实践历程利用的内存。
关于Java使用程序,用户空间是Java历程占用的内存,实际上包括两个池:Java堆和本机(非Java)堆。Java堆的巨细由JVM的Java堆设置把持:-Xms和-Xmx分离设置最小和最年夜Java堆。在依照最年夜的巨细设置分派了Java堆以后,剩下的用户空间就是本机堆。展现了一个32位Java历程的内存结构:
.一个32位Java历程的内存结构示例

在中,可寻址局限统共有4GB,OS和C运转时约莫占用了个中的1GB,Java堆占用了快要2GB,本机堆占用了其他部分。请注重,JVM自己也要占用内存,就像OS内核和C运转时一样,而JVM占用的内存是本机堆的子集。
Java对象详解
在您的Java代码利用new操纵符创立一个Java对象的实例时,实践上分派的数据要比您想的多很多。比方,一个int值与一个Integer对象(能包括int值的最小对象)的巨细比率是1:4,这个比率大概会让您感应受惊。分外的开支源于JVM用于形貌Java对象的元数据,在本例中也就是Integer。
依据JVM的版本和供给的分歧,对象元数据的数目也各有分歧,但个中通常包含:
类:一个指向类信息的指针,形貌了对象范例。举例来讲,关于java.lang.Integer对象,这是java.lang.Integer类的一个指针。
标志:一组标志,形貌了对象的形态,包含对象的散列码(假如有),和对象的外形(也就是说,对象是不是是数组)。
锁:对象的同步信息,也就是说,对象今朝是不是正在同步。
对象元数据后紧随着对象数据自己,包含对象实例中存储的字段。关于java.lang.Integer对象,这就是一个int。
假如您正在运转一个32位JVM,那末在创立java.lang.Integer对象实例时,对象的结构大概如所示:
.一个32位Java历程的java.lang.Integer对象的结构示例

如所示,有128位的数据被占用,其顶用于存储int值的为32位,而对象元数据占用了其他的96位。
Java数组对象详解
数组对象(比方一个int值数组)的外形和布局与尺度Java对象类似。次要不同在于数组对象包括申明数组巨细的分外元数据。因而,数据对象的元数据包含:
类:一个指向类信息的指针,形貌了对象范例。举例来讲,关于int字段数组,这是int[]类的一个指针。
标志:一组标志,形貌了对象的形态,包含对象的散列码(假如有),和对象的外形(也就是说,对象是不是是数组)。
锁:对象的同步信息,也就是说,对象今朝是不是正在同步。
巨细:数组的巨细。
展现了一个int数组对象的结构示例:
.一个32位Java历程的int数组对象的结构示例

如所示,有160位的数据用于存储int值内的32位数据,而数组元数据占用了其他160位。关于byte、int和long等原语,从内存的方面思索,单项数组比对应的针对单一字段的包装器对象(Byte、Integer或Long)的本钱更高。
<p>
进而能拉拢大多数程序员用windows产品。并且从ASP.NETAJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net的,如果跨平台的.net还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。
灵魂腐蚀 该用户已被删除
沙发
 楼主| 发表于 2015-1-20 12:54:07 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-21 16:49:30 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
地板
发表于 2015-1-27 09:29:03 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
莫相离 该用户已被删除
5#
发表于 2015-1-31 15:47:10 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
谁可相欹 该用户已被删除
6#
发表于 2015-2-6 20:20:15 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
再见西城 该用户已被删除
7#
发表于 2015-2-18 13:16:21 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
乐观 该用户已被删除
8#
发表于 2015-3-6 06:50:48 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
若天明 该用户已被删除
9#
发表于 2015-3-12 22:06:48 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
柔情似水 该用户已被删除
10#
发表于 2015-3-20 03:46:21 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 05:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表