JVM白小白——内存结构(二)

冷不防 2023-03-14 10:50 40阅读 0赞

目录

一、JVM是啥?我为什么要学JVM。

二、宏观导图:

三、JVM 运行时内存的基本结构:

四、运行时数据区:

1、堆

2、方法区

3、虚拟机栈

4、本地方法栈


一、JVM是啥?我为什么要学JVM。

在写代码中,写着写着就会有一种错误,叫做堆栈溢出。这是个啥?

20200517172350434.jpg

C++编程语言,程序员在需要对创建的每一个对象负责到底,从它的创建new,引用,到最后的销毁delete都需要负责到底。在java中,把这些对对象的处理交给了JVM。只要有JVM就不需要担心怎么给对象分配合适的地方存储,对象什么时候被释放,占用的内存空间什么时候回收。JVM会有内存分配策略,垃圾回收策略,来针对性解决问题。

面对内存溢出这样的问题,也会有对应的内存调优方案,通过图形化或命令行工具可以对内存分配使用进行监控查看。如下图JVM基础部分的三大内容。

通过JVM可以更好地理解代码的运行逻辑内存分配,写出更优秀的代码。

二、宏观导图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3htbDE5OTY_size_16_color_FFFFFF_t_70

三、JVM 运行时内存的基本结构:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3htbDE5OTY_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3htbDE5OTY_size_16_color_FFFFFF_t_70 2

对每一部分的简单认识:

四、运行时数据区:

1、堆

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3htbDE5OTY_size_16_color_FFFFFF_t_70 3

new出来的对象会放入堆中,堆存放这些对象也有它的规则。就像我们大批量的插入数据,为了保证数据的完整性,安全性啥的,都有个缓冲区,它可以很大一次性存放很多,之后再根据存入数据的特殊属性,把他它们分散到不同的地方。你看多了就会发现,计算机存取数据好像都是这一个套路。

其实这也就是内存的分配策略,分带策略

  • 优先分配到eden区
  • 大对象,直接进入到老年代
  • 长期存活的对象分配到老年代

栗子:

  1. public class TestJVM {
  2. public static void main(String[] args) {
  3. byte[] b1 = new byte[4*1024*1024];
  4. }
  5. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3htbDE5OTY_size_16_color_FFFFFF_t_70 4

2、方法区

不同的JDK版本发现,对方法区和堆这两个地方存放数据有些许不同。这里这个方法区既然是线程共享区,就一定是存公共的经常使用的资源,比如静态变量,常量,编译后的代码等数据。它和堆都是共享区,都可以被垃圾回收。

3、虚拟机栈

format_png

是线程私有区,每一个线程会有一个单独的栈,每一个栈的基本单位是栈帧,每一个栈帧中有关于这个线程成当前方法的信息:比如该方法在运行时需要的常量池指针,这个方法的局部变量,方法返回的地址。

format_png 1

可以通过栈找到堆中对应对象,有如图中的两种方式:一种是句柄访问对象,一种是直接指针的方式。

4、本地方法栈

本地方法栈和虚拟机栈功能类似。不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。

暂时理解到这里,还会不断更新,欢迎交流学习~

发表评论

表情:
评论列表 (有 0 条评论,40人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Linux(

    Linux(小白) 昨天女朋友说要玩玩我电脑上装的看着linux系统(她没接触过),看着全新的页面一脸懵。我是谁?我在哪?想必小白都遇到过这种困惑,看着全新的界面不知从何

    相关 歌词

      啦---- 断桥旁边种着葡萄 啦---- 葡萄夹着酸酸味道 啦---- 味道记着那时我们年少 啦---- 小白说陪我陪到老 琴棋和书画一旁靠