码迷,mamicode.com
首页 > 其他好文 > 详细

JVM内存管理1

时间:2019-03-05 23:16:03      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:mem   str   自己   werror   功能   err   方法   rgs   index   

程序计数器

  作用:1 字节码解释器工作时通过修改计数器的值来选择下一条需要执行的字节码指令,因为虚拟机是通过多线程来切换并分配处理器执行时间的方式来执行的,因此 为了线程切换后能恢复到正确的位置,每一个线程需要有一个独立的程序计数器,各个计数器互不影响,在线程内独立存储。

 

虚拟机栈

  和程序计数器一样,虚拟机栈也是线程私有的,其生命周期与线程一样每个方法在执行的同时都会创建一个栈帧,栈帧用于存储 局部变量表,操作数栈,动态链接 方法出口等等。每个方法从开始到完结 就对应了栈帧在虚拟机栈的入栈与出栈过程。

  局部变量表所需要的内存空间在编译器完成分配,是完全确定的 ,运行时不会改变局部变量表的大小。

  虚拟机中的两种异常:StackOverFlowError和OutOfMemoryError。 

  StackOverFlowError:如果线程请求栈帧的深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常。

  OutOfMemoryError:  如果虚拟机栈客园扩展(大部分虚拟机都可以动态扩展),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

  2种异常的理解:StackOverFlowError 就是递归的太深了 比如 自己调用自己

public class StackOverflowTest {  

    public static void main(String[] args){  
        method();  
    }  
    private static void method() {  
        method();  
    }  
}  

  OutOfMemoryError:表示创建对象的速度快于JVM回收空间,就会发生这个异常,比如死循环创建对象

public class OutOfMemoryTest {  

    public static void main(String[] args){  
        List<Object> list = new ArrayList<Object>();  
        while(true){  
            int[] index = new int[20_0000_0000];  
            list.add(index);  
        }  
    }  
}  

 

本地方法栈

  本地方法栈和Java虚拟机栈实现的功能类似,只不过本地方法区是本地方法运行的内存模型,本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表等等。

JVM内存管理1

标签:mem   str   自己   werror   功能   err   方法   rgs   index   

原文地址:https://www.cnblogs.com/tjqBlog/p/10480320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!