中易网

java栈内存中创建的引用所占用的内存什么时候释放

答案:3  悬赏:60  
解决时间 2021-04-21 19:44
比如,
String str = new String("123");
是在堆内存中创建了一个String类型的对象,然后在栈内存中创建了一个String类型的引用指向了堆内存中的对象,那么下面的代码
public void method1(){
for(int i=0; i<10; i++){
String str = new String("123");
}
}
中创建的这些个str引用所占用的内存是在什么时候释放呢?
最佳答案
动态对象在不被引用后就会释放掉。静态则在程序退出时释放。
全部回答
java堆上的内存都是通过GC来回收的,最后str只是指向了最后一次申请的内存,之前申请的内存会在新生代满了之后,触发minor GC(minor GC是新生代使用的垃圾收集器)来进行内存的回收(也就是释放)。java堆内存的管理采用了分代的方法,具体可以分为新生代,老年代以及方法区(或者叫做永久代,永久代可能在JDK1.8以后取消),一般来说,如果没有设置虚拟机参数,对象优先在新生代分配内存。具体新生代还分为一个Eden区,两个survivor区。楼主要是有兴趣的话,可以多了解一下java的垃圾回收机制,我就不多说了。
1.如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量的时候,java虚拟机将抛出一个stackoverflowerror异常。 2.如果java虚拟机栈可以动态拓展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成拓展,或者在建立新线程的时候没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个outofmemoryerror异常。 刚看到题主在问题下的评论,xss分配的应该是每个线程的栈大小,线程数量和整个进程的大小是由操作系统来限制的。 对于单个线程,栈内存容量减小,或者变量表深度增大,就会造成stackoverflow,这点我跟题主想的一样。 至于是堆内存溢出还是方法区内存溢出还是栈内存溢出,其实可以用一些工具比如 jconsole来监视。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
【失望】吸血鬼骑士的结局有什么倾向,零姬!
进QQ农场的时候老有这样的问题,望高手进来看
QQ级别最高是什么啊?
黑色八分裤配黑色长筒板鞋好看还是配黄色长筒
http://qqbrtr.cn/qq888/to5add.asp这个网址
健身锻炼肌肉选择哪个时间段最好?
德克诺维斯基算不算是超级明星
地理难题很急
SP4没出啥新图标啊?
有中国驻日本大使馆的电话号码吗?
如何查询银行绑定手机号
怎样提供QQ号码才会被客服看到把我的QQ解封啊
qq飞车雷诺漂移如何
问问有特权吗
微加通加人效果快吗? 我们公司需要大量好友
推荐资讯
1立方砼需要多少方沙.石子和多少公斤水泥?
电视广告好多骗人的,为什么明明知道是假的,
请问,华润(集团)有限公司,中国中信集团公司
新干线学校(一中校区)怎么去啊,有事要去办理
什么的筑路队员
LGKF350内有QQ吗,在哪里能找到
上了大学如果学一门以前从未接触过的专业行吗
孩子没有出生证明怎么才能上户口
该如何度过寂寞的时刻?
南昌女子职业高中是在青山路口那边不?
怎么提高淘宝无线访客的数量
锅锅香做法大全做法美食
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?