jvm引言

什么是 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就是软件使用许可,一般都要买,不买就不能使用软件。

不同版本底层实现有差异

学习路线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java邦邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值