![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java虚拟机
yangxi_001
这个作者很懒,什么都没留下…
展开
-
《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭;栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性。垃圾回收重点关注的是堆和方法区部分的内存。常用的垃圾回收算法有:(1).引用计数算法:给对象中添加一个引用计数器转载 2013-12-04 15:32:46 · 725 阅读 · 0 评论 -
编写你的第一个垃圾收集器
本文由 伯乐在线 - deathmonkey 翻译自 Bob Nystrom。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。伯乐在线补充:本文作者 Bob Nystrom 是 Google Dart 团队的一名工程师,所以下文中”处理一些工作上的事情“中的链接是指向了 Dart 官网。Bob 之前(曾在 EA 公司)做过游戏开发,UI 设计。更多信息,请看他的简历。转载 2013-12-23 03:17:43 · 584 阅读 · 0 评论 -
【深入Java虚拟机】之二:Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各转载 2014-01-14 14:17:00 · 595 阅读 · 0 评论 -
【深入Java虚拟机】之一:Java内存区域与内存溢出
内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。 程序计数器(Program Counter Register)转载 2014-01-14 14:16:18 · 611 阅读 · 0 评论 -
【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给Java带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。这在前面的“Java内存转载 2014-01-14 14:18:58 · 611 阅读 · 0 评论 -
【深入Java虚拟机】之三:类初始化
类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静转载 2014-01-14 14:17:54 · 547 阅读 · 0 评论 -
【深入Java虚拟机】之四:类加载机制
类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为转载 2014-01-14 14:18:27 · 530 阅读 · 0 评论 -
【深入Java虚拟机】之六:Java语法糖
语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。Java中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。虚拟机并不支持这些语法,它们在编译阶段就被还原回了简单的基础语法结构,这个过程成为解语法糖。 泛转载 2014-01-14 14:19:26 · 555 阅读 · 0 评论 -
Java二进制Class文件格式解析
一、Java Class文件是什么 《The JavaTM Virtual Machine Specification》(Second Edtion)中有表述:Java Class文件由8位字节流组成,所有的16位、32位和64位数据分别通过读入2个、4个和8个字节来构造,多字节数据总是按照Big-endian顺序来存放,即高位字节在前(放在低地址)。每个Class文件都包含且仅包含一个转载 2014-04-03 18:44:54 · 785 阅读 · 0 评论 -
Java类加载原理解析
1 基本信息摘要:每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和jav转载 2016-01-12 18:51:10 · 448 阅读 · 0 评论 -
Dalvik和ART的区别
什么是Dalvik: Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经转载 2016-01-12 18:58:04 · 1409 阅读 · 0 评论 -
Dalvik和ART运行时环境的区别
在此,我并没有打算深入的学习Dalvik和ART两种方式的实现原理,只是想知道他俩的区别。之前,也是零零散散的看过,并没有总结成文字。在此,总结下。Dalvik以下内容来自wikipediaDalvik虚拟机,是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行转载 2016-12-01 18:22:36 · 747 阅读 · 0 评论 -
Java instanceof 关键字是如何实现的?
在进入正题前先得提一句:既然楼主提问的背景是“被面试问到”,那很重要的一点是揣摩面试官提问的意图。按照楼主的简单描述,面试官问的是“Java的instanceof关键字是如何实现的”,那要选择怎样的答案就得看面试官有怎样的背景。比较安全的应对方法是请求面试官澄清/细化他的问题——他想要的“底层”底到什么程度。-----------------------------------------转载 2013-12-20 14:43:33 · 1900 阅读 · 1 评论 -
栈帧
首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图出栈操作:pop eax; 等价于 [esp]->eax,e转载 2013-12-05 20:08:32 · 686 阅读 · 0 评论 -
JAVA虚拟机体系结构
JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。 Java虚拟机实例通过调用某个初始类的main()方法来运行转载 2013-12-05 18:17:09 · 627 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记6——类加载机制
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程。在加载阶段,java虚拟机需要完成以下3件事:a.通过一个类的全限定名来获取定义此类的二进制字节流。b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的运行时数据结构。c.在java堆中生成一个代表该转载 2013-12-04 15:34:44 · 649 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记7——Java虚拟机类生命周期
C/C++等纯编译语言从源码到最终执行一般要经历:编译、连接和运行三个阶段,连接是在编译期间完成,而java在编译期间仅仅是将源码编译为Java虚拟机可以识别的字节码Class类文件,Java虚拟机对中Class类文件的加载、连接都在运行时执行,虽然类加载和连接会占用程序的执行时间增加性能开销,但是却可以为java语言带来高度灵活性和扩展性,java的针对接口编程和类加载器机制实现的OSGi以及热转载 2013-12-04 15:35:21 · 685 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记2——Java内存溢出实例
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况:(1).java堆溢出:Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收实例对象,就会在对象数量达到堆最大容量时产生OutOfMemoryError异常。想要方便快速地产生堆溢出,要使用如下java虚拟机参数:-Xms10m(最小堆内存为10MB),-转载 2013-12-04 15:31:46 · 572 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记8——Tomcat类加载器体系结构
Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的类加载器:(1).部署在同一个服务器上的两个web应用程序所使用的java类库可以相互隔离。(2).部署在同一个服务器上的两个web应用程序所使用的java类库可以相互共享。(3).许多Web服务器本身使用java语言实现,因此服务器所使用的类库应与应用程序的类库相互独立。(4).支持J转载 2013-12-04 15:36:05 · 697 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记9——并发编程(一)
随着多核CPU的高速发展,为了充分利用硬件的计算资源,操作系统的并发多任务功能正变得越来越重要,但是CPU在进行计算时,还需要从内存读取输出,并将计算结果存放到内存中,然而由于CPU的运算速度比内存高几个数量级,CPU内的寄存器数量和容量有限,为了不让CPU长时间处于等待内存的空闲状态,在CPU和内存之间引入了速度接近CPU的高速缓存Cache作为CPU和内存之间的缓冲。计算机硬件并发的原理如下:转载 2013-12-04 15:36:33 · 724 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记10——并发编程(二)
Java的并发编程是依赖虚拟机内存模型的三个特性实现的:(1).原子性(Atomicity):原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的。Java内存模型中通过read、load、assign、use、store和write这6个操作保证变量的原子性操作。long和double这两个64位长度的数据类型jav转载 2013-12-04 15:36:58 · 671 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记5——Java Class类文件结构
Java语言从诞生之时就宣称一次编写,到处运行的跨平台特性,其实现原理是源码文件并没有直接编译成机器指令,而是编译成Java虚拟机可以识别和运行的字节码文件(Class类文件,*.class),字节码文件是一种平台无关的中间编译结果,字节码文件由java虚拟机读取,解析和执行,java虚拟机屏蔽了不同操作系统和硬件平台的差异性。如今的java虚拟机已经称为一种通用平台,不但能够运行java转载 2013-12-04 15:34:24 · 540 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记1——Java内存结构
java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下:其中方法区和堆是由所有线程共享的数据区。Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区。(1).程序计数器:是一块较小的内存空间,其作用可以看作是当前线程所执行的字节码的行号指示器,字节码解析器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令。程转载 2013-12-04 15:30:20 · 629 阅读 · 0 评论 -
《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK1.6中Sun HotSpot虚拟机的垃圾收集器如下:图中如果两个垃圾收集器直接有连线,则表明这两个垃圾收集器可以搭配使用。(1).Serial垃圾收集器:Serial转载 2013-12-04 15:33:17 · 559 阅读 · 0 评论 -
Android View 可视控件的继承关系
Android View 可视控件的继承关系,由于版面原因我刚才看了下,好像不能全部显示特意调整转载 2013-12-04 19:44:28 · 1185 阅读 · 0 评论 -
对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指转载 2013-12-05 18:47:48 · 682 阅读 · 0 评论