美文网首页
Java运行时数据区

Java运行时数据区

作者: lenny611 | 来源:发表于2019-08-10 20:04 被阅读0次

    本文根据Java8攥写。

    Java运行时数据区
    程序计数器(PC):
    内存很小,存储的是下一条需要执行的(JVM汇编)字节码指令的地址。此区域是唯一一个在java虚拟机中无任何OOM情况的区域。
    Java虚拟机栈:
    通常的栈指的就是java虚拟机栈,存储编译期可知的基本数据类型,局部变量,对象引用等。当请求栈的深度大于虚拟机允许的最大深度时会抛出​StackOverflowError,但这个栈深度并不是定值。而虚拟机拓展时申请不到足够的内存空间就会抛出OOM异常。
    本地方法栈:
    与Java虚拟机栈类型,但服务对象不同,本地方法栈主要为native修饰的方法。
    元空间:
    元空间区取代了1.7版本及以前的永久代。元数据区和永久代本质上都是方法区的实现。存放虚拟机加载的类信息,静态变量,常量等数据。而为什么使用元空间取代了永久代,可以参考https://www.jianshu.com/p/88be0ad9f06d
    堆:
    java虚拟机所管理的内存中最大的一块,也是垃圾收集器管理的主要区域,主要存储实例变量。​在Java堆中分为新生代和老年代,根据年代特点而采用最适当的收集算法,新生代一般占堆的1/3,老年代2/3。而新生代又细分为Eden区,survivor to,survivor from,这三者默认比例为8:1:1。新生代一般采用复制算法来回收,而老年代一般是由标记清除算法和标记整理算法的混合实现。
    直接内存:
    直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据(实现了零拷贝)。

    相关文章

      网友评论

          本文标题:Java运行时数据区

          本文链接:https://www.haomeiwen.com/subject/uqhdjctx.html