比如,
String str = new String("123");
是在堆内存中创建了一个String类型的对象,然后在栈内存中创建了一个String类型的引用指向了堆内存中的对象,那么下面的代码
public void method1(){
for(int i=0; i<10; i++){
String str = new String("123");
}
}
中创建的这些个str引用所占用的内存是在什么时候释放呢?
java栈内存中创建的引用所占用的内存什么时候释放
答案:3 悬赏:60
解决时间 2021-04-21 19:44
- 提问者网友:浪子生来ˇ性放荡²↘
- 2021-04-20 19:41
最佳答案
- 二级知识专家网友:夢想黑洞
- 2021-04-20 20:49
动态对象在不被引用后就会释放掉。静态则在程序退出时释放。
全部回答
- 1楼网友:何以畏孤独
- 2021-04-20 23:20
java堆上的内存都是通过GC来回收的,最后str只是指向了最后一次申请的内存,之前申请的内存会在新生代满了之后,触发minor GC(minor GC是新生代使用的垃圾收集器)来进行内存的回收(也就是释放)。java堆内存的管理采用了分代的方法,具体可以分为新生代,老年代以及方法区(或者叫做永久代,永久代可能在JDK1.8以后取消),一般来说,如果没有设置虚拟机参数,对象优先在新生代分配内存。具体新生代还分为一个Eden区,两个survivor区。楼主要是有兴趣的话,可以多了解一下java的垃圾回收机制,我就不多说了。
- 2楼网友:糜废丧逼
- 2021-04-20 22:00
1.如果线程请求分配的栈容量超过java虚拟机栈允许的最大容量的时候,java虚拟机将抛出一个stackoverflowerror异常。
2.如果java虚拟机栈可以动态拓展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成拓展,或者在建立新线程的时候没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个outofmemoryerror异常。
刚看到题主在问题下的评论,xss分配的应该是每个线程的栈大小,线程数量和整个进程的大小是由操作系统来限制的。
对于单个线程,栈内存容量减小,或者变量表深度增大,就会造成stackoverflow,这点我跟题主想的一样。
至于是堆内存溢出还是方法区内存溢出还是栈内存溢出,其实可以用一些工具比如
jconsole来监视。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯