JVM虚拟机
kobejayandy
十多年互联网产品研发经验,历经华为、腾讯、字节跳动等公司,主要从事后端技术研发及技术管理工作(andyjaykobe)
展开
-
JVM栈
Java中的栈每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这转载 2014-11-27 12:47:43 · 1515 阅读 · 0 评论 -
虚拟机随谈:解释器,树遍历解释器,基于栈与基于寄存器
1、解析器与解释器 解析器是parser,而解释器是interpreter。两者不是同一样东西,不应该混用。 前者是编译器/解释器的重要组成部分,也可以用在IDE之类的地方;其主要作用是进行语法分析,提取出句子的结构。广义来说输入一般是程序的源码,输出一般是语法树(syntax tree,也叫parse tree等)或抽象语法树(abstract syntax tree,A转载 2014-10-05 23:07:01 · 2375 阅读 · 1 评论 -
深入理解JVM内幕
在这篇文件里,我会阐述JVM是如何运行的,包括它的结构,它如何去执行字节码,以及按照怎样的顺序去执行,同时我还会给出一些常见错误的示例以及对应的解决办法。虚拟机(Virtual Machine)JRE是由Java API和JVM组成的。JVM的主要作用是通过Class Loader来加载Java程序,并且按照Java API来执行加载的程序。虚拟机是通过软件的方式来转载 2014-09-27 23:54:52 · 1031 阅读 · 0 评论 -
Java编译期优化与运行期优化技术浅析
Java语言的“编译期”是一段不确定的过程,因为它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端运行期间编译器(JIT)把字节码转变成机器码的过程。下面讨论的编译期优化指的是javac编译器将java文件转化为字节码的过程,而运行期间优化指的是JIT编译器所做的优化。编译期优化虚拟机设计团队把对性能的优化集中到了后端的即时编译器(转载 2014-09-27 22:45:47 · 5969 阅读 · 1 评论 -
从表到里学习JVM实现
在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。 但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入,那么这个豆列就是为您打好基础而准备的。 如果只想用用Java用用JVM,对深入到实现细节无甚兴趣的话,这个豆列就请不必参考了,免得浪费钱浪费时间精力,呵呵 :-) 本豆转载 2014-10-05 23:42:32 · 1449 阅读 · 0 评论 -
Class类文件结构浅析
前言 class文件时java虚拟机执行引擎的数据入口,也是java技术体系的基础支柱之一,了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义。概要: class文件是一组以八位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数转载 2014-09-27 23:22:15 · 2555 阅读 · 0 评论 -
Java虚拟机字节码执行引擎浅析
执行引擎是Java虚拟机的核心组成部分之一。 我们知道,javac编译器完成了程序代码经过词法分析、语法分析到抽象语法树、再遍历语法树生成线性的字节码指令流的过程。而字节码文件再经过加载、验证、准备、解析、初始化等阶段才能被使用。字节码执行引擎正是执行了这样的过程:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。运行时栈帧结构:栈帧(转载 2014-09-27 23:13:15 · 3796 阅读 · 1 评论 -
JVM之整体架构
(一)、Java的优点之一是与平台的无关性,那它是怎么做到的呢?Java语言与平台的无关性是使用Java虚拟机(JVM)是实现这一特点主要原因所在。一般的语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java转载 2014-09-21 23:28:40 · 906 阅读 · 0 评论 -
Linux HotSopt虚拟机GC线程的CPU占用率
下面的问题将会检验你有关Linux系统上的Java程序的垃圾回收和High CPU排错的知识。在过度调用GC或及CPU占用率过高的时候,这种排错技术是至关重要的。假设你没有使用像是Compuware dynaTrace或者JVisualVMware这样先进的监视工具。有关于这些工具的使用教程将会在以后发布,但是请先确保自己掌握了基础的排错原则。问题:在Linux系统运行的时候,转载 2014-05-31 23:34:10 · 892 阅读 · 0 评论 -
Sun Hotspot JVM参数设置调优
对于有2块CPU和2GB内存及更佳配置的服务器,Sun的hotspot jdk默认设置了如下参数:-server :服务器模式编译-XX:+UseParallelGC 并行收集-Xms设置为服务器物理内存的1/64-Xmx设置为服务器物理内存的1/4(最大为1G)堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64转载 2014-06-02 14:58:18 · 1239 阅读 · 0 评论 -
Java轻量级锁原理详解(Lightweight Locking)
首先介绍一下Jetty的反映器模型,Jetty用的经典的NIO异步模型(Scalable IO in Javahttp://gee.cs.oswego.edu/dl/cpjslides/nio.pdf)。连接管理的示意图如下: Jetty在使用这个模型的时候,做了一些改动,acceptor是独立出来的一个阻塞线程,用于阻塞地接受新的连接请求,而所有的连接建立之后,都会想s转载 2014-05-31 23:54:43 · 1178 阅读 · 0 评论 -
深入理解JAVA虚拟机
在 C 语言里面我们想执行一段自己编写的机器指令的方法大概如下:123typedefvoid (*FUNC)(int);char* str = "your code";FUNC f = (FUNC)str;也就是说,我们完全可以做一个工具,从一个文件中读入转载 2014-09-29 00:17:08 · 1174 阅读 · 0 评论 -
Class类文件加载机制
在class文件中描述的各种信息,最终都需要被加载到虚拟机中之后,才能被运行和使用。虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。类加载的时机: 类从被加载到虚拟机内存开始,到卸载出内存为止,其生命周期包括:加载(loading),验证(veri转载 2014-09-27 23:17:06 · 1041 阅读 · 0 评论 -
JVM字节码
栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3转载 2014-11-02 23:52:32 · 940 阅读 · 0 评论 -
JVM字节码指令集简介
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。如果忽略异常处理,那 Java 虚拟机的解释器使用下面这个伪代码的循环即可有效地工作:12345do { 自动计算 PC 寄存器以及从 PC 寄存器的位置取出操作码;转载 2014-11-03 00:02:48 · 3252 阅读 · 0 评论 -
浅析Java虚拟机结构与机制
本文旨在给所有希望了解JVM(Java Virtual Machine)的同学一个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理。当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个计算机体系结构,很多原理和我们平时的硬件、微机原理、操作系统都有十分相似的地方,所以学习JVM本身也是加深自转载 2014-10-15 01:26:58 · 1100 阅读 · 0 评论 -
Java类文件的基本结构
Java类文件(.class文件)是一个为已编译Java程序仔细定义的格式。Java源代码被编译成能够被任何JVM加载和执行的类文件。在被JVM加载之前,类文件可能是由网络传输而来。类文件是独立于底层平台的,所以适用于更多的地方。它们由简洁的JVM字节码组成,这样就能轻装上阵。类文件常常被压缩,以极快的速度通过网络,到达世界各地的JVM。类文件里有什么?Java类文件包含JVM需要转载 2014-09-21 18:02:37 · 761 阅读 · 0 评论 -
JVM字节码初探
字节码格式字节码是JVM的机器语言。JVM加载类文件时,对类中的每个方法,它都会得到一个字节码流。这些字节码流保存在JVM的方法区中。在程序运行过程中,当一个方法被调用时,它的字节码流就会被执行。根据特定JVM设计者的选择,它们可以通过解释的方式,即时编译(Just-in-time compilation)的方式或其他技术的方式被执行。方法的字节码流就是JVM的指令(instructi转载 2014-09-21 22:26:49 · 948 阅读 · 0 评论 -
从JVM看性能分析与设计
Java语言自90年代出现以来,因为它的安全性和跨平台性(即所谓的”Write Once,Run Anywhere”)等特点,深得广大程序员的青睐,但是同时,Java程序的运行效率的低下也是程序员的心病。Java是介于解释型和编译型之间的一种语言,同样的程序,如果用编译型语言C来实现,其运行速度一般要比Java快一倍以上。怎样提高java应用程序的效率是广大程序员关心问题。本文将从与Java字节码转载 2014-09-21 23:55:54 · 1036 阅读 · 0 评论 -
Java字节码运行浅析
明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候到底发生了些什么。理解这点不仅能搞清语言特性是如何实现的,并且在做方案讨论的时候能知道相应的副作用及权衡利弊。本文介绍了Java代码是如何编译成字节码并在JVM上执行的。想了解JVM的内部结构以及字节码运行时用到的各个内存区域,可以看下我前面的一篇关于JVM内部细节的文章。本文分为三部分,每一部转载 2014-09-22 00:01:41 · 1657 阅读 · 0 评论 -
JVM并发机制探讨—内存模型、内存可见性和指令重排序
并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”。从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CPU对共享资源的访问,因此需要了解并发,穷矮搓搞优化需要编写各种多线程的代码来压榨 CPU的计算资源,让它在同一时刻做更多的事情,这个更需要了解并发。在我前一篇关于并发的文章http://my.o转载 2014-09-22 00:55:07 · 948 阅读 · 0 评论 -
Java内存模型浅析
JVM在执行java程序时会将它所管理的内存划分成若干个不同的数据区域。如图所示:其中方法区和堆是所有线程共享的数据区,其他区域则是线程隔离的数据区。这些区域的功能各有不同:程序计数器:可以理解为当前线程所执行的字节码的行号知识器。字节码解释器工作时会通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支,循环,判断,异常处理,线程回复等功能都依赖转载 2014-09-27 23:14:21 · 908 阅读 · 0 评论 -
Linux与JVM的内存关系分析
引言在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示。同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了?转载 2014-10-25 22:20:17 · 3430 阅读 · 0 评论 -
JVM 内部运行线程介绍
最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据。 前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析。 stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率。 现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起。转载 2014-05-21 23:36:42 · 1349 阅读 · 0 评论 -
JVM致命错误日志(hs_err_pid.log)
致命错误出现的时候,JVM生成了hs_err_pid.log这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话JVM会尝试把文件写到/tmp这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如:1转载 2014-05-21 23:15:07 · 1368 阅读 · 0 评论 -
深入理解JVM(三)------内存管理和垃圾回收
JVM内存组成结构JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:1)堆所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:新生代。新建的对象都是用新生代分配内存,转载 2013-07-31 22:31:47 · 816 阅读 · 0 评论 -
深入理解JVM(一)------基本结构
从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的学习,在我看来这么几个部分最重要:Java代码的编译及执行机制 JVM内存管理及垃圾回收机制转载 2013-07-31 22:28:29 · 1037 阅读 · 0 评论 -
JVM中可生成的最大Thread数量
JVM中可以生成的最大线程数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。转载 2013-07-18 00:46:58 · 1056 阅读 · 0 评论 -
JVM specification对JVM内存的描述
首先我们来了解JVM specification中的JVM: 主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎)子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。 Class loader子系统的作用转载 2013-04-13 15:47:05 · 1003 阅读 · 0 评论 -
JVM内存管理及垃圾回收
JVM内存被分成了3个部分:年轻代(Young Generation)年老代(Old Generation)永久代(Permanent Generation)年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命周期短的对象尽量留在年轻带。当eden区申请不到空间的时候,进行mino转载 2013-06-20 22:54:50 · 1232 阅读 · 0 评论 -
实例分析Java Class的文件结构
今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下。学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次编写,到处运行”,其实说到无关性,Java平台还有另外一个无关 性那就是语言无关性,要实现语言无关性,那么Java体系中的class的文件结构或者说是字节码就显得相当重要了,其实Java从刚开始的时转载 2013-04-29 22:39:40 · 1055 阅读 · 0 评论 -
深入JVM系列(二)之GC机制、收集器与GC调优
一、回顾JVM内存分配需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配1.1、内存分配:1、对象优先在EDEN分配2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4、适龄对象也可能进入老年代:动态对象年龄判断动态对象年龄判断:虚拟机并不总是要求对象的年龄必须达到MaxTenuringThresho转载 2013-01-12 18:00:54 · 29760 阅读 · 0 评论 -
深入JVM系列(一)之内存模型与内存分配
一、JVM内存区域划分大多数 JVM 将内存区域划分为 Method Area(Non-Heap),Heap,Program Counter Register, Java Method Stack,Native Method Stack 和Direct Memomry(注意 Directory Memory 并不属于 JVM 管理的内存区域)。前三者一般译为:方法区、堆、程序计数器。但转载 2013-01-12 17:56:56 · 3459 阅读 · 0 评论 -
浅谈SUN JVM内存管理与应用服务器的优化之 服务器内存分配与优化
上篇给大家介绍了SUN JVM的内存管理机制。本篇主要讲解与性能相关的JVM参数,怎样使用工具监控JVM的内存分配使用情况和怎样调整JVM参数让系统在特定硬件配置下达到最优化的性能。通过上篇SUN JVM内存管理机制的介绍,大家都知道了SUN JVM内存分为永久存储区,伊甸园,幸存者0区,幸存者1区和养老区等几个区域。他们的作用以及垃圾回收处理过程在上篇也做了详细介绍。下面我们就来看看和这转载 2013-04-13 16:32:51 · 843 阅读 · 0 评论 -
深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载和连接的过程都是在运行期间完成的。二. 类的加载方式1):本地编译好的class中直接加载2):网络加载:java.net.URLClassLoader可以加载url指定的类3):从jar、zip等等压缩文件转载 2013-01-12 18:02:23 · 1826 阅读 · 1 评论 -
深入理解JVM(二)------Java代码执行机制
Java代码编译是由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成:分析和输入到符号表 注解处理 语义分析和生成class文件转载 2013-07-31 22:30:58 · 988 阅读 · 0 评论 -
JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主转载 2013-08-05 23:18:45 · 837 阅读 · 0 评论 -
成为Java GC专家系列(四)——Apache的MaxClients参数对系统的影响
这是“成为Java GC专家系列文章”的第四篇。在第一篇文章 成为Java GC专家系列(1) ——Java垃圾回收机制 中我们学习了不同GC算法的执行过程,GC如何工作,年轻代及年老代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章 成为Java GC专家系列(2) ——监控Java垃圾回收 中我们学到了JVM到底是如何执行垃圾回收,我们如何监控G转载 2014-05-21 23:29:45 · 946 阅读 · 0 评论 -
成为Java GC专家系列(三) ——如何优化Java垃圾回收
本文是成为Java GC专家系列文章的第三篇。在第一篇《成为Java GC专家系列(1) ——Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是年轻代和年老代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。在第二篇《成为Java GC专家系列(2) ——监控Java垃圾回收》,我解释了JVM实际上是如何执行垃圾回收的,我们如何监控G转载 2014-05-21 23:28:07 · 7412 阅读 · 0 评论 -
成为Java GC专家系列(二)——监控Java垃圾回收
本文是成为Java GC专家系列文章的第二篇。在第一篇《成为Java GC专家系列(1)——Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。在本文中,我将解释JVM到底是如何执行垃圾回收处理的。什么是GC监控?垃圾回收收集监控指的是搞清楚JVM如何执行G转载 2014-05-21 23:27:23 · 1778 阅读 · 0 评论