Java虚拟机的基本结构

Java虚拟机的基本结构

Paste_Image.png

类加载子系统

类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块被称为方法区的内存空间。除了类信息之外,方法区还可能存放运行时的常量池信息,包括字符串和数字常量。

Java堆

Java堆在虚拟机启动的时候建立,是Java程序最主要的内存工作区域。几乎所有的Java对象实例都存放在Java堆中。堆空间是一个程序的所有线程都共享的。 Java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显示地释放。 Java堆根据垃圾回收机制的不同有可能拥有不同结构的堆。常见的是Java堆分为新生代和老年代。根据对象的存活时间。

Java栈

1

Java栈是一块线程私有的内存空间,和线程执行密切相关。线程的执行主要是函数调用,函数调用的数据都是通过Java栈来传递。 Java栈主要保存的是栈帧(局部变量表,操作数栈。帧数据区),每一次函数调用,都会有一个对应的栈帧被压入栈,每一个函数调用结束,都会有一个栈帧被弹出栈。当前正在执行的函数所对应的帧就是当前的帧(位于栈顶),保存当前函数的局部变量,中间运算结果等数据。 对于Java函数的返回方式不管是正常的return返回还是异常抛出,栈帧都会被弹出。 栈空间不足时,函数调用无法自然地继续执行下去。当栈深度大于线程的最大栈深度时,系统抛出StackOverflowError栈溢出。虚拟机通过参数-Xss来指定线程最大栈空间,决定函数调用的最大深度。

2.局部变量表

局部变量表保存函数的参数和局部变量,只在当前函数调用有效,随着栈帧的销毁,局部变量表也会随之销毁。

3.操作数栈

用于保存计算过程的中间结果,同时作为计算过程中的变量临时储存区。

4.帧数据区

在帧数据区保存着访问常量池的信息,方便程序访问程序常量池。

4.栈上分配

栈上分配是Java虚拟机提供的一项优化技术,对于线程私有的对象,其他线程不能访问的对象,可以将它们打散分配在栈上,而不是分配在堆上,分配在栈上的好处是可以在函数调用结束之后自行销毁,不需要垃圾回收器的介入。提高系统性能。 技术基础是逃逸分析,判断对象的作用域是否会逃逸出函数体。

方法区

java方法区和Java堆一样,是所有线程共享的内存区域,用于保存系统的类信息,类的字段,方法,常量池。方法区的大小决定系统可以保存多少个类,类太多会导致方法区溢出。

Java NIO库

允许Java程序使用直接内存,直接内存是栈外的,直接向系统申请的内存空间。通常,访问直接内存会快于Java堆。考虑系统性能,对于读写频繁的场合会考虑直接使用直接内存。直接内存的大小会直接受限于Xmx指定的最大堆大小,系统内存是有限的,受限于操作系统能给出的最大内存。

垃圾回收器

在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术记录

通讯协议序列化解读(一) Protobuf详解教程

前言:说到JSON可能大家很熟悉,是目前应用最广泛的一种序列化格式,它使用起来简单方便,而且拥有超高的可读性。但是在越来越多的应用场景里,JSON冗长的缺点导致...

1201
来自专栏大闲人柴毛毛

Java异常体系中的秘密

相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很...

36910
来自专栏LuckQI

Java核心技术讲解学习二

1532
来自专栏Java3y

【3y】从零单排学Redis【青铜】

最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术。面试也是非常高频的一个知识点,之前一直都是处于了解阶段。秋招过后这段时间是没...

1234
来自专栏hbbliyong

C++为啥要使用new

1.为什么要有new? 为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如: // Cocos2d-x3.x的Value类,...

43512
来自专栏恰童鞋骚年

黑马公开课——运行原理与GC学习笔记

.NET Framework的组成: (1)基础类库(BCL):使用线程的类来完成编程,对于不存在的类,就自己编写; (2)编译工具:将源文件,编译成“程序集”...

1034
来自专栏技术记录

通讯协议序列化解读(一) Protobuf详解教程

前言:说到JSON可能大家很熟悉,是目前应用最广泛的一种序列化格式,它使用起来简单方便,而且拥有超高的可读性。但是在越来越多的应用场景里,JSON冗长的缺点导致...

1014
来自专栏算法channel

面试被问到动态内存分配时需要注意哪些坑,该怎么回答?

面试时,面试官问我们Java,Python这种语言那是必须要准确回答的,很多系统如果对性能要求高的话,底层一般会用到C/C++语言,因此被问到底层语言的相关知识...

1453
来自专栏技术博客

C#简单的面试题目(五)

61.数组有没有length()这个方法? String有没有length()这个方法?

1143
来自专栏何俊林

面试常问点:深入剖析JVM的那些事

Class文件结构 -> JVM内存模型 -> 类加载器 -> 类加载过程 -> 类的引用方式 -> 内存分配策略 -> GC -> 对象的引用类型 -> 类卸...

1042

扫码关注云+社区

领取腾讯云代金券