首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

越深入java 就觉着java做得越烂(个人觉得应当做得更好)

2011-11-21 
越深入java 就觉得java做得越烂(个人觉得应当做得更好)近段时间,项目要求对java的内存有要求,客户希望不要

越深入java 就觉得java做得越烂(个人觉得应当做得更好)
近段时间,项目要求对java的内存有要求,客户希望不要老是要他们扩大内存,所以此过程中了解了一些问题。
越想觉得,java越不是。

1,基础对象占有内存 byte,char,short,int,long,float,double分别为 1,2,2,4,8,4,8,byte;
  包括后Byte,Short,Integer,Long....等分别为 16,16,16,16,都是byte
  本来是 1字节的 byte包装后占 16字节!! 太不象话了,白用我的内存。除了一个Object 8byte指针其它浪费。
2, Object 8byte指针,就算定义个空对象,也一样占8byte 我觉得一个指针要 8个字节吗?有必要吗?我的内存啊。
  2^64= 18446744073709551616 byte =17179869184G 有可能用这么大的内存地址吗?(欢迎内行发言)。
  个人觉得:6个byte足也,281474976710656 = 262144G 不知道有什么难处要用 8byte.
3, Byte 用了 16字字节,真是想不通:8(指针)+8;浪费7byte
4, Short用了 16字字节,真是想不通:8(指针)+8;浪费6byte
5, Integer 用了 16字字节,真是想不通:8(指针)+8;浪费4byte
6, Long 用了 16字字节,:8(指针)+8;没浪费。
7, Float 用了 16字字节,真是想不通:8(指针)+8;浪费4byte。
8, Double 用了 16字字节,:8(指针)+8;没浪费。
9, BigDecimal 用了 32字字节,:8(指针)+24;除指针外 16不够? 太猛了吧?吃内存啊!!!
10,object = new String(); 用了 40 字字节,:8(指针)+32;好象内存没花钱一样。
11 int[] a =new int[]{0}; 也是16字节
11 long[] a =new long[]{0}; 也是24字节

这么基础的东西,做得这样烂,java倒底怎么了? 难道为吃内存而生? 

现在知道,为什么java在游戏上插不上足,这样根本是不行的。

不用对象,又难以区分数据库为空的数据,真是进退两难。
为什么java不在新版本上来个新架构啊,这样下去只有一条:死.........



[解决办法]
学习....
[解决办法]
汗啊,真不知道你是怎么算出来的
算这个有意义吗?你认为你算的准确吗?
你以为java就只吃了你列出的那些内存吗?
得了,你不如去搞C吧,内存你自己控制,想怎么搞怎么搞
哈哈~
[解决办法]
哇。。
[解决办法]
楼主是如何确定其大小的?
[解决办法]
不错,学习了。
[解决办法]
lz太猛了,能告诉大家你怎么算出来的吗?
[解决办法]
硬件成本越来越低了,杞人忧天啊
[解决办法]

我认为不是别人做的不好,而是你自己的设计可能存在着不周全而造成的。呵呵。。。
[解决办法]
不用对象也行啊。
只要你愿意把1 个方法 public void h(Number arg),换成 8个方法来写。
public void h(byte arg)
public void h(short arg)
……
当涉及到范型的时候,本来一个类就实现的设计,换成8个类来写。
[解决办法]
真的假的啊...现在内存都这么大了...这么算来算去有意思吗???
[解决办法]
到了必要时,会自动调用 GC的,

现在我们的系统日产数据: 300多万条(20多列),内存数据放得太多,服务器受不了。客户已经把内存加到 4G了。 
....你产生了那么多数据,难道全部保存到内存中,也太强了吧
[解决办法]
很想知道楼主是用什么方法得出这样的结论的??
[解决办法]
不要总是用过程思维,OO都广告了多少年了

这些包装过后的东西:Byte,Short,Integer,Long
是对象,对象就有属性和方法,怎么会是指针+数据长度.........

再说了
你拿一个对象去和基本类型比内存占用,有意义吗?

面向对象编程的目的是什么??

[解决办法]

Java code
你比sun公司还牛
[解决办法]
java将来会进步的
[解决办法]
探讨
Java code你比sun公司还牛

[解决办法]
探讨

如果大系统连操作系统都支持不了多大的内存,现在我们的系统日产数据: 300多万条(20多列),内存数据放得太多,服务器受不了。客户已经把内存加到 4G了。


------解决方案--------------------


思维方式错误导致行为错误,
以这样的思维方式设计开发的系统,怎么能运行稳定?
楼主要把后期维护人员给累死。

楼主是不是很多年没有学习过新技术知识?
[解决办法]
??
[解决办法]
拿面向过程编程的思想来考虑面向对象的东西,你永远也理解不了
[解决办法]
楼上到底谁说的有道理???
[解决办法]
任何工具都有其适用范围,就LZ的使用场景,我觉得根本就合适用JAVA。
[解决办法]
看看
[解决办法]
本来用 byte 只需要 100M,如果用 Byte就要 1.6G 



我靠 ,做的什么比较,你杀死一只蚂蚁和你杀一个人去比较,你有多少命够毙.
[解决办法]
我学java就是为咯做网站的
[解决办法]
嘿嘿
[解决办法]
为什么不在数据库那边设置默认值. 你有了默认值. 还在乎null的情况么?

解决问题.又不是只有一种方法. 如果你这真的是一种问题的话. 那java社区早都炸锅了. 没你说的份根本.
[解决办法]
唉..
 作为新手根本看不懂..
 想学都学习不了啊..

[解决办法]
無語
[解决办法]
这可能和jvm有关,java的发明者不可能没想到这些,包装可能是为了跨平台,不至于出现不同平台的长度不一样。
[解决办法]
java程序是可以成编译成平台特定的,不过我没试过,那样应该会解决你说的内存占用问题,不过,加几条内存是个最简单的解决问题,现在2G才140.
[解决办法]
你只深入了一点点,如果耐心的继续研究,就会发现自己是多么愚昧了!
[解决办法]
楼主应该用汇编语言,C都无法满足你对内存的控制要求。

当然,我不会用,因为我的应用程序内存总是够用的
[解决办法]
老紫竹说的对,对于计算机语言,只要自己掌握的好,绝对够用的,其它的,纯粹扯淡。
[解决办法]
Java毕竟还是使用率第一的语言,虽然我还在努力试着喜欢上它。

[解决办法]

探讨
Java毕竟还是使用率第一的语言,虽然我还在努力试着喜欢上它。

[解决办法]
学习
[解决办法]
探讨
java在这方面的问题,日益显得严重,否则,在1.5,1。6等版本中,用cache来解决速度与内存问题。
所以java是知道这个问题,问题是改动太大,影响到根本的体系了。
大家可以在1.5测试:
Long a = 2L;
Long b = 2L;
System.out.println(a == b);
//结果为ture
两个对象的引用是一样的。
但是你测试:
Long c = 1000L;
Long d = 1000L;
看看?相引用一样吗?

但是这种改变远远不能解决根本问题。只能是1.5…

[解决办法]
探讨
现在很多系统为了加快速度,都做了缓存的,小系统当然不存在这个问题,算算吧。
本来用 byte 只需要 100M,如果用 Byte就要 1.6G
(你有多少米?内存地址能搞多大?32? 64?)
本来用 int 只需要 400M,如果用 Integer就要 1.6G

如果大系统连操作系统都支持不了多大的内存,现在我们的系统日产数据: 300多万条(20多列),内存数据放得太多,服务器受不了。客户已经把内存加到 4G了。

[解决办法]
Java code
/** *  */package test;/** * @author - yy * @time   - Dec 3, 2008 10:58:15 AM */public final class TestObject {  // 测试对象//  private boolean b1;    如果类里面不到8个(含8个)boolean  ,TestObject 占内存是16 bytes;//  private boolean b2;    9-16个boolean,TestObject  占内存是24 bytes; 以此类推//  private boolean b3;//  private boolean b4;//  private boolean b5;//  private boolean b6;//  private boolean b7;//  private boolean b8;//  private boolean b9;//  int i1;                如果类里面不到2个(含2个)int  ,TestObject 占内存是16 bytes;//  int i2;                2-4个int,TestObject  占内存是24 bytes; 以此类推//  int i3;  //  long L1;               多一个long就增加8bytes//  long L2;// String的字段有//    char value[]=new char[0]; // 8bytes//    int offset;  \//    int count;    |  8bytes//    int hash;    ///    long serialVersionUID = -6849794470754667710L;  // 8bytes//    ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];// 8bytes//    加上自身的8bytes// 正好40bytes//  其他类型的类似//  应该可以解释了吧} 


[解决办法]
楼主可能忘记了字段的属性也要吃内存的啊
[解决办法]
包装类不是为了节省系统开销而存在的.
同样:面向对象也不是为了节省系统开销而存在的.

同时,内存的占用与释放不但来自于底层结构,真正重要的还是项目设计.
如同你要导入2000万条记录一样,在一个事物里控制,就是用汇编来写代码,内存也是不够的.

另外,包装类的内存占用计算貌似是错误的,它比你想象中更大,严格遵守了Java类的标准,有自己的属性和行为.
而BigDecimal类有可能是最大的(这个没计算).
[解决办法]
JAVA从它诞生开始,就以吃内存和速度慢而闻名,楼主说的 Byte 占用多少字节这档子事,估计从 java 还在吃奶时就已经存在了,但是这么多年来也都活下来了,并且活得越来越精神,不但企业用它,而且小设备也一直用它。随着这些年来硬件成本越来越低,内存价格更是一路往下跌,所以针对楼主的投诉,JAVA的设计者可能跟本不会考虑。
[解决办法]
我只是根据结果再解释原因的
比如说为什么String占用了40 bytes;

ps: 另外上面的String的我也解释错了

Java code
// String的字段有//    char value[]=new char[0]; // 16bytes//    int offset;  \ 2个共用 8bytes//    int count;   ///    int hash;    // 8bytes//    long serialVersionUID = -6849794470754667710L;  // 类属性不算,因为共用一个//    ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; // 类属性不算,因为共用一个//  加上自身的8bytes// 正好40bytes
[解决办法]
jsp比asp和php都快........
[解决办法]
探讨
cangyue87:没算过怎么说我的是错的? 你还是算算再来说。

[解决办法]
getRuntime方法只能统计当前的运行时对象,
它统计的是当前栈的总消耗.

gc的调用同样是不可控制的,
不过看楼主的运行效果貌似回收很及时的样子,
也许是因为程序短小的缘故喵???
[解决办法]
探讨
楼上,很多大网站都选择用PHP,就是因他快,包括IBM在内的大公司,都是支持PHP的。

[解决办法]
63楼抓误....."网站的运行效率"说法很那啥,我想表达的是网站整体的稳定性和承受访问量的能力,那得看你怎么设计的,当然我完全外行喵~``
[解决办法]
63楼抓误....."网站的运行效率"说法很那啥,我想表达的是网站整体的稳定性和承受访问量的能力,那得看你怎么设计的,当然我完全外行喵~``
[解决办法]
一、基础数据封装类的16个字节,这个就是“面对对象”的代价。如果面对过程,在这里设计的会变得繁复,而且复用性差。这个问题如果想不明白的话。你可以去比较一下在C++里面的string使用和在java中的string使用就可以体会到了。
二、关于数组大小的问题,本身是可以增加大小的。
1.采用固定大小的办法是为了提高性能,这个应该都明白。那么关于这个大小是多少的问题,太小了,频繁增加性能反而降低,太大了又不能起到提高性能的作用。这个平衡点,我觉得sun找得还可以。
2.如果只在需要的时候给内存,则需要另给内存保留指针,该指针指向新增元素地址。频繁增加,不但更占用内存,而且降低性能。引伸出的问题是实际是不是需要频繁增加的呢,我觉得是的,尤其是一些高级类里面,不断地要掉父类构造和释放方法时。
总结、短时间内不会改变,即使改变也是增大。减小几乎不可能。

[解决办法]
忘记讲了,完全同意52楼的看法。
[解决办法]
一个对象占用的内存跟其属性有关,
属性越多其占用的内存就越多不是吗?
就像是包装类一样,它就只保存被包装的数据吗?
它一样有其他的属性,要消耗内存的!
[解决办法]
探讨
63楼抓误....."网站的运行效率"说法很那啥,我想表达的是网站整体的稳定性和承受访问量的能力,那得看你怎么设计的,当然我完全外行喵~``

[解决办法]
楼主应回到机器语言时代。
[解决办法]
关注,见到很多牛人的回复。
LZ也是牛人。
[解决办法]
同意http://topic.csdn.net/u/20081202/15/20ba8be0-04c7-4e54-bdd9-d2f6b3c1f413.html?seed=53448279 说的!!!
另外不认为Java有多牛,每个语言都有自己优势的地方,在某些方面Java也是废材!

------解决方案--------------------


LZ你的思维还停留在面向过程上面。。。JAVA是纯OO的语言。为了实现OO的特性,吃内存是没办法的事情,但是在运行效率上的牺牲换了的是开发速度和可维护性上的巨大进步。再说JAVA的定位本来就没有过多的考虑对游戏这类极其重视运行效率的程序的支持。应该说寸有所长,尺有所短,针对的目标不一样,使用的体系就不一样,在JAVA不擅长的这方面去死抠没多大意义
[解决办法]

探讨
硬件成本越来越低了,杞人忧天啊

[解决办法]
探讨
引用:
硬件成本越来越低了,杞人忧天啊

硬件便宜了,那是客观现象。
但是假如硬件是越来越贵了,那java该怎么办?

[解决办法]
好久没有这么热闹了
楼主的心情也是可以理解的,大家无非都是在担心java的发展嘛
希望大家讨论不要带情绪。大家都是在java这条路上发展的,是属于同一个方向,都是同一条船上的,不要为这些事争得面红耳赤。

我想发表一下自己的看法:
1.楼主的那个项目看起来规模蛮大,但是不管怎么说,楼主项目的设计是有问题的;
而且,一个服务器4g的内存,也不奇怪。客户埋怨产品不好,从古至今,一直都是存在的,
我还想用1M的内存去跑网游呢,呵呵,难道客户那边的反馈就一定是客观的吗?
2.楼主的担心也不无道理。不过,我想我们作为开发者,还是应该首先从自己的代码入手。至于jvm,jdk,还是让sun那帮人忙活吧,除非你能搞出自己的更有效的产品出来。


[解决办法]
内存就是用来吃的吧,现在的项目应用对于内存的胃口是越来越大了。

[解决办法]
探讨
我觉得就象吃饭一样:
我要拿一个碗,就可以放进饭菜,如果一定要我拿16个碗吃饭,是不是有点浪费?我的手好象不能加。
内存可以加,如果不能加呢?硬件只有点点大呢?

[解决办法]
up
[解决办法]
感觉你们的项目不应该用java开发,用C++或者C都是比较好的.
既然都用那么多的JNI了,干脆就不再用Java了.
[解决办法]
反正无用的,都被回收得了~多在回收这方面下工夫啦~~哈哈。开个小玩笑……

主要是写的时候想好哪些可以拆尽可能地往简单着手,减少使用量着手……呵榀,不知道者,来讨教的!

始终坚持:回帖是一种美德!
[解决办法]
java做的这些都是为了平台通用性而设计的
[解决办法]
貌似C也差不多吧!!
int,char占用差不多。。你要修改基础类,支持你,等待你的喜讯。

内存地址总线查的时候就以一个Byte为准。
[解决办法]
这样看,你只能用汇编了
[解决办法]
很烂吗? 我用的挺顺手的。
[解决办法]
具体底层怎么回事我不知道,暂时还没出现内存不够用的情况。
lz说的那些基础数据什么的看着确实占内存不少,但一个设计好的方法里面要用到多少呢?即使是for循环,内部的变量在一个循环结束后就会把内存释放了吧?循环外部你能定义多少变量、对象呢?如果你一个方法体写了1M+,定义了N*N的变量、对象,那我无语了,,,多少内存也不够用的啊,,,


[解决办法]
任何事物都不可能完美。
你有经历过用c写webservie的经历吗?那时你会体会到用java是多么美好。

[解决办法]
顶LZ。。。支持 学习

[解决办法]
首先要理解java的追求目标是安全,而不是高效率.
java在处理一写基本类型是,都是采用的unicode编码,目的是让只要运行在jvm上的程序都是世界统一的,不论任何平台,在上层语言上都是统一的.然后sun在机器语言这一层次上编写出各种平台的jvm.
其实sun公司是非常有远见的,大家想想,所着用java的人越来越多,我们在硬件上会不会跟着软件来设计.而不用在让jvm运行在其他平台之上.
微软为什么要推出.net平台?就是为了与java强市场吗.但是个人觉得.net做的仅仅是让一些语言写出的程序在汇编这一层统一起来,我觉得从策略上远比不上sun公司

[解决办法]
100楼是我的喵~~``

当我看到楼主说龙书的时候就只能感叹偶的神呐~``
记得Sun有明确说明包装类和普通类在JVM上保持一致,实例方法在JVM的堆里需要单独划分,如果我理解错了,还麻烦求一个出处喵~``

不过这个跑题了吧,楼主提出的问题不归属底层设计喵~`
面向对象(包装类)的开销必然比面向过程(基础类型)更大,它以更大的消耗为编码的逻辑服务.
就像现在的面向事物或者面向插件的开发,执行效率必然有更大的消耗----因为它出来的初衷节省的就不是内存.

如果公司里同时有Java和C++两个部门.
也许就会经常听C++朋友们抱怨:我们C++的被分去一个糟糕的项目,那实在太坏了-----C++起比Java,要做烂尾可是真彻底,真容易.

毕竟,我们有不同的关注重点,和不同的烦恼喵~!

热点排行