Java虚拟机学习总结一

  Java运行包括4个方面,Java代码(.java)、Java编译文件(.class),Java虚拟机,Java应用程序接口。Java代码通过编译器编译成为类文件,然后被装载到字节码内存中,通过类加载放入虚拟机中,最后通过操作系统和适配器实现,而JVM则处于核心地位。

[b][size=large]Java虚拟机[/size][/b]
  Java虚拟机是java基础部分,Java语言具有跨平台的特性,这也是由JVM来实现的。更准确地说,是Sun利用JVM在不同平台上的实现帮我们把平台相关性的问题给解决了。Java语言支持通过JNI(Java Native Interface)来实现本地方法的调用,但是需要注意到,如果你在Java程序用调用了本地方法,那么你的程序就很可能不再具有跨平台性,即本地方法会破坏平台无关性。JVM包括类加载子系统、运行数据区、执行引擎和本地方法接口。
  (生命周期总结:当一个java程序启动时,JVM就产生一个实例;程序结束是,实例也就消失了。Java虚拟机通常开始与一个main方法,这个方法是public static void修饰,JVM要调用必须是public,并且不通过对象调用,所以是static,而且由于JVM已经是底层,不会有任何返回,返回类型就成了void。)

[img]http://dl2.iteye.com/upload/attachment/0118/5836/a81842b0-52c9-3b2f-87f5-72eb47b5a807.png[/img]

[b][size=large]运行时数据区[/size][/b]
  即内存空间,通常我们配置-Xms、-Xmx信息都是设置的内存,Xms表示初始内存,Xmx表示最大内存,Xmn表示设置年轻代内存等等。内存空间主要由Java堆heap、方法区method area、本地方法栈、程序计数器、Java栈组成。其中Java堆、方法取每个线程公有,而本地方法栈、程序计数器、Java栈是线程私有。

  [b]程序计数器[/b]
  一块较小的内存空间,是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过线程轮流切换执行,一个确定时刻,一个处理器确切说是一个内核,只会执行一条线程的指令,为了线程切换能够恢复正确位置,所以需要有一个独立的程序计数器。

  [b]Java虚拟机栈[/b]
  同样为线程私有,就是java方法执行的内存模型,每个方法执行时都会同时创建一个栈帧,用户存储局部变量表、操作栈、动态链接、方法出口信息。每一个方法被调用直至完成过程,就是入栈到出栈的过程。
  局部变量表存放了各种基本数据类型,对象引用类型(一个指向对象起始地址的引用指针,或者一个代表对象相关的位置),和returnAddress类型(指向一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,并且空间已经固定,不会改变。
  (后期学习:查看java字节码,使用 javap -verbose class文件;java -verbose文件名称 注此处没得后缀 是查看加载了哪些jar包和文件;javac -verbose java文件 是看虚拟器加载类哪些东西)

  [b]本地方法栈[/b]
  本地方法栈与Java栈基本一样,只不过Java虚拟机栈是处理java方法(字节码)服务,而本地方法栈是为虚拟机使用Native方法服务。

  [b]Java堆 Heap[/b]
  Java堆是虚拟机内存中最大的一块,Java对是被所有线程共享的一块内存区,用来存放对象实例。Java堆也是垃圾收集器管理的主要区域,由于现在垃圾收集器基本都是采用的分代收集算法,所以Java堆基本可以分为新生代、老年代和持久代,新生代再分为Eden空间、From survivor空间和To survivor空间。
  新生代:用于存放新生的对象,对象在分配时首先分配到Eden区,当Eden区没有足够空间时,就会进行一次minor GC。通过-Xmn设置新生代大小,-XX:NewRatio=参数 设置新生代与老年代的内存空间比,-XX:SurvivorRation=参数 设置Eden区和Survivor比。
  当Eden区进行minor GC后,如果对象经过一次回收并且还存活,能被Survivor去接收,就会移到Survivor(From)区,包括原From去中的对象,并将其年龄设置为1,每熬过一次minor GC年龄就会加1,当达到一定年龄后,就会晋升到老年代中。每次进行GC操作(Eden和From区),From区对象引入to区,并且和To区进行逻辑互换,保证一个Survivor区是空的,如果在放入To或者survivor区中内存不够时,会被放入Old区。Survivor设计成为两个区,应该回收中筛选更符合Old区条件的对象,因为Old区进行回收代价比较高
  老年代:存放生命周期长的对象,或者是大对象(包括Eden区或者Survivor区无法放下的对象),当Old区被占满时就会进行完成的垃圾回收Full GC(Major GC)包括新生代。Full GC完成后,留下来的内存就会方法Permanent区(持久代)中。

  [b]方法区[/b]
  方法区和Java堆一样,是各个线程共有的公共区域,用来存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也可以被称作“永久代”,但两者本质上并不一样,只是把GC分代收集扩展到方法区了,相对Java堆而言,垃圾收集行为在访法区比较少见,主要针对常量池的回收和对类型的卸载。

  [b]运行时常量池[/b]
  运行时常量池是属于方法区的一部分,是存放编译期生成的各种字面量和符号引用,当类被加载后,这些信息就会放入到访法区运行时常量池中。另外,运行区常量还具有动态特征,不要求常量一定要在编译期产生,运行期间也可能将新的常量放入常量池中,如String的intern方法。

  [b]直接内存[/b]
  不是JVM中一部分,是由于new I/O 可以使用native直接分配堆外内存,然后通过存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值