zoukankan      html  css  js  c++  java
  • 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 对象作为这块内存的引用进行操作。

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

  • 相关阅读:
    java 小数点取2位并且四舍五入
    批处理(.bat脚本)基本命令语法
    vue-webpack项目本地开发环境设置代理解决跨域问题
    vue项目引入FastClick组件解决IOS系统下h5页面中的按钮点击延迟,连续点击无反应的问题
    用vue构建多页面应用
    单页面应用和多页面应用对比分析
    html5文件读取+按钮样式重置+文件内容预览
    FileReader读取文件详解
    vue的双向数据绑定实现原理
    译:9.使用Redis进行消息传递
  • 原文地址:https://www.cnblogs.com/huanglf714/p/11027175.html
Copyright © 2011-2022 走看看