title: 黑马JVM学习笔记二
date: 2020-01-13 1:00:00
tags:
- JVM
categories:
- JVM
- 黑马jvm
内存结构
内存结构总览图:
程序计数器
1.定义:Program Counter Register 程序计数器 (寄存器)
程序计数器是Java对物理硬件的一些屏蔽和抽象,物理上通过寄存器来实现,寄存器是整个cpu里读取最快的一个单元。
2.作用:记住下一条jvm指令的执行地址
3.特点
- 线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置
- 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢出现象)
虚拟机栈(Java Virtural Machine Stacks)
栈、栈帧以及代码演示
1.栈是一种数据结构,特点是先进后出。
2.虚拟机栈就是线程运行时需要的内存空间。一个线程需要一个对应的栈,多个线程就需要多个虚拟机栈。
3.一个栈又是由多个栈帧组成,一个栈帧就对应着Java中一个方法的调用,即栈帧就是每个方法运行时需要的内存。每个方法运行时需要的内存一般有参数,局部变量,返回地址,这些都需要占用内存,所以每个方法执行时,都要预先把这些内存分配好。
4.每个线程只能由一个活动栈帧,对应着当前正在执行的那个方法。(位于栈顶)
栈问题辨析
1.垃圾回收是否涉及栈内存
不涉及,垃圾回收只是回收堆内存中的无用对象,占内存不需要对它执行垃圾回收,随着方法的调用结束,栈内存就释放了。
2.栈内存分配越大越好么?
- 首先栈内存可以指定:-Xss size(如果不指定栈内存大小,不同系统会有一个不同的默认值)
- 其次由于电脑内存一定,假如有100Mb,如果给栈内存指定为2Mb,则最多只能存在50个线程,所以并不是越大越好,栈内存较大一般是可以进行较多次的方法递归调用,而不会增强线程效率,反而会使线程数量减少,一般使用默认大小。
3.方法内的局部变量是否线程安全
- 看一个变量是否线程安全,首先就是看这个变量对多个线程是共享的还是私有的,共享的变量需要考虑线程安全。
- 看到p11