![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM 虚拟机
猴哥_IT小菜鸟
三分天注定七分靠打拼 爱拼才会赢
展开
-
虚拟机随谈:解释器,树遍历解释器,基于栈与基于寄存器
1、解析器与解释器 解析器是parser,而解释器是interpreter。两者不是同一样东西,不应该混用。 前者是编译器/解释器的重要组成部分,也可以用在IDE之类的地方;其主要作用是进行语法分析,提取出句子的结构。广义来说输入一般是程序的源码,输出一般是语法树(syntax tree,也叫parse tree等)或抽象语法树(abstract syntax tree,AST)。进一步剥开来,转载 2017-01-23 17:45:51 · 663 阅读 · 0 评论 -
实例分析Java Class的文件结构
今天把之前在Evernote中的笔记重新整理了一下,发上来供对Java class 文件结构的有兴趣的同学参考一下。 学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一个无关 性那就是语言无关性,要实现语言无关性,那么Java体系中的class的文件结构或者说是字节码就显得相当重要了,其实Java从刚开始的时候就转载 2017-02-06 17:59:48 · 210 阅读 · 0 评论 -
JVM内存管理及垃圾回收
JVM内存被分成了3个部分:年轻代(Young Generation) 年老代(Old Generation) 永久代(Permanent Generation) 年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命周期短的对象尽量留在年轻带。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到s转载 2017-02-06 17:59:14 · 143 阅读 · 0 评论 -
JVM中可生成的最大Thread数量
JVM中可以生成的最大线程数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。转载 2017-02-06 17:58:36 · 193 阅读 · 0 评论 -
深入理解JVM(一)------基本结构
从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别 对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的学习,在我看来这么几个部分最重要:Java代码的编译及执行机制 JVM内存管理及垃圾回收机制转载 2017-02-06 17:57:24 · 192 阅读 · 0 评论 -
深入理解JVM(二)------Java代码执行机制
Java代码编译是由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成:分析和输入到符号表 注解处理 语义分析和生成class文件 流程图如下所示:最后生成的class文件由以转载 2017-02-06 17:56:56 · 194 阅读 · 0 评论 -
深入理解JVM(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示: 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,转载 2017-02-06 17:56:21 · 197 阅读 · 0 评论 -
JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是转载 2017-02-06 17:55:45 · 170 阅读 · 0 评论 -
Tomcat ClassLoader工作原理
ContextClassLoader工作原理 每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类 系统默认的contextClassLoader是systemClassLoader,所以一般而言Java程序在执行时可以使用JVM自带的类、JAVAHOME/jre/lib/ext/</span><spanstyle="color:black;backgrou转载 2017-02-06 17:55:14 · 342 阅读 · 0 评论 -
JVM内存管理
Java不需要开发人员来显式的分配内存和回收内存,而是由JVM来自动管理内存的分配以及回收(又称为垃圾回收、Garbage Collection或GC),这对于开发人员来说确实大大降低了编写程序的难度,但带来的副作用是可能在不知不觉中浪费了很多内存,造成JVM花费很多的时间在进行内存的回收;另外可能会带来的副作用是由于不清楚JVM内存的分配和回收机制,造成内存泄露,最终导致JVM内存不够用。 除了内转载 2017-02-06 17:54:26 · 160 阅读 · 0 评论 -
浅谈SUN JVM内存管理与应用服务器的优化之 服务器内存分配与优化
上篇给大家介绍了SUN JVM的内存管理机制。本篇主要讲解与性能相关的JVM参数,怎样使用工具监控JVM的内存分配使用情况和怎样调整JVM参数让系统在特定硬件配置下达到最优化的性能。通过上篇SUN JVM内存管理机制的介绍,大家都知道了SUN JVM内存分为永久存储区,伊甸园,幸存者0区,幸存者1区和养老区等几个区域。他们的作用以及垃圾回收处理过程在上篇也做了详细介绍。下面我们就来看看和这些内存分区转载 2017-02-06 18:01:08 · 226 阅读 · 0 评论 -
浅谈SUN JVM内存管理与应用服务器的优化 之SUN JVM内存管理
名词解释: JVM(Java Virtual Machine):Java虚拟机,所有的Java程序都在Java虚拟机中运行。 元数据:在本文中指用于描述类和接口定义的数据。 在我做J2EE系统开发的工作生涯中,经常遇到技术人员或客户发出诸如此类的感慨:我的J2EE应用系统处理的数据量不大,系统体积也不大,技术架构也没有问题,我的应用服务器的内存有4G或8G;系统运行起来很慢,还经常出现内存溢出错转载 2017-02-06 18:01:42 · 215 阅读 · 0 评论 -
JVM specification对JVM内存的描述
首先我们来了解JVM specification中的JVM: 主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎)子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。 Class loader子系统的作用 :根据给定的全限定名类名(如 J转载 2017-02-06 18:02:24 · 202 阅读 · 0 评论 -
从表到里学习JVM实现
在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。 但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入,那么这个豆列就是为您打好基础而准备的。 如果只想用用Java用用JVM,对深入到实现细节无甚兴趣的话,这个豆列就请不必参考了,免得浪费钱浪费时间精力,呵呵 :-) 1. JVM与Ja转载 2017-01-23 17:45:16 · 249 阅读 · 0 评论 -
浅析Java虚拟机结构与机制
本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理。当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件、微机原理、操作系统都有十分相似的地方,所以学习JVM本身也是加深自我转载 2017-01-23 17:44:30 · 226 阅读 · 0 评论 -
Linux与JVM的内存关系分析
———-引言在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示。同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析转载 2017-01-23 17:43:58 · 164 阅读 · 0 评论 -
JVM字节码
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入转载 2017-01-23 17:43:08 · 220 阅读 · 0 评论 -
JVM字节码指令集简介
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。 如果忽略异常处理,那 Java 虚拟机的解释器使用下面这个伪代码的循环即可有效地工作:do{ 自动计算PC寄存器以及从PC寄存器的位置取出操作码; if(存在操作数)取出操作数; 执行转载 2017-01-23 17:42:01 · 389 阅读 · 0 评论 -
JVM栈
Java中的栈 每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。 每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来转载 2017-01-23 17:41:06 · 222 阅读 · 0 评论 -
深入JVM系列(一)之内存模型与内存分配
一、JVM内存区域划分 大多数 JVM 将内存区域划分为 Method Area(Non-Heap),Heap,Program Counter Register, Java Method Stack,Native Method Stack 和Direct Memomry(注意 Directory Memory 并不属于 JVM 管理的内存区域)。前三者一般译为:方法区、堆、程序计数器。但不同的资料转载 2017-02-06 18:04:27 · 542 阅读 · 1 评论 -
深入JVM系列(二)之GC机制、收集器与GC调优
一、回顾JVM内存分配 需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配1.1、内存分配: 1、对象优先在EDEN分配 2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4、适龄对象也可能进入老年代:动态对象年龄判断 动态对象年龄判断: 虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,当Survivor空间的相转载 2017-02-06 18:03:59 · 330 阅读 · 0 评论 -
深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类加载和连接的过程都是在运行期间完成的。 二. 类的加载方式 1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩文件加载类,自动解析jar文件找到cla转载 2017-02-06 18:03:19 · 442 阅读 · 0 评论 -
Java对象内存结构
学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C++中的这个操作符对于指针运算、内存拷贝和IO操作都非常有用。Java中并没有一个类似的运算符。事实上,Java也不需要这种运算符。Java中基本类型的大小在语言规范中已经定义了,而C/C++中基本类型大小则跟平台相关。Java有自己的通转载 2017-02-06 17:53:57 · 215 阅读 · 0 评论 -
Java深度历险(一)——Java字节代码的操纵
【编者按】Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于Java语言的深度理解和运用,毕竟是很少会有人涉及的话题。InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个《Java深度历险》专栏,旨在就Java的一些深度和高级特性分享他的经验。 在一般的Java应用开发过程中,开发人员使用Jav转载 2017-02-06 17:53:17 · 182 阅读 · 0 评论 -
Java深度历险(二)——Java类的加载、链接和初始化
在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行。本文接着上一篇的话题,讨论Java类的加载、链接和初始化。Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象。一个Java类从字节代码到能够在JVM中被使用,需要经过加载、链接和初始化这三个步骤。这三个步骤中,转载 2017-02-06 17:52:43 · 170 阅读 · 0 评论 -
从JVM看性能分析与设计
Java语言自90年代出现以来,因为它的安全性和跨平台性(即所谓的”Write Once,Run Anywhere”)等特点,深得广大程序员的青睐,但是同时,Java程序的运行效率的低下也是程序员的心病。Java是介于解释型和编译型之间的一种语言,同样的程序,如果用编译型语言C来实现,其运行速度一般要比Java快一倍以上。怎样提高java应用程序的效率是广大程序员关心问题。本文将从与Java字节码的转载 2017-02-06 16:52:24 · 330 阅读 · 0 评论 -
Java字节码运行浅析
明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候到底发生了些什么。理解这点不仅能搞清语言特性是如何实现的,并且在做方案讨论的时候能知道相应的副作用及权衡利弊。本文介绍了Java代码是如何编译成字节码并在JVM上执行的。想了解JVM的内部结构以及字节码运行时用到的各个内存区域,可以看下我前面的一篇关于JVM内部细节的文章。本文分为三部分,每一部分都分成几个小节。转载 2017-02-06 16:51:44 · 384 阅读 · 0 评论 -
JVM并发机制探讨—内存模型、内存可见性和指令重排序
并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”。从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CPU对共享资源的访问,因此需要了解并发,穷矮搓搞优化需要编写各种多线程的代码来压榨 CPU的计算资源,让它在同一时刻做更多的事情,这个更需要了解并发。在我前一篇关于并发的文章http://my.oschin转载 2017-02-06 16:50:55 · 199 阅读 · 0 评论 -
Java编译期优化与运行期优化技术浅析
Java语言的“编译期”是一段不确定的过程,因为它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端运行期间编译器(JIT)把字节码转变成机器码的过程。下面讨论的编译期优化指的是javac编译器将java文件转化为字节码的过程,而运行期间优化指的是JIT编译器所做的优化。编译期优化虚拟机设计团队把对性能的优化集中到了后端的即时编译器(JIT)中,这样可以让那些转载 2017-02-06 16:50:22 · 243 阅读 · 0 评论 -
Java虚拟机字节码执行引擎浅析
执行引擎是Java虚拟机的核心组成部分之一。 我们知道,javac编译器完成了程序代码经过词法分析、语法分析到抽象语法树、再遍历语法树生成线性的字节码指令流的过程。而字节码文件再经过加载、验证、准备、解析、初始化等阶段才能被使用。字节码执行引擎正是执行了这样的过程:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。运行时栈帧结构:栈帧(stack frame)是用于支持虚拟转载 2017-02-06 16:49:49 · 163 阅读 · 0 评论 -
Java内存模型浅析
JVM在执行Java程序时会将它所管理的内存划分成若干个不同的数据区域。如图所示: 其中方法区和堆是所有线程共享的数据区,其他区域则是线程隔离的数据区。这些区域的功能各有不同:程序计数器:可以理解为当前线程所执行的字节码的行号知识器。字节码解释器工作时会通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支,循环,判断,异常处理,线程回复等功能都依赖这个计数器。每个线程都有自己独立的程序计数器转载 2017-02-06 16:49:12 · 159 阅读 · 0 评论 -
Class类文件加载机制
在class文件中描述的各种信息,最终都需要被加载到虚拟机中之后,才能被运行和使用。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。类加载的时机: 类从被加载到虚拟机内存开始,到卸载出内存为止,其生命周期包括:加载(loading),验证(verification),准备(preparatio转载 2017-02-06 16:48:37 · 248 阅读 · 0 评论 -
Class类文件结构浅析
前言 class文件时java虚拟机执行引擎的数据入口,也是java技术体系的基础支柱之一,了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义。概要: class文件是一组以八位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当转载 2017-02-06 16:47:30 · 158 阅读 · 0 评论 -
深入理解JVM内幕
在这篇文件里,我会阐述JVM是如何运行的,包括它的结构,它如何去执行字节码,以及按照怎样的顺序去执行,同时我还会给出一些常见错误的示例以及对应的解决办法。虚拟机(Virtual Machine)JRE是由Java API和JVM组成的。JVM的主要作用是通过Class Loader来加载Java程序,并且按照Java API来执行加载的程序。虚拟机是通过软件的方式来模拟实现的机器(比如说计算机),它转载 2017-02-06 16:46:35 · 181 阅读 · 0 评论 -
JVM之整体架构
(一)、Java的优点之一是与平台的无关性,那它是怎么做到的呢? Java语言与平台的无关性是使用Java虚拟机(JVM)是实现这一特点主要原因所在。 一般的语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机转载 2017-02-06 16:52:55 · 165 阅读 · 0 评论 -
JVM字节码初探
字节码格式 字节码是JVM的机器语言。JVM加载类文件时,对类中的每个方法,它都会得到一个字节码流。这些字节码流保存在JVM的方法区中。在程序运行过程中,当一个方法被调用时,它的字节码流就会被执行。根据特定JVM设计者的选择,它们可以通过解释的方式,即时编译(Just-in-time compilation)的方式或其他技术的方式被执行。方法的字节码流就是JVM的指令(instruction)序列。转载 2017-02-06 17:44:05 · 212 阅读 · 0 评论 -
Java类文件的基本结构
Java类文件(.class文件)是一个为已编译Java程序仔细定义的格式。Java源代码被编译成能够被任何JVM加载和执行的类文件。在被JVM加载之前,类文件可能是由网络传输而来。类文件是独立于底层平台的,所以适用于更多的地方。它们由简洁的JVM字节码组成,这样就能轻装上阵。类文件常常被压缩,以极快的速度通过网络,到达世界各地的JVM。 类文件里有什么? Java类文件包含JVM需要知道的关于一个转载 2017-02-06 17:44:55 · 194 阅读 · 0 评论 -
JVM致命错误日志(hs_err_pid.log)
JVM致命错误出现的时候,JVM生成了hs_err_pid<pid>.log这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话JVM会尝试把文件写到/tmp这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如: java -XX:Err转载 2017-02-06 17:52:14 · 2026 阅读 · 0 评论 -
成为Java GC专家系列(一) ——Java垃圾回收机制
对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用。这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者。如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验。如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点。当然,我们不转载 2017-02-06 17:51:44 · 176 阅读 · 0 评论 -
成为Java GC专家系列(二)——监控Java垃圾回收
本文是成为Java GC专家系列文章的第二篇。在第一篇《成为Java GC专家系列(1)——Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。在本文中,我将解释JVM到底是如何执行垃圾回收处理的。什么是GC监控?垃圾回收收集监控指的是搞清楚JVM如何执行GC的过程,例如,我们可以查转载 2017-02-06 17:51:12 · 214 阅读 · 0 评论