欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JVM还有Java中的内存管理、反射,jvmjava

来源: javaer 分享于  点击 11591 次 点评:118

JVM还有Java中的内存管理、反射,jvmjava


JVM:

What

先从JVM开始吧。JVM也就是Java Virtual Machine也就是Java虚拟机。他是一种特殊的机制,为Java的字节码的运行提供了runtime的环境。Jvm是平台独立的,这样也是实现了Java的一次编写,到处运行的机制。每次当你在命令行使用Java命令来运行一个java类的时候(例如:java test.java),java就会创建一个jvm的runtime实例。

所以,JVM具体都做了哪些事情呢?

loads code -> verifies code -> executes code -> provides runtime environment.

同时,JVM也为以下的概念提供了定义: memory area, class file format, register set, garbage-collected heap, fatal error reporting等。

下图就是JVM的一个内部结构:


我们从这个结构图的每一部分来了解JVM的每一部分都是做什么的,有什么意义。

1.Classloader:

是一个JVM的subsystem,可以用来加载class file.

2.Class(Method)Area

在class area中存储了每个类的结构,比如说runtime的constant pool,成员变量还有方法数据,当然也包括方法中的代码等。

3.Heap

这是一个runtime的数据区域,对象就是被分配存储在这个区域中的。

4.Stack

java中的stack存储了frame(中文叫做帧,我一直很讨厌这个名字,从网络原理开始,frame代表的意义感觉帧这个字完全无法体现,而且多增加了更加不好记的名字)。他当中包含着本地的变量和部分结果,并且对于方法的调用还有返回具有一定意义。在java中,当有线程创建的时候,这个线程就会获得一个私有的jvm的stack。每当有一个方法被调用的时候,一个新的frame就会被建立。方法调用结束之后,这个frame就会被destroy.

5.PC register(program counter)

PC register。他报刊了当前正在被执行的JVM指令的地址。

6.Native Method Stack

包含了应用中会需要用到的全部native method

7.Execution Engine

其中有:一个虚拟的处理器,一个interpreter(翻译器)用来读取字节码流并执行指令,还有一个Just-In-Time(JIT)compiler,可以翻译为即时编译器。他被用来提高效率。JIT可以同时编译一部分具有相似功能性的字节码,这样就减少了编译所需要的时间。


跟多具体的内容,推荐大家也可以看看https://www.geeksforgeeks.org/jvm-works-jvm-architecture/, geeksforgeeks上面有很多图片和代码,对于JVM的讲解十分的具体清晰。

JVM主要会做以下三种事情:

1.loading

把.class文件读取进来,并且声称相对应的二进制数据,并把这些数据存储进method area。

2.linking

进行verification, preparation还有resolution

verification:确保了.class file的正确性。会检查是否这个文件正确的被formatted并且被有效的编译器生成了。如果失败了,会返回一个run-time的异常。

preparation: JVM会为类变量分配空间

resolution:It is the process of replacing symbolic references from the type with direct references. It is done by searching into method area to locate the referenced entity.


接下来就是reflection了,可以看stackoverflow上面有一个1325赞的答案,关于“what is reflection and why is it”https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful


反射:


这张图就基本说明了反射的作用是什么。

反射可以获取以下的信息:

1.Class getClass()获得对象所在的类的名字

2.Constructors  The getConstructors() method is used to get the public constructors of the class to which an object belongs.

3.Methods:The getMethods() method is used to get the public methods of the class to which an objects belongs.


接下来是GC机制,也就是垃圾回收机制

https://www.geeksforgeeks.org/garbage-collection-java/

首先,我们需要了解什么叫做Unreachable object,可以用下面的代码和图片来解释


也就是说,当一个对象,没有任何指向他的引用的时候我们就可以说这个对象是unreachable的了。当一个对象是unreachable的状态时,我们就可以对他进行垃圾回收了。

下面就是用什么方式,可以将一个对象达到可进行回收的状态?因为即使很多时候不需要进行destroy object,但是最好还是当一个对象不使用的时候,让他变为unreachable的状态。

1.将引用变量赋值为null

2.将这个引用变量指向别的对象

3.在方法内部创建对象(这样当方法生命周期结束的时候,这个对象会跟着方法一起被回收)

4.Island of Isolation(说白了就是A指向B,B指向A,他俩互相指向跟别的对象不发生任何关系,他俩就组成了一个island of isolation)

那么,如何使用代码进行GC呢?

当一个对象变为unreachable的时候,并不意味着GC机制会马上detroy他。当JVM运行GC的时候,object肯定会被destroy但是实际上你并不知道JVM什么时候会去运行gc。

我们当然也可以请求JVM来运行GC。有两种方法:

1.使用System.gc()犯法。

2.使用Runtime.getRuntime().gc()方法。

这是我们也不得不提到另一个概念:Finalization

在destroy一个对象之前,GC会调用finalize()方法来针对object实现一些cleanup的行为。一旦finalize()方法结束,gc就马上destroy对象。(Based on our requirement, we can override finalize() method for perform our cleanup activities like closing connection from database.)

1.finalize()方法时被garbage collector调用的,而不是JVM。虽然garbage collector也是JVM的一个module。

2.Object class finalize()方法又空的实现。因此,十分建议重写finalize方法来释放系统资源或者实现各种不同的clean up

3.finalize()方法对于任何对象来说,仅仅只被调用一次!!

4.如果一个uncaught exception被finalize方法跑出,这个异常会被忽略,但是对于这个对象的finalization也会同时终止。

相关文章

    暂无相关文章
相关栏目:

用户点评