JVM

JDK1.6到JDK1.7内存划分是将方法区中增加了运行时常量池,JDK1.7到JDK1.8是将方法区放在了本地内存中的元数据区.

线程私有内存空间

  程序计数器:一块较小的内存空间,可以看做是记录线程运行到的位置,也就是记录线程运行在哪一行.

  jvm虚拟机栈:每一个方法在执行的时候都需要创建一个栈帧,用于存储局部变量,操作数栈,动态链接,方法出口等信息.每个方法调用执行完之后都会消除掉这个栈帧.

    此区域一共可能出现两种异常

      1.当线程请求的栈深度大于虚拟机栈的时候会出现异常(StackOverFlowError)

      2.虚拟机在动态扩展时无法申请到内存的时候会出现00M异常(OutOfMemoryError) 

  本地方法栈:这个其实和jvm虚拟机栈的作用都是完全相同的,他两去区别无非就是本地方法栈为jvm虚拟机栈使用的Nation方法服务.

线程共享区域:

  java堆:所有的对象都缝补在堆内存中的.如果堆内存没有足够的内存空间也会抛出OOM异常.

  方法区:用于存储一杯虚拟机加载的类信息,常量,静态常量,及时编译器编译的代码.

  运行时常量池:编译期和运行时产生的常量被放在了运行时常量池中.

        这里的常量包括:包装类基本数据类型,String.

         类加载时,会查询字符串常量池,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。
  直接内存:直接内存的发小不会受到java堆内存的影响,但是也是会受到本机内存大小的影响.
常量池:
  Class文件常量池:
        Class文件除了类的版本号,字段,方法,接口等描述信息.还有一项是常量池,你面保存的是编译时期的各种字面量和引用符号.这部分内容将在类加载的时候进入方法区的运行时常量池.
  运行时常量池:  
        运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。
  字符长常量池:
        保存的是字符串对象或者字符创引用.

你可能感兴趣的:(JVM)