Java虚拟机一】的更多相关文章

程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点就是线程私有的,它们随着线程的创建而诞生,也因线程的结束而灭亡.栈中的栈帧随着方法的进入和退出会有条不絮的执行着进栈和出栈.每一个栈帧中分配多少内存,基本上是在类结构确认下来的时候就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束…
类加载过程     类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段.在这五个阶段中,加载.验证.准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段…
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机的一些运行机制,那么从这一章节开始,我们将更加深入虚拟机的深处去了解其运行细节了.例如本章节的学习重点是类文件的结构,也就是虚拟机的数据入口.既然是数据入口,肯定得要符合虚拟机的数据定义规范才能给虚拟机处理,否则它压根就不认识你. 概述 在学习之前,先抛出一个比较常见的问题:C语言与Java的运行效…
上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本节的主要内容是讲作者在工作过程中对调优的一些经验实战.对于我们读者来说,重点是学习作者分析解决问题的具体思路.当然不能离开书本的内容,作者利用的是上一节所介绍到的工具去解决他所遇到的问题.但本人的工作环境跟书本上的教程不一致,但思路大同小异.所以在本章的学习笔记当中,还是结合自身的情况,聊聊调优这事…
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念,才能继续往下学习. 本节学习重点 本节主要是针对JVM内存管理机制的一些监控手段,例如堆情况使用的监控,线程栈情况的监控等.有几句废话还是有必要在这里强调的,工具是人类思维的工具,例如Java语言是人类满足需求的一种技术手段,而监控工具只是维护程序应用的一种手段.所以,思考的逻辑思维要清晰,是问题引导工具,…
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms 逃逸分析(DoEscapeAnalysis )的概念——JVM栈上分配实验 JVM中client模式(-client)和server模式(-server)的区别 查看GC日志的方法 使用idea对JVM进行参数输入 Java栈,Java堆和方法区的交互原理 为了能让递归方法调用的次数更多一些,应该怎…
Elasticsearch对Java虚拟机进行了预先的配置.通常情况下,因为这些配置的选择还是很谨慎的,所以你不需要太关心,并且你能立刻使用ElasticSearch. 但是,当你监视ElasticSearch节点内存时,你可能尝试修改一些配置.这些修改是否会改善你的处境? 这篇博文尝试揭开Elasticsearch配置的神秘面纱,并且讨论最常见的调整.最终,会给出一些推荐的配置调整. Elasticsearch JVM 配置概览: 这些是Elasticsearch 0.19.11版本的默认配置…
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习<深入理解java虚拟机-JVM高级特性与最佳实践>这本书,终于初步了解了一下java虚拟机的内存模型.本文通过写出使jvm发生内存溢出异常的代码来对自己的学习结果进行总结,同时也提醒自己以后写代码时候不要再跳进这个坑啦. java的内存管理是由java虚拟机自动进行管理的,并不需要程序员过多的手动干预…
相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的.那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM).JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件.Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行.也就是说,只要在不同平…
简介 对于java开发人员了来说,对java虚拟机肯定有着或多或少的了解.因为有了虚拟机的存在,才会使得java的内存管理变得那么方便,不再像C++那样使用new/delete来直接管理内存.知名的java虚拟机有:Sun Classic/Exact VM(第一款商用虚拟机,已退役).Sun HotSpot VM(最常用).IBM J9 VM.Apache Harmony.Mircrosoft JVM等.了解虚拟机的机制和规则,对大型服务器的管理和开发都具有重要意义. 初步研读总结 如图虚拟机的…
1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行中的虚拟机实例 Java虚拟机抽象规范仅仅是一个概念,在<The Java Virtual Machine Specification>中有详细的描述. 该规范的实现,可能来自多个提供商,并存在于多个平台上,它或者是全部由软件实现,或者是以硬件和软件相结合的方式来实现.JVM的实现有很多,广为使用…
啥也不说了,实战java虚拟机,好好学习,天天向上! <实战java虚拟机>一书Q交流群:397196583…
     1.程序计数器 作用-较小的内存空间,用于存储当前线程所执行的字节码的行号 特性-每条线程有需要一个独立的程序计数器,各线程间互不影响,独立存储,称为"线程私有"的内存      2.Java虚拟机栈-程序员口中的"栈" 作用-描述Java方法执行的内存模型,每个方法执行时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息 存储内容-局部变量表(8种基本数据类型.对象引用(指向对象地址的指针).returnAddress类型(指向一条字节…
最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI Capitan Java环境: java version "1.8.0_92" Java(TM) SE Runtime Environment (build 1.8.0_92-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, m…
说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当List还在胚胎时期时,人们就在思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 虽然目前动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,但只有了其内在,才能让我们写好每一句代码.接下来就以上这三个问题逐一揭晓. 哪些内存…
注:“蓝色加粗字体”为书本原语 先来一张JVM运行时数据区域图,再接下来一一分析各区域功能:   程序计数器 程序计数器(program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域. Java虚拟机栈   虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表.操作数栈.…
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.…
栈:存放局部变量 堆:存放new出来的对象 方法区:存放类的信息,static变量,常量池(字符串常量) 在堆中,可以说是堆的一部分   创建了一个student类,定义了name属性, id静态变量 和一个study()方法程序运行的时候 java虚拟机会通过类加载器 将类的信息加载到虚拟内存中 存放在方法区里相当于一个类的模板 我们通过这个类的模板来创建对象,这个其实很好理解 我们没有定义类 类加载器加载不到类的信息 不能将这个对象实例化更直白一点,如果凭空new一个对象 编译的时候就会报错…
Java 虚拟机工作原理详解 一.类加载器 首先来看一下 java 程序的执行过程. 从这个框图很容易大体上了解 java 程序工作原理.首先,你写好 java 代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassName.java 此时,你的 java 代码就被编译成字节码(.class).如果你是在 Eclipse IDE 或者其他开发工具中,你保存代码的时候,开发工具已经帮你完成了上述的编译工作,因此你可以在对应的目录下看到 class 文件.此时的 class 文件…
Java虚拟机运行时数据区: 相关区域介绍: 程序计数器: 功能:当前线程所执行字节码的行号指示器.若是Java方法记录指令地址,若为Native方法,则不记录 隔离性:线程隔离 Error:无 Java虚拟机栈: 功能:描述Java方法执行的内存区:每个方法执行的同时都会创建一个栈帧,用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 隔离性:线程隔离 Error:线程请求的栈深度大于虚拟机所允许的深度时,抛出 StackOverflowError 异常: 动态扩展时无法申请到足够的内存…
#京东满200—100单# 图书放血大卖了 <实战Java虚拟机>http://item.jd.com/11670385.html 参加京东满200减 100的大促,就在6.1这一天,仅此一天,错过再等一年!!! !!仅此一天,赶紧下单! 作者在群里随时给大家解决问题!!!QQ群397196583…
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” Java虚拟机有3种执行方式,分别是解释执行.混合模式和编译执行,默认情况下处于混合模式中.使用命令行java –version可以查看虚拟机的执行模式: C:\Users\Administrator>java…
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 默认情况下,System.gc()会显式直接触发Full GC,同时对老年代和新生代进行回收.而一般情况下我们认为,垃圾回收应该是自动进行的,无需手工触发.如果过于频繁地触发垃圾回收对系…
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 新生代GC的主要工作是回收eden区和survivor区.一旦eden区被占满,新生代GC就会启动.新生代GC收集前后的堆数据如图5.6所示,其中E表示eden区,S表示survivor区,O表示老年代.可…
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 目前的Java虚拟机支持Client和Server两种运行模式.使用参数-client可以指定使用Client模式,使用参数-server可以指定使用Server模式.默认情况下,虚拟机会根据当前计算机系统…
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译” 下面说说[实战Java虚拟机之一“堆溢出处理”] 在Java程序的运行过程中,如果堆空间不足,则有可能抛出内存溢出错误(Out Of Memory),简称为OOM.如下文字显示了典型的堆内存溢出: Exception in t…
啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深入学习一下子了.    边学习边奉上5篇笔记 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四“禁用System.gc()” 实战Java虚拟机之五“开启JIT编译”  <实战Java虚拟机>一书的…
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域的用途各不相同,同时也依据着各自的执行规则,独立的创建和销毁数据. 虚拟机内存的划分,如图所示: 线程之间互相独立的区域有: 虚拟机栈 .本地方法栈.程序计数器 线程可以共享数据的区域: 方法区 .堆 每个区域的作用分别如下: 程序计数器 Program Counter Register: 众所周知,虚拟机处理多线程时,是通过轮流的切换线程,来获取cpu的执行机会的.在虚拟机执行程序的过程中,当线程执行…
在java虚拟机中并没有规范规定需要对方法区即是新生代进行垃圾回收, 主要是这些区域的回收性价比极低, 一般在新生代中一般垃圾回收中可以达到70%到95%.   其中永久代中的垃圾回收主要回收的是两个部分, 一个部分是废弃的常量,判断一个常量是否废弃, 主要看这个常量在其他地方是否引用了这个字面量. 否则如果此时发生垃圾回收,即会回收这部分常量.   另外一部分是无用的类,判断一个类是否无用,主要看三点, 第一点是这个类的所有实例都被回收了,即是java堆中不存在该类的任何实例, 第二点是加载该…
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及Java API 本篇博客主要介绍“内置于Java虚拟机(及语言)的安全特性”的基本原理:如需了解其它几类安全机制可以通过上面的博客链接进入查看. 简介 jvm装载一个类,并且对字节码进行了四趟扫描,这些字节码就能安全地被执行了.然而去了这些安全校验,jvm在执行字节码时还进行了一些内置的安全机制校验…