JVM的基本结构和JVM的内存结构
这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型。
1、JVM的基本结构
================
JVM启动后,对操作系统来说,JVM是一个的进程,这个进程的基本结构如上图所示。它包括:类加载器子系统、运行时数据区、执行引擎和本地方法接口。
运行时数据区是JVM从操作系统申请来的堆空间和操作系统给JVM分配的栈空间的总称。JVM为了运行Java程序,又进一步对运行时数据区进行了划分,划分为Java方法区、Java堆、Java栈、PC寄存器、本地方法栈等,这里JVM从操作系统申请来的堆空间被划分为方法区和Java堆,操作系统给JVM分配的栈空间构成Java栈。
2、从操作系统角度看JVM的内存结构
==============================
从Linux操作系统角度看,JVM是一个普通的应用程序进程,那么JVM具有一般操作系统进程的特点,一般的进程的内存结构和JVM进程的内存结构是类似的,它们的内存结构类比参见下图。
Linux把一个程序在内存中所占的空间分为:方法区、数据区、堆区、栈区,对应地,JVM在内存中也有JVM方法区、JVM数据区、堆区和栈区。
代码区 中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。
数据区 中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。
堆 是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。
栈区 用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。
由图中可以知道,JVM堆被JVM进一步分为:运行时数据区中Java的方法区和Java堆(图中显示的是:永久、新生、老年,这是分代垃圾回收时的术语,实际上永久代和Java方法区对应,新生代和老年代和Java堆对应),也就说Java方法区和Java堆其实都是JVM堆的一部分。JVM的栈区构成了Java的线程栈。
Java方法区,在分代垃圾回收时也被称为永久区,包括了已被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据,它实际上构成了Java程序的方法区和数据区。垃圾回收器也会对这部分内存进行回收,比如常量池的清理和类的卸载。
(这里要注意区分JVM堆和Java堆,JVM方法区和Java方法区)
Java堆包括新生代和老年代,新生代包括Edge区两个Survivor区(from Survivor 和 To Survivor)。
JVM的垃圾回收器主要工作是回收Java堆中的垃圾内存,具体来说就是JVM堆中的新生代和老年代所占的内存。垃圾回收的内容主要关注这两块区域。运行Java程序之前,可以通过Xms(Java堆初始大小)和Xmx(Java堆最大值)来调整堆内存。
关于JVM的垃圾回收器的工作过程,和它回收垃圾内存时所遵循的策略也即垃圾回收算法,可以单独写一篇文章总结,这里不再写。
3、JVM的类加载子系统
===================
JVM的类加载子系统主要用来加载和卸载Java类,其工作过程对应于一个类在内存中的生命周期,一般可以分为:加载、连接(验证、准备、解析)、初始化、使用类和卸载类。
这个子系统的每一个阶段的工作内容可以单独总结为一篇文章,比如类的加载和类加载器,目前不在这里多写。
4、执行引擎
=============
执行引擎是JVM执行Java字节码的核心,执行方式主要分为:解释执行、编译执行、自适应优化执行、硬件芯片执行等方式。关于执行引擎也可以单独总结。
JVM的基本结构和JVM的内存结构的更多相关文章
- Jvm原理剖析与调优之内存结构
一些不得不说的概念 JVM JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- 深入探究JVM之内存结构及字符串常量池
前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...
- jvm系列(二):JVM内存结构
JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...
- JVM之内存结构
JVM是按照运行时数据的存储结构来划分内存结构的.JVM在运行Java程序时,将他们划分成不同格式的数据,分别存储在不同的区域,这些数据就是运行时数据.运行时数据区域包括堆,方法区,运行时常量池,程序 ...
- 浅析JVM内存结构和6大区域(转)举例非常好
内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
- JVM内存结构、垃圾回收那点事
翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了 ...
- JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
- Java中的OutOfMemoryError的各种情况及解决和JVM内存结构
在JVM中内存一共有3种:Heap(堆内存),Non-Heap(非堆内存) [3]和Native(本地内存). [1] 堆内存是运行时分配所有类实例和数组的一块内存区域.非堆内存包含方法区和JVM内部 ...
- JVM内存结构之三--持久代
本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了. 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令. ...
随机推荐
- git 初始用法
Git global setup git config --global user.name "xiaoming" git config --global user.email & ...
- 五种IO模型
参考文档 https://www.jianshu.com/p/486b0965c296 概念说明 用户空间和内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空 ...
- 算法题----任意进制转换(C++)
#include <bits/stdc++.h> using namespace std; int toInt(char c) { // char c = s; if(c >= '0 ...
- 系统性能工具篇(sar)
转自:系统性能工具篇(sar) 1. 介绍 内容很多 是sysstat软件包的一部分 自动运行:/etc/crontab/sysstat $ cat /etc/cron.d/sysstat # The ...
- [Web] 取消Promise
转载自 为Promise插上可取消的翅膀 const makeCancelable = (promise) => { let hasCanceled_ = false; const wrappe ...
- ul的li元素水平并居中的css
ul{ text-align:center; } li{ display:inline } 这样li元素不需要float且可以居中 比较好样式如下 ul li { // float: left; pa ...
- Curator框架实现ZooKeeper分布式锁
排他锁(X) 这里主要讲讲分布式锁中的排他锁.排他锁(Exclusive Locks,简称X锁),又称为写锁或独占锁,是一种基本的锁类型.如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只 ...
- 图形化SQL JOIN
- Failure [DELETE_FAILED_INTERNAL_ERROR]之后rm apk卸载
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/heng615975867/arti ...
- 【JavaScript】JavaScript中的ActiveXObject对象
JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用. 使用方法: newObj = new ActiveXObject( servername.t ...