title: 黑马JVM学习笔记二
date: 2020-01-13 1:00:00
tags:

  • JVM

categories:

  • JVM
  • 黑马jvm

内存结构

内存结构总览图:
黑马JVM学习笔记二

程序计数器

1.定义:Program Counter Register 程序计数器 (寄存器)

程序计数器是Java对物理硬件的一些屏蔽和抽象,物理上通过寄存器来实现,寄存器是整个cpu里读取最快的一个单元。

2.作用:记住下一条jvm指令的执行地址
黑马JVM学习笔记二
3.特点

  • 线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置
  • 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢出现象)

虚拟机栈(Java Virtural Machine Stacks)

栈、栈帧以及代码演示

1.栈是一种数据结构,特点是先进后出。
2.虚拟机栈就是线程运行时需要的内存空间。一个线程需要一个对应的栈,多个线程就需要多个虚拟机栈。
3.一个栈又是由多个栈帧组成,一个栈帧就对应着Java中一个方法的调用,即栈帧就是每个方法运行时需要的内存。每个方法运行时需要的内存一般有参数,局部变量,返回地址,这些都需要占用内存,所以每个方法执行时,都要预先把这些内存分配好。
4.每个线程只能由一个活动栈帧,对应着当前正在执行的那个方法。(位于栈顶)

黑马JVM学习笔记二
黑马JVM学习笔记二

栈问题辨析

1.垃圾回收是否涉及栈内存

不涉及,垃圾回收只是回收堆内存中的无用对象,占内存不需要对它执行垃圾回收,随着方法的调用结束,栈内存就释放了。

2.栈内存分配越大越好么?

  • 首先栈内存可以指定:-Xss size(如果不指定栈内存大小,不同系统会有一个不同的默认值)
  • 其次由于电脑内存一定,假如有100Mb,如果给栈内存指定为2Mb,则最多只能存在50个线程,所以并不是越大越好,栈内存较大一般是可以进行较多次的方法递归调用,而不会增强线程效率,反而会使线程数量减少,一般使用默认大小。

3.方法内的局部变量是否线程安全

  • 看一个变量是否线程安全,首先就是看这个变量对多个线程是共享的还是私有的,共享的变量需要考虑线程安全。
    - 看到p11

本地方法栈

方法区

相关文章:

  • 2021-11-26
  • 2021-07-14
  • 2021-09-05
  • 2021-12-21
  • 2021-11-27
  • 2021-11-26
  • 2021-04-17
  • 2021-09-04
猜你喜欢
  • 2021-04-26
  • 2021-12-27
  • 2021-08-19
  • 2021-11-15
  • 2021-08-02
  • 2021-12-11
  • 2021-07-30
相关资源
相似解决方案