Java基础 — Java 虚拟机(上篇)
该文章属于Java进阶部分的JVM入门,本章讲述了JVM的历史、Java源代码到机器码的过程以及 Class字节码文件的内部结构等。
了解了这篇文章,能让你深入地了解JVM知识,保证在短时间内掌握JVM!
JVM 入门教程(上篇)
开篇:为什么要学虚拟机
-
学习Java虚拟机能深入地理解Java这门语言
-
学习虚拟机是为了线上排查问题打下基础
-
学会垃圾回收机制等,看懂Java虚拟机内存模型,看懂GC日志,解决线上的Java应用崩溃问题
第 1 讲 Java语言的前世今生
1. JDK 与 JRE
-
JRE 仅包含运行Java程序的必须组件,包括Java虚拟机以及Java核心类库等。
-
JDK 除了包含JRE外,还附带了一系列开发、诊断工具。
-
一般来说,如果只需要运行Java程序,那么安装JRE即可。但如果要运行Java程序的开发,那么就需要安装JDK。
2. JDK 与 J2SE
-
Java SE 是Java三大技术体系的一个。
-
在1998年,JDK1.2发布,Java技术体系被拆分为 J2SE、J2EE、J2ME三大体系。
-
J2SE称之为标准版技术体系,它包含了构成Java语言核心的类,如:数据库连接、网络编程、接口定义等。J2SE技术体系主要用于桌面应用软件的编程。
-
J2EE称之为企业版技术体系,它除了包含J2SE中的类,还包含用于开发企业级应用的类,如:Servle、JSP、EJB等。J2EE技术体系主要用于分布式的网络程序的开发,如电子商务网站等。
-
J2ME称之为嵌入式技术体系,它包含J2SE中的一部分类。J2ME技术体系主要用于消费电子产品的软件开发,如:手机、PDA、寻呼机等。
3. J2SE 与 Java SE
-
J2SE 与 Java SE ,其实它们指的是同一个东西,只不过在2006年JDK 1.6 发布时,讲J2SE、J2EE、J2ME的命名方式改为 Java SE 6、Java EE 6、Java ME 6。
4. Java语言的历史
-
在 1991 年,James Gosling 博士发布了 Oak,这个是 Java 语言的前身。但一直到 1995 年的时候,Oak 语言才改名为 Java。
-
1991 年,James Gosling 博士发布产品 Oak,这是 Java 语言的前身。
-
1995 年,Oak 语言改名为 Java。
-
1996 年,JDK1.0 发布,提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM。
-
1997 年,JDK1.1 发布,代表技术有:JDBC、JavaBeans、内部类、反射。
-
1998 年,JDK1.2 发布,Java 技术体系被拆分为 J2SE、J2EE、J2ME 三大体系。
-
2000 年,JDK1.3 发布,默认的 Java 虚拟机由 Sun Classic VM 改为 HotSopt。
-
2002 年,JDK1.4 发布,Java 真正走向成熟,代表技术有:正则表达式、NIO等。
-
2004 年,JDK1.5 发布,对语法易用性做了很大改进,新增了泛型、枚举等,代表技术有:并发包等。
-
2006 年,JDK1.6 发布,将 J2EE/J2SE/J2ME 的命名方式改为 Java SE 6、Java EE 6、Java ME 6。
-
2009 年,Sun 公司因为经营不善被 Oracle 公司收购。
-
2011 年,JDK1.7 发布。
-
2013 年,JDK1.8 发布。
-
…………
5. 总结
-
这一部分简单地介绍了一些常见概念上地区别,以及Java语言的历史,让大家对Java语言的发展有一个大致的理解。
第 2 讲 Java虚拟机的历史
1. Sun Classic —— 虚拟机始祖
-
在 1996 年 1 月 23 日,Sun 发布 JDK1.0,齐总自带的虚拟机就是Classic VM。但是这款虚拟机有个特点,只能使用纯解释器的方式来执行Java代码,此时解释器与编译器无法共同存在。到JDK1.4正式退出历史舞台。
2. Sun Exact VM —— 无疾而终
-
在 JDK1.2 时发布了Exact VM 的虚拟机,尝试解决 Classic VM遇到的所有问题,它的执行系统解决了Classic VM 存在的编译器和解释器无法同时工作的问题,还具备了一些现代高性能处理器的特性,如:两级即时编译等。
-
Exact VM 还改进了虚拟机的对象查找方式,使用了准确式内存管理,即虚拟机可以知道内存中某个位置的数据具体是什么类型,这样就减少了查找的开销,提升了执行性能。
-
但可惜的是,虽然Exact VM发布了,但是直到它退出时,都没有被大规模使用过。
3. Sun HotSpot VM —— 武林盟主
-
HotSpot不仅仅有前面说到两款虚拟机的优点,也有许多自己的新技术,如:热点探测技术。热点探测技术指的是通过执行计数器找出最具优化价值的代码,然后通知JIT编译器一方法为单位进行深度优化编译。
-
从 2000 年JDK1.3发布,HotSpot VM作为默认的虚拟机开始登上历史舞台。
4. BEA JRockit / IBM J9 VM —— 百家争鸣
-
前面说的都是 Sun 公司推出的虚拟机,其他组织、公司也研发过不少的虚拟机实现。这里是最著名的。
-
BEA 公司的 JRockit 是一款专注于服务器硬件和服务端应用场景的虚拟机,其针对服务端场景做了大量的优化,因此其不太关注程序启动速度。JRockit 虚拟机内部不包含解释器实现,全部代码都靠即时编译器编译后执行。此外,其提供的 MissionControl 服务套件也十分强大。
-
IBM 公司的 J9 VM 则是一款比较通用的虚拟机,其定位应用于从服务端到桌面应用再到嵌入式的多用途虚拟机。IBM 公司开发 J9 VM 的目的是将其作为 IBM 公司各种 Java 产品的执行平台。
5. 那些无名虚拟机 —— 武林外传
-
除了上述的这些虚拟机之外,其实还有各种各样的虚拟机存在。
-
例如性能最强悍的并不是上面所说的虚拟机,而是名为 Azul VM 和 BEA Liquid VM 的专用商业及虚拟机。这些虚拟机只运行在特定硬件平台,因此要求比较高。但其性能也是非常强悍的。其可以管理至少数十个 CPU 和数百 GB 的内存资源,还提供在巨大内存范围内实现可控 GC 时间的垃圾收集器等等。
-
此外还有许许多多其他的虚拟机存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft JVM 等等。
-
Oracle 看了这么些历史,似乎都是在说 Sun公司发布的虚拟机,与 Oracle 似乎没有什么关系。但在 2010 年,Oracle 公司收购了 Sun 公司,这样 Oracle 就拥有了 HotSpot VM。再加上其在 2008 年收购 BEA 公司获得的 JRocket VM,Oracle 公司就拥有了地球上最优秀的两款虚拟机。
-
对于虚拟机未来的规划,Oracle 宣布会将 JRockit 的优秀特性整合到 HotSpot VM 中,例如移植 JRockit 的垃圾回收器和 MissionControl 服务。
第 3 讲 到底什么是虚拟机?
-
为什么不同系统上的软件无法安装,这是因为操作系统底层的实现是不一样的。对于Windows系统来说,exe后缀的软件代码最终编译成Windows系统能识别的机器码。而Mac OSX 系统来说,dmg后缀的软件代码最终编译成 Mac OSX 系统能识别的代码。
-
与其他语言不同,Java语言并不直接讲代码编译成与系统有关的机器码,而是编译成一种特定的语言规范,这种语言规范我们称之为字节码。无论Java程序要在Windows系统,还是Mac OSX系统,或者是Linux系统,它首先都得编译成字节码文件,之后才能运行。
-
但即使编译成字节码文件了,各个系统还是无法明白字节码文件的内容,这时就需要Java虚拟机的帮助了。Java虚拟机会解析字节码文件的内容,并将其翻译为各操作系统能理解的机器码。
-
Java虚拟机运行的是字节码文件,如果你用php语言写一段代码,并自己用特定编译器能生成符合字节码规范的字节码文件,那么Java虚拟机也是可以运行的。
-
简单来说Java虚拟机就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。
第 4 讲 对于Java语言,从源代码到机器码,发生了什么?
编译器可以分为:前端编译器、JIT编译器和AOT编译器
前端编译器
前端编译器:源代码到字节码 对于Java虚拟机来说,其实际输入的是字节码文件,而不是Java文件。 怎样讲Java代码转化为字节码文件?我们知道在JDK的安装目录里有一个javac工具,就是它讲Java代码翻译成字节码,这个工具我们叫做编译器,因为是处于编译前期,所以被称为前端编译器。常见的前端编译器有Sun的javac,Eclipse JDT的增量编译器(ECJ)。 通过javac编译器,我们可以很方便地将java源文件翻译成字节码文件。javac编译器解析Java源码,并生成字节码文件地过程,就是使用javac编译器把Java语言规范转化为字节码语言规范。
javac编译器地处理过程可以分为下面地四个阶段:
第一阶段:词法、语法分析
javac编译器会对源代码地字符进行一次扫描,最终生成一个抽象地语法树。
第二阶段:填充符号表
对抽象地类或接口进行符号填充,等到类加载阶段,javac编译器会将符号替换成具体地内存地址。
第三个阶段:注解处理
Java是支持注解地,因此在这个阶段会对注解进行分析,根据注解地作用将其还原成具体的指令集。
第四个阶段:分析与字节码生成
javac编译器会根据上面几个阶段分析出来的结果,进行字节码的生成,最终输出为class文件。
JIT编译器(即时编译器)
-
JIT编译器:从字节码到机器码
-
当源代码转化为字节码后,其实要运行程序有两种选择:
-
一种是Java解释器解释执行字节码,另一种则是使用JIT编译器将字节码转化为本地机器代码。
-
两者区别在于,前者启动速度快但运行速度慢,后者启动速度慢但运行速度快。
-
-
在HotSpot虚拟机内置了两个即时编译器,分别为Client Compiler和Server Compiler。
-
这两种不同的编译器衍生出两种不同的编译模式,我们分别称之为:C1编译模式、C2编译模式(非官方说法)。
C1编译模式和C2编译模式的区别
-
C1编译模式会将字节码编译为本地代码,进行简单、可靠的优化,如:有必要将加入性能监控的逻辑。优化相对比较保守,比C2较快。
-
而C2编译模式,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。C2的编译质量相对较好,但耗时更长。
对于HotSpot虚拟机有三种运行模式可选
-
混合模式:
-
C1和C2两种模式混合起来使用,这是默认的运行模式,如果想单独使用C1模式或C2模式,使用 -client 或 -server 打开即可。
-
解释模式:
-
所有代码都解释执行,使用 -Xint 参数可以打开这个模式。
-
编译模式:
-
此模式优先采用编译,但是无法编译时也会解释执行,使用 -Xcomp 打开这种模式。
此时,我们了解了从Java源代码到字节码,再从字节码到机器码的全过程,可以到这里就结束了。但是Java中还有一个AOT编译器,它能直接将源代码转换为机器码。
AOT编译器
-
AOT编译器:源代码到机器码
-
AOT编译器的基本思想是:在程序执行前生成Java方法的本地代码,以便在程序运行时直接使用本地代码,也就是在进入JVM之前就已经将本地机器码生成了。
- 优点:
-
启动速度快,减少运行时的开销
-
- 限制:
-
由于缺乏运行时信息,AOT编译质量也就是优化效果通常不如JIT编译。
-
Java的动态类加载等特性可能会增加AOT编译的复杂性。
-
总结
-
在JVM中有三个非常重要的编译器,它们分别是:前端编译器、JIT编译器、AOT编译器。
-
前端编译器,最常见的是javac编译器,将Java源代码编译为Java字节码文件。
-
JIT编译器(即时编译器),最常见的是HotSpot虚拟机中的Client Compiler和 Server Compiler,将Java字节码编译成本地机器代码。
-
AOT编译器能将源代码直接编译为本地机器码。
编译速度和编译质量上的区别
-
编译速度上,解释执行>AOT编译器>JIT编译器
-
编译质量上,JIT编译器>AOT编译器>解释执行。
而在JVM中,通过这几种不同方式的配合,使得JVM的编译质量和运行速度达到最优的状态。
第 5 讲 字节码文件结构
《Java虚拟机规范》规定了Java虚拟机结构、Class类文件结构、字节码指令等内容。
字节码文件结构是一组以8位字节为基础的二进制流,各数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。
在字节码结构中,有两种最基本的数据类型来表示字节码文件格式,分别是:无符号数和表。
无符号数
-
无符号数属于最基本的数据类型。它以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数。
-
无符号数可以用来描述数字、索引引用、数量或者按照UTF-8编码构成的字符串值。
表
-
表是由多个无符号数或者其他表作为数据项构成的复合数据类型。
一个Class字节码文件的格式内容
-
magic: 魔数,固定为0xCAFEBABE,用于标识这是一个Java Class文件。
-
minor_version 和 major_version: 分别表示Class文件的次版本号和主版本号。
-
constant_pool_count: 常量池中常量的数量。
-
constant_pool: 常量池,存储了类中用到的所有常量,包括字符串、类名、方法名等。这里除了基本类型和UTF-8的字符串存储的是值外,其他的都是存储的索引。
-
access_flags: 访问标志,标识类或接口的访问权限和属性(如public, final, abstract等)。 如:这个Class是类还是接口、是否定义位public类型、是否定义为abstract类型等。标志值可以通过相加来叠加。
-
this_class: 当前类的索引,确定这个类的全限定名,指向常量池中的一个项。
-
super_class: 父类的索引,确定这个类的父类的全限定名,指向常量池中的一个项。
-
interfaces_count 和 interfaces: 接口的数量和接口列表。Class文件中由this_class、super_class、interfaces_count这三项数据来确定这个类的继承关系。
-
fields_count 和 fields: 字段的数量和字段列表。
-
methods_count 和 methods: 方法的数量和方法列表。
-
attributes_count 和 attributes: 属性的数量和属性列表。
相关文章:
Java基础 — Java 虚拟机(上篇)
该文章属于Java进阶部分的JVM入门,本章讲述了JVM的历史、Java源代码到机器码的过程以及 Class字节码文件的内部结构等。 了解了这篇文章,能让你深入地了解JVM知识,保证在短时间内掌握JVM! JVM 入门教程(上篇࿰…...

C++ | Leetcode C++题解之第435题无重叠区间
题目: 题解: class Solution { public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.empty()) {return 0;}sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {retur…...

AI编辑器CURSOR_CURSOR安装教程_使用AI进行编码的最佳方式。
一、CUROR简介 作为一个在代码海洋里遨游多年的老程序员,我得说,遇到CURSOR这位AI编辑器,就像是编程路上偶遇了一位智慧而又贴心的老友。 想象一下,夜深人静,你正埋头于那些错综复杂的逻辑和无尽的bug之中࿰…...
华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 10 推送实况窗消息
场景介绍 实况窗是一种帮助用户聚焦正在进行的任务,方便快速查看和即时处理的通知形态。有关实况窗简介、权限申请、开放场景、设计规范等说明,请参见Live View Kit简介。 通过Push Kit发送的实况窗消息支持三种操作类型,分别是: 实况窗消息操作类型 支持操作的场景类型 …...
探索 Go 语言程序实体:揭开神秘面纱
《探索 Go 语言程序实体:揭开神秘面纱》 在 Go 语言的世界里,程序实体是构建强大应用的基石。它们就像是魔法世界中的元素,各自有着独特的能力和用途。让我们一起深入探索 Go 语言程序实体的那些事儿。 一、什么是 Go 语言程序实体? 在 Go 语言中,程序实体是指可以被命…...

深入理解端口、端口号及FTP的基本工作原理
FTP是TCP/IP的一种具体应用,FTP工作在OSI模型的第七层,TCP模型的第四层上,即应用层,FTP使用的是传输层的TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,其…...

9.3 Linux_文件I/O_相关函数
打开与关闭 1、打开文件 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);返回值:成功返回文件描述符,失败返回EOF pathname:文件路径 flags:标志,其中O_RDO…...

点亮一个LED灯
一、任务分析 一个灯怎么样才会亮? 图中的小灯两端接正负极,小灯就会点亮,但是我们不能主动控制灯的亮灭,于是加入了开关。开关打开断开小灯正极,小灯就会熄灭,反之则点亮。 在板子上的灯是如何连接的&…...

分布式框架 - ZooKeeper
一、什么是微服务架构 1、单体架构 顾名思义一个软件系统只部署在一台服务器上。 在高并发场景中,比如电商项目,单台服务器往往难以支撑短时间内的大量请求,聪明的架构师想出了一个办法提高并发量:一台服务器不够就加一台&am…...
8月份,AI图像生成领域web端产品排行榜及产品是做什么的
看全球用户量级别的Top12(WEB)。 排名 产品名 分类 8月访问量 上月对比 1 Canva AI Design Tool 711.9M 6.48% 2 Remove.bg AI Image Editor 72.79M 2.84% 3 Fotor AI Image Editor 15.62M 2.34% 4 Civitai Model Training & …...
Sqlite_Datetime列选择三月的行
In SQLite, use the strftime function to extract components from a date/time value SELECT * FROM table WHERE strftime(%m, datemonth) 03;strftime(‘%m’, datemonth): extracts the month part from the datemonth column as a string (with leading zeros for sing…...

spring里面内置的非常实用的工具
一 、请求数据记录 Spring Boot提供了一个内置的日志记录解决方案,通过 AbstractRequestLoggingFilter 可以记录请求的详细信息。 AbstractRequestLoggingFilter 有两个不同的实现类,我们常用的是 CommonsRequestLoggingFilter。 通过 CommonsRequestL…...

计算机毕业设计 基于Python内蒙古旅游景点数据分析系统 Django+Vue 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

centos7 docker部署nacos
1. 一行代码安装git yum -y install git 2. 下载最新版nacos源码: git clone https://github.com/nacos-group/nacos-docker.git 进入nacos-docker文件 cd nacos-docker 3.docker安装数据库Mysql8 按这个来就行,非常好 Docker安装mysql8-超详细、每…...

短视频矩阵源码/短视频矩阵系统搭建/源码开发知识分享
集星云推智剪获客系统,通过自主研发的高效发布模式,为企业提供稳定的接口与自动化操作,助力企业实现短视频矩阵的构建。该系统整合了十大核心功能,包括AI辅助文案撰写、视频剪辑、智能去重、内容拆分、文字转语音、文本提取、批量…...

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程
🤹♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持…...

论文 | Reframing Instructional Prompts to GPTk’s Language
作者:Swaroop Mishra, Daniel Khashabi, Chitta Baral, Yejin Choi, Hannaneh Hajishirzi 论文摘要:语言模型 (LM) 更容易遵循哪些类型的指令提示? 我们通过进行广泛的实证分析来研究这个问题,这些分析阐明了成功指令提示的重要特…...
C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验2】
前序工作 C Qt / VS2019 opencv onnxruntime 部署语义分割模型【经验】 引言 前序工作中介绍了Pytorch模型如何转为ONNX格式,以及在Python中如何使用onnx模型 介绍了如何在VA或QT中配置Onnxruntime运行库 本文重点列出全部源代码及其使用 依赖库 onnxruntime…...
代码随想录算法训练营Day9
232.用栈实现队列 Collection——List——Vector类——Stack类 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackInnew Stack();stackOutnew Stack();} public void push(int x) {stackIn.push(x);}public int pop() {no…...
2025秋招NLP算法面试真题(二十)-有监督微调基本概念
1.基本概念 1.微调方法是啥?如何微调? 微调(Fine-tuning)是一种迁移学习的方法,用于在一个预训练模型的基础上,通过在特定任务的数据上进行有监督训练,来适应该任务的要求并提高模型性能。微调利用了预训练模型在大规模通用数据上学习到的语言知识和表示能力,将其迁移…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...