Java内存区域(转载)

Java内存区域包括堆、方法区、程序计数器、Java虚拟机栈、本地方法栈。

堆是Java虚拟机管理的内存中最大的一块区域,它被所有线程共享,在虚拟机启动时自动创建。所有的对象实例以及数组都在堆上进行分配。Java堆可以是可扩展的,也可以是不可扩展的。当前主流的Java虚拟机都是按照可以扩展来实现的,可以通过jvm参数-Xmx(最大堆内存)与Xms(初始化堆内存)来设定,如果两个设置一样大小,则不可扩展,如果初始化堆比最大堆小,则可以扩展。如果可以扩展,但是没有足够堆内存分配给实例时,将无法再扩展,并且Java虚拟机将抛出 OutOfMemoryError异常

方法区

方法区内存被所有线程共享,用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
JDK1.7的HotSpot虚拟机已经把原本放在永久带的字符串常量池、静态变量等移除;到JDK1.8已经完全弃用了永久代的概念,改用元空间(Metaspace)来代替。

运行时常量池

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的常量运行池中。运行时常量池会受到方法区内存的限制,当无法申请到内存时将抛出OutOfMemoryError异常。

程序计数器

各线程私有,是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖程序计数器来完成。

Java虚拟机栈

各线程私有。

本地方法栈

本地方法栈是为虚拟机使用到的本地方法服务,即native方法,各线程私有。在栈的深度溢出或者栈扩展失败时分别抛出StackOverflowError异常与OutOfMemoryError异常。

直接内存

直接内存并不是Java虚拟机的内存的一部分,而是直接使用native方法直接分配堆外内存,内存大小受到服务器物理内存限制。如NIO就是基于直接内存的实现。可以通过以下参数调整 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m,具体参考地址:https://www.jianshu.com/p/b448c21d2e71

posted @ 2020-08-27 09:17  甜呀  阅读(77)  评论(0编辑  收藏  举报