什么是 JVM ?
定义:
Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)
好处:
一次编写,到处运行
jvm屏蔽字节码和底层操作系统之间的差异,对外提供一致运行环境
jvm解释执行二进制字节码,达到代码的平台无关性
自动内存管理,垃圾回收功能
目前许多语言都有
Java产生早,当时竞争对手是c/c++
与c/c++相比,他们没有垃圾回收机制,写好代码需要自己释放内存,编码不当容易造成内存泄露
Java垃圾回收减轻程序员负担,减少出错概率
数组下标越界检查
覆盖其他代码内存
Java采取抛异常
c没有越界检查,需要程序员编码时自己注意,
如果越界,可能覆盖其他代码内存
多态
多态
面相对象基石
提升可扩展性
jvm使用区方法表机制实现多态
比较: jvm jre jdk
基础类库
平时开发用到的所有的类:java.lang.*,集合类,线程类,日期类,io类等
jre
jvm是个运行环境,相当于空壳,只有与基础类库结合才构成完整运行环境
jdk
jre基础上添加 javac javap 内存监测工具
javap
是JDK自带的反汇编器,
可以查看java编译器为我们生成的字节码
通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作
c语言数组越界,覆盖其他代码内存个空间
#include <stdio.h>
int main()
{
int i = 0;
int arr[5] = { 0,1,2,3,4 };
for (i = 0; i <= 7; i++)
{
arr[i] = 0;
printf("Hello World\n");
}
return 0;
}
代码中局部变量数组arr只申请到5个单位的内存空间,但是for循环对数组arr的8个单位内存空间进行操作,此种情况就是访问内存越界。针对于访问内存越界会出现的情况以及底层原理进行分析。
编译后可能出现的问题
1.出现报错,内存访问越界;
2.死循环。
问题分析
在编译器上对数据进行监控的同时逐步执行代码。发现arr[7]与局部变量 i 的地址为同一地址。因此会出现变量 i 的值会被循环过程中越界访问的arr[7]的值所覆盖,arr[7]赋值为0后, i 的值也会被赋值为0,导致出现死循环的现象。
结论总结
1.i与arr是局部变量,局部变量是保存在栈区上的;
2.栈区的使用习惯是:先使用高位地址,再使用低位地址;
3.数组随着下标的增长,地址由低到高变化。
问题扩展
局部变量保存在栈区中,arr[5]与arr[6]是两个局部变量之间没有利用到的空间,不进行任何赋值操作的情况下存放的是随机值。
在不同的编译器中,两个变量之间的内存空间可能是一个,两个,或者是没有。本代码是在VS2019上进行编译的,本文中是两个内存空间。
如果for循环中改成对6个或者7个数组的单位内存空间进行赋值,但是并没有对变量i的值进行覆盖,也就是说访问越界但没有覆盖到其他变量的情况,代码会出现访问空间越界的报错而不是死循环。
常见jvm
软软的license是指软件许可证,是一种格式合同,由软件作者与用户签订,用以规定和限制软件用户使用软件(或其源代码)的权利,以及作者应尽的义务。软件版权属于知识产权的著作权范畴,具有知识产权的特征,即时间性,专有性和地域性。国家颁布有《计算机软件保护条例》,保护权益人的软件著作权。简单来说就是,license就是软件使用许可,一般都要买,不买就不能使用软件。
不同版本底层实现有差异