• JVM系列一:虚拟机内存区域


    虚拟机栈

    1、虚拟机栈维护一个线程中所有方法的栈帧,每个栈帧中保存着这个方法中用到的局部变量表,操作数栈,常量引用

    2、可以用-Xss来设置每个线程中虚拟机栈的大小,在jdk1.4之前默认虚拟机栈大小是256K,在jdk1.5+默认虚拟机栈大小是1M

    java -Xss2M HackTheJava

    3、该区域可能抛出的异常

    • 当线程请求的栈深度超过最大限制后,或抛出StackOverflowError
    • 当栈进行动态扩展无法申请到内存后,会抛出OutOfMemoryError

    本地方法栈

    本地方法栈和虚拟机栈类似,区别在于这里栈帧对应的是本地方法

    本地方法一般是用其他语言编写的(C,C++或者汇编)

    程序计数器

    指示线程的行数计数器

    1、线程中所有的实例对象都被分配在这里,虚拟机的垃圾回收主要也是回收这块内存区域,所以这里也被称为GC堆

    java的垃圾回收一般都是按照分代收集算法,堆中又划分有新生代和老年代

    2、堆中的内存可以不是连续的,可以动态扩展内存,当扩展不到的时候会抛出OutOfMemeoryError

    3、可以用-Xms和-Xmx来设置堆的大小,前一个参数设置初始大小,后一个参数设置最大大小

    java -Xms1M -Xmx2M HackTheJava

    方法区

    1、方法区用来保存加载的类信息,静态变量,常量,即时编译器编译后的代码等信息

    2、这块区域和堆一样不需要连续的内存,可以动态扩展内存,当扩展不到的时候会抛出OutOfMemeoryError

    3、对这块区域的回收主要是对常量池的回收和类的卸载,不过一般很难实现,这块区域又被称为“永久代”

    4、jdk1.8之后移除永久代,而将方法区移到元空间,这是虚拟机外部的内存空间

    4、方法区是一个java虚拟机规范,其实现形式有元空间和永久代,jdk1.8之后,原来永久代的数据被分到元空间和堆中,类的信息分到元空间中,静态变量和常量分到堆中

     直接内存

    在jdk1.4的时候引入NIO类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。

    这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。

  • 相关阅读:
    ByteArrayOutputStream的用法
    Oracle字符函数(转换大小写,替换等)
    Linux 结束占用端口的程序
    堆是先进先出,栈是先进后出
    帮小黎解决问题C++巩固获得数字每个位置上的数
    负数的二进制表示方法
    为什么1Byte=8bit
    黎活明给程序员的忠告
    寻找最好的编程语言
    U盘启动时无USB-HDD选项的解决方案
  • 原文地址:https://www.cnblogs.com/huanglf714/p/11027175.html
Copyright © 2020-2023  润新知