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 对象作为这块内存的引用进行操作。

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

原文地址:https://www.cnblogs.com/huanglf714/p/11027175.html

时间: 2024-08-29 19:03:09

JVM系列一:虚拟机内存区域的相关文章

Java虚拟机内存区域详解

众所周知,Java程序运行于Java虚拟机(JVM)上,那么,JVM运行的时候内存是如何分配的呢?程序中各部分变量都存储在内存的哪个部分,又如何访问,下面,就让我来给大家讲解Java虚拟机内存区域. 为什么需要了解Java虚拟机内存区域 相对于C++程序员,因为虚拟机的自动内存管理机制的存在,Java程序员很多时候并不需要去担心内存的泄露和内存溢出的问题.但是正是因为把内存的控制权交给了JVM,一旦出现内存泄露和溢出的问题,如果不了解虚拟机怎么使用内存,就很难排查错误. 内存泄露:一些对象在使用

JVM学习系列(一) JAVA内存区域和内存溢出异常

JAVA内存区域介绍 程序计数器: 线程私有,很小的内存空间,可以看做是当前线程所执行的字节码的行号指示器: 每个线程都有一个独立的程序计数器,各个线程之间的计数器相互不影响,独立存储: 如果线程执行的是Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是一个Native方法,那么这个计数器的值则为undefined: 该内存区域不会发生任何的OutOfMemoryError的情况(JAVA虚拟机规范中未规范). goto 保留字(Java当前版本暂且不用,也不让别人用),

JVM性能优化系列-(1) Java内存区域

1. Java内存区域 1.1 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.主要包括:程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运 行时常量池).直接内存. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等

JVM解读:Java内存区域

JVM全称是java Virtual Machine(java虚拟机),JVM屏蔽了与各个计算机平台相关的软件和硬件差异. 在接下来的日子里,通过写博客的形式学习JVM,让自己更懂得Java! 本系列文章是对<深入分析javaweb技术内幕>和<深入理解java虚拟机>的总结,欢迎大家一起吐槽,一起进步. <JVM解读>第一篇:JVM体系结构 <JVM解读>第二篇:JVM类加载器ClassLoader 人人都知道的java的一大优点就是不需要程序员去显示的分

java虚拟机内存区域的划分以及作用详解

序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什么叫运行时数据区呢,看下图就知道了,今天的重点就围绕这张图讲. 1.程序计数器(寄存器) 当前线程所执行的字节码行号指示器 字节码解释器工作依赖计数器控制完成 通过执行线程行号记录,让线程轮流切换各条线程之间计数器互不影响 线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死 线程执行Ja

Java虚拟机内存区域堆(heap)的管理

在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域,所以单独提出一节进行分析. 先来解释一下对象存活?? 什么样的对象是已经死了的对象,须要垃圾回收器进行回收.这个概念至关重要.由于它影响到垃圾回收器对于哪一个对象进行回收.能够从GCRoot訪问到的对象是存活的对象,那么以外的对象就是已死的对象. GCRoot:包含四种 1)Java虚拟机栈中存放

JVM系列(一内存模型)

好久没有整理这方面的东西了.现在整理一下JVM相关的东西.这是第一篇,JVM内存模型. 进程&JVM 首先,何谓JVM?为什么要有JVM的存在? JVM就是java virtual machine的简称.当然了,除了java的VM以外还会有好多别的虚拟机.java的VM模型有好几个,其中最常见的应该是HotSpot VM. 假设jvm在一个32位的操作系统中运行.32位windows最大只支持4G内存,而进程只能最多2G内存:32位linux最大也只支持4G内存,但是进程最多可以有3G左右.画个

Java 虚拟机内存区域划分详解(1)

一.概述 对于 C 和 C++程序开发的开发人员来说,在内存管理领域,程序员对内存拥有绝对的使用权,但是也要主要到正确的使用和清理内存,这就要求程序员有较高的水平. 而对于 Java 程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/free 代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好.不过,也正是因为 Java 程序员把内存控制的权力交给了 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚

【深入理解JVM】:Java内存区域

JVM具有自动内存管理机制,Java不需要像c/c++一样,为每一个new操作写配对的delete/free代码,不容易出现内存泄露和溢出.JVM内存区域主要包括如下部分:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 程序计数器 程序计数器可以视为当前线程所执行的字节码行号指示器,如果当前执行的是Native方法,计数器的值为空(Undefined).在JVM的概念模型中,字节码解释器通过改变计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程回复等都依