社区
Java
帖子详情
对static有心得的高手进来讨论一下!
zhb_821012
2008-03-11 03:09:18
对static有体会的高手进来讨论一下它的优势和弊病吧!
我现在就先如果在一个程序中大量运用static定义的方法,那会不会使这个程序的稳定性受到影响呢?
我是这么理解的,定义为static后,在内存中单独给此方法开辟一块空间出来后,如果长时间运行这个有很多static方法的程序的话,这些内存不后被虚拟机垃圾收回,这样会不会就会影响程序的稳定性?
这是我的突然的一个想法,高手进来都说说吧!希望大家都能有所收获!
...全文
395
39
打赏
收藏
对static有心得的高手进来讨论一下!
对static有体会的高手进来讨论一下它的优势和弊病吧! 我现在就先如果在一个程序中大量运用static定义的方法,那会不会使这个程序的稳定性受到影响呢? 我是这么理解的,定义为static后,在内存中单独给此方法开辟一块空间出来后,如果长时间运行这个有很多static方法的程序的话,这些内存不后被虚拟机垃圾收回,这样会不会就会影响程序的稳定性? 这是我的突然的一个想法,高手进来都说说吧!希望大家都能有所收获!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
39 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
南南北北
2008-03-31
打赏
举报
回复
static方法,破坏了抽象、继承、多态。所以我们说它不够面向对象,至于是否面向对象,就仁者见仁了。
另外,一个方法所占用的内存是一定的,和它是不是静态的没有关系。
静态方法、变量,实例方法 一块内存区域(也许不是一块,但绝对不是堆上,不需要垃圾回收,占用空间只与方法大小有关,个人理解可能是代码段)。
实例变量+方法的引用 堆(垃圾回收的是这块)
调用方法 临时变量 栈(不需要垃圾回收)
sunyujia
2008-03-16
打赏
举报
回复
至于性能我觉得静态方法和普通方法是一样的,不过是静态字段占内存而已
sunyujia
2008-03-16
打赏
举报
回复
上面帖子太长不细看了,我的个人感觉是如果真的需要就用,很多时候导致参数过多用起来不爽,不够oo,那就用对象,至于内存占用,我觉得现在内存真的很便宜。
Z8157522
2008-03-15
打赏
举报
回复
精华帖,顶一个.学习了好多.
UnknowREN
2008-03-15
打赏
举报
回复
好的设计可以损失一定的性能,这样是值得的
期待高手继续
kekeemx
2008-03-14
打赏
举报
回复
其实我感觉很重要的一点是,一般STATIC方法都是作为工具类的某些通用方法存在的,
这样就很容易涉及到多线程调用的问题吧,所以我一般都是注意他在多线程环境下是否
会出现同步之类的问题,不知道这样对不对啊....来个高手啊.
sunwei_07
2008-03-14
打赏
举报
回复
学习了
zhb_821012
2008-03-14
打赏
举报
回复
好像静态的不会被回收器回收吧
这个还得再考察一下
一直没注意
zhb_821012
2008-03-13
打赏
举报
回复
晕有人理解错我意思了
不是说比一般方法多占内存
意思是不会被回收这个意思的多占
zapdos
2008-03-12
打赏
举报
回复
同意Gump09&楼上
睿音
2008-03-12
打赏
举报
回复
澄清一点:我是不赞同静态占内存多的。
[Quote=引用 14 楼 Gump09 的回复:]
类加载是不是把class文件加载进内存
[/Quote]
对于这点,我认为是确定的。在JVM加载Class的时候,是会在JVM内部实例化一个对应的Class(java.lang.Class)实例,对类中引用到的其他类加载并将类方法加载到JVM的Method Area中。
[Quote=引用 14 楼 Gump09 的回复:]
如果是那么实例方法和静态方法会不会都被加载
[/Quote]
对于这点,我想先纠正一下咱们现在的偏颇,我对lz的理解一直停留在static这个概念上,不知何时却转到了静态的方法上。
类的方法在类被加载时是便已加载到虚拟机的Method Area中了。
不论是否是静态方法。
[Quote=引用 14 楼 Gump09 的回复:]
如果是那么生成实例时静态方法会不会再生成一个。
[/Quote]
对于这点,我很赞同Gump09的这个词"引用",我感觉不论是静态方法还是非静态方法都是对JVM的Method Area的引用,不论是否是静态方法,应该都是不会再重复去加载到内存空间内。
[Quote=引用 14 楼 Gump09 的回复:]
如果不是那么类会不会被回收。
[/Quote]
对于这点,我的答案是确定的。类在加载时生成一个Class实例,对于这个实例JVM应该是可以去回收的,只是回收是在何时进行的。至少在JVM关闭前是一定会回收的。因为JVM不会将对Class占用内存的回收工作交给System去做。System应该只去回收JVM kernel所占用的内存。
[Quote=引用 14 楼 Gump09 的回复:]
如果还不是那么可以想象静态方法是和类同在的。至少它的数量比一个实例方法的数量不会多。
[/Quote]
方法是与类同在的。
先表述我的一个见解,由于方法和属性的加载是不同的。属性只有在实例化后得到Object的时候才会被分配内存,对于是否静态的区别也就在于是否持有多个副本,非静态属性(可能这个时候叫字段更合适)每个Object中持有一个副本,而静态字段所有的Object引用一个副本。
对于static我的感觉是给JVM的一个标示,标示是否允许JVM对这段占用的内存进行回收。这样我将这个话题也就转移到,JVM是何时对Class的实例进行回收。
joker_yao
2008-03-12
打赏
举报
回复
容易导致逻辑上的混乱
Gump09
2008-03-12
打赏
举报
回复
芯火兄 看的是哪本书啊 共享一下贝
睿音
2008-03-12
打赏
举报
回复
刚才细看了下,垃圾回收器仅是对堆空间进行管理。
这样说来我所说的“是给JVM的一个标示,标示是否允许JVM对这段占用的内存进行回收”是并不成立的了。而就像Gump09所
说仅是栈中引用的次数不同而已。
Gump09
2008-03-12
打赏
举报
回复
[Quote=引用 18 楼 pizzame 的回复:]
说起这个我是很点背的,当时看inside JVM的时候是看的英文版,之后找到中文版了又懒得再看一遍~所以尤其是回收这里是有些蒙的。
我所知道的是类加载的实例是加载到Method Area的,而实例化后得到的对象是放入堆中的。JVM的动态回收机制是否会对Method Area回收否?
[/Quote]
这个我好像也见过。
对于加载有三步
1,得到类型的全限定名,产生字节流。
2,将二进制字节流加载到Method Area
3,创建一个java.lang.Class 实例来代表1产生的字节流
zhb_821012
2008-03-12
打赏
举报
回复
至于一般方法何时会被回收,那就不用考虑了,因为不是我们开发者能够控制的,这也是java当初努力实现的一个好处,这样避免了开发者将太多的精力放在对内存的分配使用上,从而极大的提高了程序开发的效率,这也是java的初衷,
zhb_821012
2008-03-12
打赏
举报
回复
恩不错,大家很多人都说到点在上了
其实关键的就是静态方法jvm不会去回收它了,因为他一开始从jvm的类装载器中装载的时候已经给这个方法做标记了
大家知道,jvm主要的一个组件就是类装载器,系统类装载器就不用考虑了,因为它不是我们开发者需要注意的,当一个用户类装载器把一个class二进制文件装载后,如果类中存在static方法,那么意味这对应开辟的内存不会被回收,一直到容易生命周期的结束,而一般方法开辟的内存是可复用的
所以说静态方法相对于一般方法是会多占用内存的
至于说的机器会吃不消这是肯定不可能的,还不至于
ee4456
2008-03-12
打赏
举报
回复
static 有其存在的特殊含义,可以实现普通函数和普通变量等,不能实现的功能,比如说单例模式,因为类在外部不能让他来new,那么你就写了个静态方法,用类名来直接调用返回一个他的实例
该用的时候用,
不该用的时候当然不用了,就和大家为什么都不把变量定义成全局变量一样的道理。
caven110
2008-03-12
打赏
举报
回复
内存肯定吃不消。程序一开始就把你的static属性和方法全都加载进来,你到时什么都不用做了
睿音
2008-03-12
打赏
举报
回复
说起这个我是很点背的,当时看inside JVM的时候是看的英文版,之后找到中文版了又懒得再看一遍~所以尤其是回收这里是有些蒙的。
我所知道的是类加载的实例是加载到Method Area的,而实例化后得到的对象是放入堆中的。JVM的动态回收机制是否会对Method Area回收否?
加载更多回复(16)
2024年安卓最全Android View的绘制流程,面试
心得
体会500字
有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~偷偷说一句:群里
高手
如云,欢迎大家加群和大佬们一起交流讨论啊!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
C++学习
心得
感想
很多人把学习C++语言当成学习VC了,我曾经就走过这样的弯路。当学了很长时间的VC后还是得回过头来学习C++语言本身。 那么学习C++从何处入手了? C++语言相对于C语言来说引入了两个大的新东西,一个就是面向对象(具体来将就是类),另外就是模板技术(模板编程或者叫泛型编程是
进来
非常流行的技术,在C#中虽然还没有对泛型编程的支持,但是相信在将来也一定会加入这一功能),...
技术人生的职场众生相 - 十多年的经验与
心得
这篇文章是 我的软件开发生涯 (10年开发经验总结和爆栈人生) 的新篇,大家有兴趣的话可以先看看这篇。 另外,我还接受过代码时间的采访:爆栈之旅 - 从接触到成为经理,从中国到澳洲 - 我这10年来的开发历程 我是个码农,在职场干了多年,在超过10个公司服务过,遇到过各种怪现状,拍案惊奇葩,不吐不快,太想写篇文章吐槽一下。 这篇文章汇集了我10多年来的工作中遇到的各种经历,总结的
心得
,分别讨...
某某的 java
心得
想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们,帮助大家在技术的道路上少一点弯路。说得伟大一点是希望大家为软件学院争气,其实最主要的还是大家自身的进步提升??1. 关于动态加载机制??学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当然概
雷军2024年度演讲:人生不能后退!
人生有这样的朋友,真的足矣。
Java
51,396
社区成员
85,838
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章