java从哪学到哪_Java JVM怎么学习啊?从哪方面入手?

772405eb4aec76396dbf744366f1fcc3.png

叮当猫咪

一、 JVM的生命周期  1. JVM实例对应了一个独立运行的java程序它是进程级别  a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点  b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程  c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出  2. JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的    二、 JVM的体系结构    1. 类装载器(ClassLoader)(用来装载.class文件)  2. 执行引擎(执行字节码,或者执行本地方法)  3. 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)    三、 JVM类加载器  JVM整个类加载过程的步骤:  1. 装载  装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+  包名+ClassLoader实例ID。  2. 链接  链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。  完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值。  最后对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。  3. 初始化  初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:  调用了new;  反射调用了类中的方法;  子类调用了初始化;  JVM启动过程中指定的初始化类。    JVM类加载顺序:  JVM两种类装载器包括:启动类装载器和用户自定义类装载器。  启动类装载器是JVM实现的一部分;  用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。  JVM装载顺序:  Jvm启动时,由Bootstrap向User-Defined方向加载类;  应用进行ClassLoader时,由User-Defined向Bootstrap方向查找并加载类;  1. Bootstrap ClassLoader  这是JVM的根ClassLoader,它是用C++实现的,JVM启动时初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的实现)中所有class文件的加载,这个jar中包含了java规范定义的所有接口以及实现。  2. Extension ClassLoader  JVM用此classloader来加载扩展功能的一些jar包。  3. System ClassLoader  JVM用此classloader来加载启动参数中指定的Classpath中的jar包以及目录,在Sun JDK中ClassLoader对应的类名为AppClassLoader。  4. User-Defined ClassLoader  User-DefinedClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,基于自定义的ClassLoader可用于加载非Classpath中的jar以及目录。    ClassLoader抽象类的几个关键方法:  (1) loadClass  此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parent ClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法  (2) findLoadedClass  此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。  (3) findClass  此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。  (4) findSystemClass  此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然为找到,则返回null。  (5) defineClass  此方法负责将二进制的字节码转换为Class对象  (6) resolveClass  此方法负责完成Class对象的链接,如已链接过,则会直接返回。    四、 JVM执行引擎  在执行方法时JVM提供了四种指令来执行:  (1)invokestatic:调用类的static方法  (2)invokevirtual:调用对象实例的方法  (3)invokeinterface:将属性定义为接口来进行调用  (4)invokespecial:JVM对于初始化对象(Java构造器的方法为:)以及调用对象实例中的私有方法时。    主要的执行技术有:  解释,即时编译,自适应优化、芯片级直接执行  (1)解释属于第一代JVM,  (2)即时编译JIT属于第二代JVM,  (3)自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代  JVM的经验,采用两者结合的方式  开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。    五、 JVM运行时数据区  第一块:PC寄存器  PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。  第二块:JVM栈  JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址  第三块:堆(Heap)  它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。  (1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的  (2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配  (3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。  第四块:方法区域(Method Area)  (1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。  (2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class  对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。  第五块:运行时常量池(Runtime Constant Pool)  存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。  第六块:本地方法堆栈(Native Method Stacks)  JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。    六、 JVM垃圾回收  GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停  (1)对新生代的对象的收集称为minor GC;  (2)对旧生代的对象的收集称为Full GC;  (3)程序中主动调用System.gc()强制执行的GC为Full GC。  不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:  (1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)  (2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)  (3)弱引用:在GC时一定会被GC回收  (4)虚引用:由于虚引用只是用来得知对象是否被GC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter处理Cookie与Session

cookie 和session 的区别: 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当…

Maximum sum(poj 2479)

题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和/*看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和,然后枚举断点。 第一次提交不小心折在数组最小值…

java futuretask 实例_java 使用Callable+FutureTask获取执行结果

之前给大家分享了使用CallableFuture获取执行结果的java示例,那么下面要给大家分享的就是使用CallableFutureTask获取执行结果的java示例,一起来看看吧。public class Test{public static void main(String[] args){//方式1ExecutorService executor Ex…

Day03-运算符和表达式

运算符和表达式​ 1. 运算符的优先级 尽量不要把一个表达式写的过于复杂,如果遇到复杂的需求,则最好分步运算 不要过多的依赖于运算符的优先级,否则代码的可读性太差,在实际的项目开发中,一般采用(&#…

Eclipse中字母大小写转换快捷键

ctrlshiftx 转为大写 ctrlshifty 转为小写 转载于:https://www.cnblogs.com/stsinghua/p/6418636.html

dedecms代码研究六

今天讲的是dedecms最关键的东西&#xff0c;模板分析啦。也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数&#xff1a; {dede:arclist row10 orderbypubdate typeimage. imgwidth143 imgheight106} <li><a href&q…

Django-session的存放位置

django-session 存放位置 设置session的保存位置&#xff0c;有三种方法&#xff1a; 保存在关系数据库(db)保存在缓存数据库(cache) 或者 关系缓存数据库(cache_db) 保存在文件系统中(file) 第一种 保存在数据库中&#xff1a;需要在 INSTALL_APPS 中添加&#xff1a;djan…

允许多域名跨域 php,PHP设置多域名允许跨域访问

针对 PHP 语言设置多域名允许跨域访问服务器变量&#xff1a;服务器变量存储在 $_SERVER 数组中&#xff0c;在这个数组中有一个特殊的键值&#xff1a;HTTP_ORIGIN。这个键只在跨域的时候才会存在值&#xff0c;同源时为空字符串响应头设置允许某域名访问&#xff1a;access-c…

蚂蚁分类信息系统 5.8 信息浏览量后台自定义设置

mymps 蚂蚁分类信息是一款基于PHPMySQL的建站系统,为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps5.8 下载 蚂蚁分类系统 5.8下载 蚂蚁分类系统下载 mymps下载 蚂蚁分类信息系统 5.8 原信息浏览量后台无法自定义&#xff0c;现增加后台自定义浏览量…

MS SQL-Server快捷键

快捷键 功能 CtrlShiftB 生成解决方案 CtrlF7 生成编译 CtrlO 打开文件 CtrlShiftC 显示类视图窗口 CtrlShiftO 打开项目 F4 显示属性窗口 ShiftF4 …

python编写四位数验证码

def verifycode(request):#引入绘图模块from PIL import Image, ImageDraw, ImageFont#引入随机函数模块import random#定义变量&#xff0c;用于画面的背景色、宽、高bgcolor (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width 100h…

php 计算数据偏离度,关于偏离度的测算方法

2015年6月技术总结——关于偏离度的测算方法研究院公用事业部 路璐引言《原理》中说“偏离度是指每一种偿债来源与财富创造能力的距离&#xff0c;所体现的是偿债来源对债务安全的保障程度&#xff0c;唯有通过揭示偿债来源与财富创造能力偏离度才能真正区别每一种偿债来源的风…

Django中celery配置总结

情景&#xff1a; 用户发起request&#xff0c;并等待response返回。在本些views中&#xff0c;可能需要执行一段耗时的程序&#xff0c;那么用户就会等待很长时间&#xff0c; 造成不好的用户体验&#xff0c;比如发送邮件、手机验证码等。 使用celery后&#xff0c;情况就不…

AngularJs ng-repeat限制循环次数

重复数组&#xff1a;<ul ng-initname[1,2,3,3]><li ng-repeat"name in name track by $index">{{name}}</li> </ul> 对象&#xff1a; <ul ng-initobj{ a:"aaa", b:"bbb", c:"ccc" }><li ng-repeat…

qml demo分析(customgeometry-贝塞尔曲线)

一、效果展示 本篇文章还是带来一个简单的qt示例分析&#xff0c;且看图1效果。 图1 贝塞尔曲线 二、源码分析 该示例代码所在目录quick\scenegraph\customgeometry&#xff0c;感兴趣的同学可以自己去找&#xff0c;这篇文章我还是主要讲解源码&#xff0c;不涉及其他方面。 废…

php 打包上传的文件,PHP单文件上传原理及上传函数的打包

PHP单文件上传原理及上传函数的封装服务器(临时文件)——>指定目录,当文件进入服务器时它就是临时文件了,这时操作中要用临时文件的名称tmp_name。//在客户端设置上传文件的限制(文件类型和大小)是不安全的&#xff0c;因为客户能通过源代码修改限制&#xff0c;所以在服务端…

celery AttributeError: 'str' object has no attribute 'items'

AttributeError: str object has no attribute items python manage.py celery worker --loglevelinfo 查了好久发现原来是因为以前下的redis版本过高&#xff08; 3.0.1 &#xff09;&#xff0c;重装redis pip install redis2.10.6

equals和==的区别(转)

基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean&#xff0c;他们之间的比较&#xff0c;应用双等号&#xff08;&#xff09;,比较的是他们的值。 复合数据类型(类) 当他们用&#xff08;&#xff09;进行比较的时候&#xff0c;…

Python 中的range,以及numpy包中的arange函数

range函数函数说明&#xff1a; range(start, stop[, step]) -> range object&#xff0c;根据start与stop指定的范围以及step设定的步长&#xff0c;生成一个序列。  参数含义&#xff1a;start:计数从start开始。默认是从0开始。例如range&#xff08;5&#xff09;等价…

php角色权限安全,php – 安全的chmod权限?

新创建的文件和目录的默认权限由umask环境变量设置.文件的所有者和root可以更改权限.如果您不需要在应用程序中使用chmod,请将其保留在禁用列表中.你应该看看安全性的方式是&#xff1a;现在比我更聪明的人让chmod成为我应用程序中更安全的部分之一.因此,我将花费我的时间使其他…