JAVA虚拟机中是如何加载JAVA类的?
我们平时都知道通过javac命令将
.java
文件编译成.class
要想具体搞清楚java类是如何加载的Java虚拟机中,我们需要搞清楚以下几个问题:
一个Java类什么时候开始被加载?
加载Java类的过程是怎样的?
一个Java类从被加载到JVM内存中到这个类被卸载,主要包含以下七个步骤的生命周期。
一个Java类什么时候开始被加载?
Java虚拟机并没有规定在什么时候需要加载Java类,但是对于Java类的初始化却有明确的规定,有且只有以下5中情况时候便会立即触发类的“初始化”动作:
遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有初始化,则需要先触发其初始化,代码示例如下:
使用
java.lang.reflect
包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化,代码示例如下:当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。这个很好理解,就是当一个子类遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果父类还没有初始化,则先初始化父类。
当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。这块属于动态加载的范畴,本质上还是需要需要new、getstatic、putstatic或invokestatic这4条字节码指令。
加载Java类的过程是怎样的?
知道了类被加载的条件后,我们需要知道一个Java类通过怎样的过程被加载到Java虚拟机中去了。
这个过程其实就是把一个
.class
文件中的java类相关信息加载到内存中,通过验证、准备、解析等阶段,最终生成一个存在于Java虚拟机内存中的java.lang.Class
对象。这里面涉及到的知识点比较多:
如何验证一个
.class
文件是符合Java虚拟机规范的?准备阶段都做哪些事情?
类加载机制是怎样的?
什么是双亲委派模型?
加载完的类存储在Java虚拟机的什么内存区域?
加载的类GC可以回收吗?如果可以回收需要满足什么样的条件才可以回收一个类?
推荐大家一定要阅读《深入理解Java虚拟机》这本Java程序员必读书籍!并且不只是读一遍,要不停的读,不停的品!
以上就是我个人对“JAVA虚拟机中是如何加载JAVA类的?”这个问题的一些解答,这里只是给大家开个一个头,需要大家再继续深耕下去。
我是【java架构设计】,关注我,持续为您提供Java领域优质内容!
刚入门java,有什么网站可以有题让我练习呢?
本人计算机科学与技术专业,从事java有4年了。分享下自己的学习网站吧。
1.牛客网
主要服务于国内广大程序员。产品规模很大,包括了it题库、在线编程练习、线上课程、社区、笔试服务、还有竞赛。用户基本覆盖全国高校百万的程序员学习者。在国内互联网公司有良好的口碑,为国内众多的互联网公司提供了校园招聘,竞赛等服务。具备基本每个领域的笔试算法题,值得收藏。
2.利扣 leetcode
这个网站有国际版和国内版,平常我们进国内版的就行了啊,当然英文好的也可以使用国际版,这里非常建议大家使用国际版,交流的技术存在差异,但是题目基本一致,不需要担心。
地址:leetcode-cn.com
利扣被国内外程序员称为刷题神器。甚至有人说,你如果掌握了百分之80左右,各互联网公司提供的算法岗位你只要对比下谁的工资高就好了。
它基本覆盖了全互联网公司的算法题目,还有数据库等技术,并且提供了交流平台,国内过各种大神将自己的解答想法分享出来,有些巧妙的解答确实会令人拍案叫绝。普遍都是国外人,但是国内人也特别多,当然是国际版才是这样的。
如果单单是学习练习java编程的,这两个网站可以满足了,关键就是提升你的编程思维能力。
要学习java核心技术还是建议购买java相关书籍或者在网上课堂学习。
核心推荐:LintCode / LeetCode / 牛客网
不是什么程序员,但是大一大二大三自己都是自学过来一直学到JavaEE的,还是有些经验的。
JavaSE阶段,找个牛逼点的基础视频课听过后,建议找一些小游戏编着玩,贪吃蛇啊2048啊坦克大战啊,学习一下怎么一步步搭出一个小游戏。可以找网上的视频课,网易云课堂还有一些培训机构都有做小游戏的视频,听老师一步步讲思路后,自己尝试一下他的思路是要怎么做,敲完后再比对一下。
基本做了三个小游戏下来,Java就不是很陌生的东西了,这时候建议上LintCode或者LeetCode刷题,每天两到三小时在这上面。里面的题都是最常规的API解决各种面试用算法题。没系统学过算法?也不要紧,建议买本《算法》橙皮书,然后先从LeetCode之类的简单题做起,不懂就看discuss或者别人博客是怎么想的,看懂后自己不看别人代码实现一遍。
其中如果牵涉到某个算法,比如动态规划,你从未接触过,不要怕,这道题放着,翻开橙皮书现学呗,看不懂慢慢看,看完后盲敲示例代码,这样对基本代码素养有很大帮助。啃完这个知识点,再回去继续刷题。
私以为,JavaSE阶段最重要的不是IO操作啊什么的,还是LeetCode里面向招聘的算法题。
如果你很想加强Java文件流和网络,网上找视频做个JavaSE聊天项目或者文件收发项目是最简单的,跟学一次练一次就没有大问题了。
线程很重要。多线程是很复杂的,其中牵涉到的知识还得专门看诸如《并发编程实战》之类书来提升,建议前期了解基本的同步操作就够了,等到学到JavaEE阶段,会用SSMH这些框架后,再来开始边做项目,边研究线程同步这种问题。
java类面试题哪里有哦?
程序员面试分两部分,理论和编程。
准备理论面试的时候,有一份调理清晰的面试题目是很有帮助的,所以我自己也在做一系列的视频,就是针对面试题目的,不过还在整理录制当中,有兴趣可以关注我。如果现在急用,可以到这里看一下:。
至于编程练习,leetcode是首选,只是现在leetcode不是所以的东西都免费了。我同时也在定期录制编程训练的视频,希望之后可以帮到更多的朋友。
哪一个java视频教程好?
web开发日益盛行,同时,web开发语言也非常多,比较就行的有:java、php、html5、.net等等。同时,相对应的培训机构和学习教材也非常丰富。对于java初学者,《从入门到精通》视频教程有几个优点:
1.系统化
学习一门计算机高级语言,最重要的是有编程思想,而这门课程,从基础知识到高级特性,由浅到深,引导初学者进去编程世界。
2.实践性
理论是实践的基础,系统化学习后,重要的是把学到的知识,应用到实际项目中。这门课程会有大量的实践性题材,能很快提升初学者的实践能力。
java开发现在需求越来越大,相对应的java学习资料也是非常多的, 不过首先要看看你有没有Java编程基础,现在网络上的视频教程太多,以至于让学习的小伙伴不知道该学习哪个。现在学java的人很多,网上有很多java的视频教程,零基础选择java培训最好是先在尚学堂找一些高淇老师的java300集基础视频先看看。高淇老师的《Java300集》,你可以尝试一下,高淇老师的讲课模式很幽默,有很多刚入门的学生都是学习高淇老师的《Java300集》入门的,有条件的话肯定是系统的培训是最好的,不过前期的话,建议是先看看学习资料,再决定,因为现在培训的地方有很多,太过于急于求成反而会适得其反,所以说你先看看高淇老师的java300集,相信会对你之后要走的路,有一个好的规划。零基础的学习Java技术,不太建议自学,Java还是有一定的难度的,自学很容易半途而废,浪费时间。建议去Java培训班学习,集体学习,更有学习氛围,容易学进去;学习时间短,见效较快。.进阶学习的,这样类型的一般都是工作多年的,需要学习新的东西来提升一下自己,这种就可以找线上的学习课程学习,现在这种做的也是很不错的,尚学堂也有做线上的课程教育。Java做的怎么样,主要还是看你个人掌握的东西多不多,对于Java这个行业投入的有多少,培训只是提升自我和学习的一种手段。
想要学好Java大数据的话建议你可以学习百战程序员,我就是在百战程序员学习的Java,进阶的大数据,课程质量还是很好的,现在已经就业。能被北大列为课题研究的课程肯定是可以保证质量的。
选择百战程序员也是从各个方面考虑的:
1是百战程序员的口碑好,有好口碑的培训机构是非常注重学员对自己学校的看法的,可以认真负责。
2是师资力量,百战程序员的授课老师都有8年以上的授课经验,还都是业内大牛,还有督导老师监督,不会拉下课,全程有老师辅导。
3是实操项目:有最好的课程和最好的老师,还要有很多的实操和项目练手,每个阶段大大小小的实操还要被评分,都是企业最新的项目结合,可以真正保证学习效果,更好的融入工作。
4就是就业,这个是最重要的,培训最重的是想找一份好工作,所以就业方面是重点考察的,这个百战程序员做的是特别好的,简历的编写,投递以及面试,复试过程中应该注意的问题,面试技巧,都有老师指导,在业内的就业率也是最高的。
java开发现在需求越来越大,相对应的java学习资料也是非常多的, 不过首先要看看你有没有Java编程基础,现在网络上的视频教程太多,以至于让学习的小伙伴不知道该学习哪个。现在学java的人很多,网上有很多java的视频教程,零基础选择java培训最好是先在尚学堂找一些高淇老师的java300基础视频先看看。高淇老师的java300集,你可以尝试一下,高淇老师的讲课模式很幽默,有很多刚入门的学生都是学习高淇老师的java300集入门的,有条件的话肯定是系统的培训是最好的,不过前期的话,建议是先看看学习资料,再决定,因为现在培训的地方有很多,太过于急于求成反而会适得其反,所以说你先看看高淇老师的java300,相信会对你之后要走的路,有一个好的规划。零基础的学习Java技术,不太建议自学,Java还是有一定的难度的,自学很容易半途而废,浪费时间。建议去Java培训班学习,集体学习,更有学习氛围,容易学进去;学习时间短,见效较快。.进阶学习的,这样类型的一般都是工作多年的,需要学习新的东西来提升一下自己,这种就可以找线上的学习课程学习,现在这种做的也是很不错的,尚学堂也有做线上的课程教育。Java做的怎么样,主要还是看你个人掌握的东西多不多,对于Java这个行业投入的有多少,培训只是提升自我和学习的一种手段。
首先要看看你有没有Java编程基础,现在视频教程太多繁琐,以至于让学习的小伙伴迷失方向。现在学java的人很多,网上有很多java的视频教程,零基础选择java培训最好是先在itjobJava网上找些java基础视频先看看。
推荐你比较好的就是腾讯课堂或者百度里面,都有很不错的视屏。最好不要一开始就来高难度的。给你个思路:
1、要认识Java语言,知道Java语言到底可以用来做什么,也就是它的特点;
2、熟悉Java语法,就跟任何语言(中文、英语)一样,都有语法,语法是实现出你想得到的结果,比如说“我爱你”,中文好说,有拼音组成,但是用java的语法(代码)打出来,在屏幕上显示“我爱你”。
3、特点和语法学习完后,可以接触一下简单的功能;
4、然后把这些小功能组合起来,形成一个小系统。
最后就是在学习的过程中,一定要锻炼你的编程思维,这也是最重要的,你的逻辑思维是决定你做任何实情的坚定基础。希望能够帮到你,谢谢。

