目录
1.程序计数器(Program Counter Register)
2.Java虚拟机栈(Java Virtual Machine Stacks)
一、前言
什么是JVM?
-
定义:Java程序得运行环境(二进制字节码运行环境)
-
优点:
- 一次编写,到处运行;
- 自动内存管理,垃圾回收功能;
- 数组下标越界检查;
- 多态。
-
比较:JVM屏蔽Java代码与底层操作系统之间得差异
二、常见的JVM
三、JVM内存结构
- 类从Java源代码编译为Java二进制字节码;
- 然后通过类加载器(ClassLoader)才能被加载到JVM里运行,类放在方法区,类创建的实例对象放在堆里,对象调用方法时会用到虚拟机栈、程序计数器和本地方法栈;
- 方法执行时每行代码是由执行引擎中的解释器逐行进行执行,热点代码被即时编译器编译(优化后的执行),垃圾回收会对堆里不再引用的对象进行回收;
- Java代码不方便实现的功能必须调用底层操作系统的功能,所以需要借用本地方法接口类调用操作系统提供的功能
1.程序计数器(Program Counter Register)
1.1作用
记住下一条jvm指令的执行地址
1.2特点
- 是线程私有的
- 不会存在内存溢出
2.Java虚拟机栈(Java Virtual Machine Stacks)
2.1定义
栈——线程运行需要的内存空间
栈帧——每个方法运行时需要的内存
- 一个栈由多个栈帧组成
- 一个栈帧对应着一次方法的调用
- 每个线程只能有一个活动栈帧,对应着正在执行的那个方法
2.2问题辨析
1).垃圾回收是否涉及栈内存?
不涉及。 栈内存是一次次方法调用产生的栈帧内存,栈帧内存在每次方法调用结束后都会被弹出栈,自动的会被回收掉。
2).栈内存分配越大越好么?
栈内存越大,线程数越少
3).方法内的局部变量是否线程安全?
首先看变量是共享的还是私有的,共享的需考虑线程安全。其次是局部变量有没有逃离方法的作用访问,没有逃离方法作用访问,则是安全的;如果是局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全。
2.3栈内存溢出
- 栈帧过多导致内存溢出
- 栈帧过大导致栈内存溢出
- 设置栈内存大小:-Xss