Java 对象的创建过程在之前的一篇文章《关于java继承的哪些事》简单讲了Java创建对象的过程,但具体细节当时并没有 细讲。因而本篇文章以HotSpot虚拟机为例,来讲一下Java虚拟机是如何创建一个对象的? 简单来说Java对象的创建过程总共分为5步: Java创建对象的过程 类加载检查 首先当虚拟机遇到一个new指令时,首先会去检查这个参数能否在常量池中定位到这个类的符号引用 并且检查这个符号引用所代表的的类是否已经 被加载、连接、解析和初始化过,如果没有需要先执行 的加载操作(详细过程可参考"类的加载流程" )。 分配内存 当类加载检查通过后,接下来虚拟机需要为新生对象分配内存,为对象分配空间的任务等同于把一块 定大小的内存从 Java 堆中划分出来。分配内存的方式主要有两种:指针碰撞和空闲列表。 具体选择哪种方式取决于Java堆是否规整。而Java堆是否规整取决于垃圾收集器所采用的垃圾回收算 是否具有空间压缩整理的能力。 另一种算法是空闲列表,其分配内存的过程如下: 虚拟机会维护一个列表,该列表中会记录那些内存块是可用的,在分配内存时,会在空闲列表中找到 块足够大的内存块来给对象实例,最后更新列表记录。 当然该算法也有不足,由于需要时刻维护一个空闲列表,因而会增加空间和时间开销,但优点就是它 以用来对离散的空间进行内存分配。 最后在分配内存时,可能也会存在并发安全的问题,为了解决该问题,虚拟机采用两种方式来解决: ● CAS+失败重试:0 码力 | 4 页 | 389.87 KB | 1 年前3
Java 应用与开发 - Java 技术概述及开发环境引入Swing 2000.5 2002.2 2004.10 2006.11 J2SE1.3 J2SE1.4 J2SE1.5 J2SE5.0 JavaSE6.0 支持XML,采用新的虚拟机Hotspot 引入Assert语言特性 增加范型、for-each循环、可变数目参数、注解、自动装箱和拆箱 将Java2重新做回Java,性能、易用性前所未有的提高 Java7 Ora 技术概述 Java 平台核心机制 Java 开发环境 Java 基本开发流程 Java 平台 Java应用程序 Java API Java 虚拟机 操作系统(Windows, Linux, Mac) 硬 件 O 核心概念 ▶ Java 虚拟机 ▶ 垃圾回收机制 ▶ Java 运行时环境(Java Runtime Environment, JRE) 大纲 Java 技术概述 Java THIRDPARTYLICENSEREADME-JAVAFX.txt THIRDPARTYLICENSEREADME.txt bin Java 开发工具,包括编译器、虚拟机、调试器、反编译器等; jre Java 运行时,包括 Java 虚拟机、类库和其他资源文件; lib 类库和所需支持性文件; include 用于调试本地方法(底层平台)的 C++ 头文件; src.zip 类库的源代码;0 码力 | 33 页 | 1.17 MB | 1 年前3
《Java 应用与开发》课程讲义 - 王晓东6.1 Java 内存模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1.1 Java 虚拟机(Java Virtual Machine, JVM) . . . . . . . . . . . . . . 59 6.1.2 JVM 内存模型 . . . . . . . . . . . . 5.1 Java 多态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.1 Java 虚拟机架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.2 JVM 内存模型 . . . . . . . 引入Swing 2000.5 2002.2 2004.10 2006.11 J2SE1.3 J2SE1.4 J2SE1.5 J2SE5.0 JavaSE6.0 支持XML,采用新的虚拟机Hotspot 引入Assert语言特性 增加范型、for-each循环、可变数目参数、注解、自动装箱和拆箱 将Java2重新做回Java,性能、易用性前所未有的提高 Java7 Ora0 码力 | 330 页 | 6.54 MB | 1 年前3
Java 应用与开发 - 异常处理是指程序链接错误。例如,一个类中用到另外一个类,在编译前 一个类之后,后一个类发生了不相容的改变时,再使用前一个类 则会出现链接错误。最常见的就是后一个类的.class 文件被误删 除。 O 虚拟机错误(VirtualMachineError) 当 Java 虚拟机崩溃或资源耗尽时会抛出该错误。其中比较有代 表性的是 StackOverflowError,当应用程序递归太深而导致栈内 存溢出时会出现该异常。 课程配套代码 ± 是指程序链接错误。例如,一个类中用到另外一个类,在编译前 一个类之后,后一个类发生了不相容的改变时,再使用前一个类 则会出现链接错误。最常见的就是后一个类的.class 文件被误删 除。 O 虚拟机错误(VirtualMachineError) 当 Java 虚拟机崩溃或资源耗尽时会抛出该错误。其中比较有代 表性的是 StackOverflowError,当应用程序递归太深而导致栈内 存溢出时会出现该异常。 课程配套代码 ±0 码力 | 33 页 | 626.40 KB | 1 年前3
Linux Docker MessInstallation n 直接格掉Windows,安装一个Linux发行版,如Ubuntu(强烈推荐) n 双系统,Windows和Linux并存(不推荐) n 虚拟机方式安装 n Windows系统中通过虚拟机安装Linux(较推荐) n Linux系统中通过虚拟机安装Windows(Kid me?) http://www.linuxfromscratch.org/ 建议用一个连续的时间(例如你的寒假,或者没人打扰的完整的一周) 而发布到不同的平台上运行。 Docker Why Docker? n 应用环境管理复杂 n 云计算时代的到来 n 虚拟化手段的变化 n LXC的便携性 Docker Docker Container和普通的虚拟机Image相比,最大的区别是它并不包含操作系统内核。 Docker vs. LXC 基本上可以认为目前的Docker是LXC的一个高级封装,提供了各种辅助工具和标准接口 方便使用LXC,你可以依0 码力 | 77 页 | 7.40 MB | 1 年前3
Nacos架构&原理
Nacos 生态 < 148 Nacos 服务网格⽣态 背景 在传统的基于虚拟机的部署方式中,运维人员需要手动上传应用程序压缩包到虚拟机上,经过解压、 安装和运行等⼀系列操作之后才能完成应用发布。除了需要手动部署之外,运维人员还要时刻关注 虚拟机资源分布和容量情况,不同的业务应用需要人工分配并部署在资源充足的虚拟机上。在如今 云原生时代,基础设施平台 Kubernetes 对底层资源 (计算、储存、网络)进行了统⼀抽象,为应 缓存,过期后才会刷新数据。 部分厂商不遵循 TTL 时间缓存,超过 24 小时的缓存时间。 服务器: 服务器开启 nscd 做 DNS 缓存。 业务进程: 应用的 DNS 缓存,比如 Java 虚拟机、框架层的 DNS 缓存。 以上四种情况会比较影响 DNS 的变更生效流程,下图是我们现有的 DNS 变更生效流程: Nacos 最佳实践 < 254 整体上相对简单,只要业务进程这边将自己内部的 生产环境用的是虚拟机,快速还原现场的方法是:直接克隆生产环境 Nacos 所在的机器,用于环境 搭建。然后用带缓存的包,按照操作步骤重现。 复现时 Nacos Server 版本是 1.1.4,而 Nacos Client 端是 1.2.1 版本或者其它大于 1.1.4 的版本。 经过测试开发和运维的操作,成功复现生产环境 Nacos Server 升级失败的场景。 通过快速克隆虚拟机的方式,问0 码力 | 326 页 | 12.83 MB | 9 月前3
Apache Shiro 1.2.x Reference Manual 中文翻译获取的对象进行强制类型转换,这么多强 制转换非常的丑陋、累赘并且会和你的类紧耦合。 SecurityUtils.setSecurityManager 方法会将 SecurityManager 实例化为虚拟机的单独静 态实例,在大多数程序中没有问题,但如果有多个使用 Shiro 的程序在同一个 JVM 中运 行时,各程序有自己独立的实例会更好些,而不是共同引用一块静态内存。 改变配置就需要重新编译你的程序。 Line Hasher Shiro 1.2.0 及以后版本提供了一个命令行程序,可以哈希字符串和资源(文件、url、classpath 、 实体)几乎任何类型。 要使用它,您必须安装一个 Java 虚拟机,并且“Java”命令必须能访问 访问 $PATH 环境变量。 Usage 使用 确保你可以访问shiro-tools-hasher-version-cli.jar 文件。 你可以发现这在 应用开发人员而言,没有太多的通用安全替代方案 - 我们被 Java 认证/授权服务(或称为 JAAS )紧紧套牢了。JAAS 有太多的缺点 - 尽管它的认证功能 尚可忍受,但授权方面却显得拙劣,用起来令人沮丧。此外,JAAS 跟虚拟机层面的安全问题 关系非常紧密,如判断 JVM 中是否允许装入一个类。作为应用开发者,我更关心应用最终用 户能做什么,而不是我的代码在 JVM 中能做什么。 Apache Shiro 1.2.x0 码力 | 196 页 | 2.34 MB | 1 年前3
Java 源码剖析——彻底搞懂Reference 和ReferenceQueue原文链接:https://ld246.com/article/1513083921948 来源网站:链滴 许可协议:署名-相同方式共享 4.0 国际 (CC BY-SA 4.0) 之前博主的一篇读书笔记——《深入理解Java虚拟机》系列之回收对象算法与四种引用类型博客中为 家介绍了Java中的四种引用类型,很多同学都希望能够对引用,还有不同类型引用的原理进行更深入 了解。因此博主查看了抽象父类Reference和负责注册引用0 码力 | 6 页 | 283.24 KB | 1 年前3
Java 应用与开发 - 类加载和反射ClassLoader 基类来创建自己的 类加载器。 ▶ 可以从本地文件系统、jar 包和网络方式加载类的 class 文 件。 ▶ 类加载器通常无须等到“首次使用”该类时才加载此类, Java 虚拟机允许系统预先加载某些类。 大纲 反射 类的加载、连接和初始化 类加载器 使用反射生成并操作对象 本节习题 类的连接 类被加载生成对应的 Class 对象后,进入连接阶段,负责把类的 二进制数据合并到0 码力 | 46 页 | 714.40 KB | 1 年前3
Java 应用与开发 - Java 内存模型与分配机制内存管理建议 ���� Java 内存模型 Java 程序内存运行分析 Java 内存管理建议 大纲 Java 内存模型 Java 程序内存运行分析 Java 内存管理建议 Java 虚拟机(Java Virtual Machine, JVM) ▶ Java 程序运行在 JVM 上,JVM 是程序与操作系统之间的桥梁。 ▶ JVM 实现了 Java 的平台无关性。 ▶ JVM 是内存分配的前提。0 码力 | 44 页 | 818.30 KB | 1 年前3
共 11 条
- 1
- 2













