专栏首页互联网大杂烩Java虚拟机的基本结构

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 条评论
登录 后参与评论

相关文章

  • Java内存溢出

    Java的NIO支持直接内存使用,从堆外获得内存空间,由于直接内存没有被Java虚拟机完全托管,若使用不当,容易触发直接内存溢出。

    用户2909867
  • EOS

    EOS是一个区块链底层公链系统,目的是解决现有的区块链应用性能低、安全性差、开发难度高以及过度依赖手续费的问题。当EOS完成系统目标之后,任何团队都可以在EOS...

    用户2909867
  • TCP/IP协议

    TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使...

    用户2909867
  • Java基础知识点面试手册(线程+JDK8)

    在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。

    Java3y
  • Java架构师学习路线图

    学习一下你的集成开发环境提供的调试工具,加一些断点试试。

    Java后端工程师
  • 线上应用故障排查之二:高内存占用

    前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。

    爱撸猫的杰
  • Java学习路线图

    其实Java不算完全面向对象的语言。Java更偏实用性,很多控制流(if语句、while循环、for循环等)来自面向过程的语言;基本数据类型(int, char...

    Java团长
  • Java大数据开发怎么学习比较好?

    另外,你也要考虑时间、精力、金钱等各方面的投入情况。学习和掌握大数据相关技术也非一朝一夕之事,不可能一蹴而就,一般的培训课程只能达到入门级别的介绍和讲解,真正要...

    加米谷大数据
  • Jersey 2.x 分支 Java SE 兼容性

    https://www.cwiki.us/display/JERSEYZH/Java+SE+Compatibility

    HoneyMoose
  • 字符串例题

     给定一个字符串s,请计算输出含有连续两个s作为子串的最短字符串。注意两个s可能有重叠部分。例如,"ababa"含有两个“aba". 输入描述:  输入包括一个...

    mathor

扫码关注云+社区

领取腾讯云代金券