
JVM
jacljh
程序匠人
展开
-
JDK工具(查看JVM参数、内存使用情况及分析等)
在JDK的bin目录下有很多命令行工具: 我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。命令行工具的好处是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程telnet到服务器上都会受...转载 2019-07-07 17:47:43 · 260 阅读 · 0 评论 -
Java虚拟机1:开篇
1.前言由于后期学习需要用到大量的JVM底层的东西,所有本人调整了一下学习计划,打算先从JVM入手,了解整个JAVA的运行机制,内存模型,编译原理等等一些底层的东西,这样在学习 后面的东西,会有一种豁然开朗的感觉。后期的内容有从网上直接复制粘贴的内容,但是大部分的内容都是经过自己整理后的,我觉得参照别人写的东西,未尝不可。如果是转载的文章,最后我列出转载的地址。虽然我做不了技术的创造者,但是争...转载 2019-01-19 07:07:32 · 282 阅读 · 0 评论 -
JVM虚拟机21: 1.8中废弃永久代(PermGen)迎来元空间(Metaspace)
1.JDK8永久代的废弃JDK8 永久代变化如下图:1.新生代:Eden+From Survivor+To Survivor2.老年代:OldGen3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)2.为什么废弃永久代(PermGen)由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMem...转载 2019-01-21 00:12:54 · 382 阅读 · 0 评论 -
JVM虚拟机20:内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)
1.内存区域划分根据我们之前介绍的垃圾收集算法,限定商用虚拟机基本都采用分代收集算法进行垃圾回收。根据对象的生命周期的不同将内存划分为几块,然后根据各块的特点采用最适当的收集算法。大批对象死去、少量对象存活的,使用复制算法,复制成本低;对象存活率高、没有额外空间进行分配担保的,采用标记-清除算法或者标记-整理算法。从上面的图可以看出, JVM区域总体分两类,heap区和非heap区。...转载 2019-01-21 00:07:38 · 296 阅读 · 0 评论 -
Java虚拟机19:再谈四种引用状态
JVM的四种引用状态在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深。这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下。首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的《深入理解Jav...转载 2019-01-20 23:59:19 · 214 阅读 · 0 评论 -
Java虚拟机18:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节?关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法。不过还好,在JDK1.5之后引入了Instrumentation类,这个类提供了计算对象内存占用量的方法。至于具体Instrumentation类怎么用就不说了,可以参看这篇文章如何精确地测量java对象的大小。不过有一点不同的是,这篇文章使用命令行传入JVM参数来...转载 2019-01-20 23:28:03 · 185 阅读 · 0 评论 -
Java虚拟机17:互斥同步、锁优化及synchronized和volatile
互斥同步互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段。同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区(Critial Section)、互斥量(Mutex)和信号量(Semaphore)都是主要的互斥实现方式。因此,在这...转载 2019-01-20 23:25:45 · 250 阅读 · 0 评论 -
Java虚拟机16:Java内存模型
什么是Java内存模型Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问...转载 2019-01-20 23:23:33 · 185 阅读 · 0 评论 -
Java虚拟机15:运行期优化
前言HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再讲得具体一点而已。当然,其实本文的内容也没多大意义,90%都是概念上的东西,对于实际开发、实际解决项目里面的疑难问题并没有什么太大的帮助,只要看过就好了。编译对象与触发条件之前讲过,Sun使用的虚拟机之所以被叫做"HotSpot",就是因为运行过程中会检测热点代码,那么运行...转载 2019-01-20 23:20:05 · 140 阅读 · 0 评论 -
《深入理解Java内存模型》读书总结
概要文章是《深入理解Java内容模型》读书笔记,该书总共包括了3部分的知识。第1部分,基本概念 包括“并发、同步、主内存、本地内存、重排序、内存屏障、happens before规则、as-if-serial规则、数据依赖性、顺序一致性模型、JMM的含义和意义”。第2部分,同步机制 该部分中就介绍了“同步”的...转载 2019-06-08 11:37:10 · 351 阅读 · 0 评论 -
Java内存模型
ava内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此Jav...转载 2019-08-02 23:22:19 · 232 阅读 · 0 评论 -
Java中高级面试题(2)
JVM的内存结构根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。1、Java虚拟机栈:线程私有;每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等;每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。2、堆:线程共享;被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存...转载 2019-07-30 23:16:16 · 142 阅读 · 0 评论 -
Java学习 —— 并发编程网
并发编程网:http://ifeve.com/原创 2019-07-26 00:04:00 · 209 阅读 · 0 评论 -
JVM面试题
1、你知道哪些或者你们线上使⽤什么GC策略?它有什么优势,适⽤于什么场景?参考 触发JVM进行Full GC的情况及应对策略。https://blog.youkuaiyun.com/chenleixing/article/details/46706039/2、Java类加载器包括⼏种?它们之间的⽗⼦关系是怎么样的?双亲委派机制是什么意思?有什么好处?启动Bootstrap类加载、扩展Ext...转载 2019-08-04 13:04:17 · 231 阅读 · 0 评论 -
Java中高级面试题(4)
这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。BIO、NIO和AIO的区别Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。Ja...转载 2019-07-31 23:13:07 · 179 阅读 · 0 评论 -
Java中高级面试题(6)
对于有一定经验的开发者,在面试过程中多多少少都会被问及jvm相关知识,但是往往在实际开发中涉及较少,这里整理一些知识点做一期面试题库拿出来,希望对有用到朋友有一些参考。小编水平有限,可以把常考题型列出来,但解答部分仅做参考,如果有知识点错误希望能够留言纠正,如果是有更好的参考答案,更加欢迎留言大家探讨,我会置顶,以上这些,下面是正题。Java语言中一个显著的特点就是引入了垃圾回...转载 2019-07-31 23:16:37 · 163 阅读 · 0 评论 -
JVM性能优化(一)JVM技术入门
JVM性能优化(一)JVM技术入门作者 Eva Andreasson 译者:赵峰 校对:方腾飞 原文链接Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化。之后的文章会讲JVM性能优化,包括最新的JVM设计——支持当今高并...转载 2019-09-03 14:01:13 · 231 阅读 · 0 评论 -
JVM 性能优化,第二部分:编译器
JVM 性能优化,第二部分:编译器JVM性能优化,第二部分:编译器—为你的应用程序选择正确的Java编译器原文连接译者:Vitas本文将是JVM 性能优化系列的第二篇文章,Java 编译器将是本文讨论的核心内容。本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比。然后,在文章的最后介绍了几种...转载 2019-09-03 14:38:49 · 214 阅读 · 0 评论 -
Java虚拟机2:Java内存区域
1.几个计算机的概念为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念。1、计算机存储单位从小到大依次为位Bit、字节Byte、千字节KB、兆M、千兆GB、TB,相邻单位之间都是1024倍,1024为2的10次方,即:1Byte= 8bit 1K = 1024Byte 1M = 1024K 1G = 1024M 1T = 1024G2、计...转载 2019-01-19 07:21:43 · 142 阅读 · 0 评论 -
Java虚拟机3:内存溢出
1.前言上一篇我们介绍了java的内存区域结构,这一篇,模拟内存溢出的几个场景,下面一个图是总体的指导思想:2.Java堆溢出Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。所以测试的时候把堆的大小固定住并且让堆不可扩展即可。测试代码如下: 1 package com.xrq.test;...转载 2019-01-19 07:50:21 · 212 阅读 · 0 评论 -
Java虚拟机4:Java对象创建和对象访问
1.对象创建Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。看一下在虚拟机层面上创建对象的步骤:对象的建立过程 图一:对象建立过程1、类加载检查。当JVM检测到有一条new指令时,首先先检查该指令的参数是否在常量池中定位到一个类...转载 2019-01-19 08:08:08 · 206 阅读 · 0 评论 -
JVM, JRE, JDK关系
JVM, JRE, JDK的概念很简单: 再来看下java的一次编译,到处运行: 可见, 到处运行的功臣在于JVM.----------------------------转载:https://blog.youkuaiyun.com/stpeace/article/details/78598614...转载 2018-11-04 10:36:59 · 138 阅读 · 0 评论 -
生产环境的tomcat调优和jvm调化
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你。对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU 的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU 的处理能力越强,系统运行速度越快。Tomcat 的优化不像其它软件那样,简简单单的修改几个参数就可以了,它的优化主要有三方面...转载 2018-11-08 10:41:17 · 172 阅读 · 0 评论 -
Java内存溢出问题总结
使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路堆溢出报错信息java.lang.OutOfMemoryError: Java heap space报错原因堆中(新生代和老年代)无法继续分配对象了; 某些对象的引用长期被持有没有被释放,垃圾回收器无法回收; 使用了大量的 Finalizer 对象,这些对象并不在 GC 的回收周期内。解决办法...转载 2018-11-08 10:05:15 · 176 阅读 · 0 评论 -
java虚拟机内存区域的划分以及作用详解
一、运行时数据区 什么叫运行时数据区呢,看下图就知道了,今天的重点就围绕这张图讲。 1、程序计数器(寄存器) 当前线程所执行的字节码行号指示器 字节码解释器工作依赖计数器控制完成 通过执行线程行号记录,让线程轮流切换各条线程之间计数器...转载 2018-11-06 20:40:29 · 138 阅读 · 0 评论 -
内存泄漏和内存溢出
1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。...转载 2018-11-20 22:09:25 · 237 阅读 · 0 评论 -
JVM查看命令
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程...转载 2018-11-24 12:23:05 · 132 阅读 · 0 评论 -
JDK命令行(jps、jstat、jinfo、jmap、jhat、jstack、jstatd、hprof)与JConsole
很多资料在介绍JDK命令行工具时并不是在Java8环境下,因此还在使用过时的永久区系列的参数,给一些读者造成困难。Java8使用Metaspace(元空间)代替永久区,对于64位平台,为了压缩JVM对象中的_klass指针的大小,引入了类指针压缩空间(Compressed Class Pointer Space) 。关于这点,可以参考博客https://blog.youkuaiyun.com/liang0...转载 2018-12-31 13:21:35 · 308 阅读 · 0 评论 -
Java虚拟机14:类加载器
类与类加载器虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为"类加载器"。类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限定于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每...转载 2019-01-20 12:31:52 · 219 阅读 · 0 评论 -
Java虚拟机13:Java类加载机制
前言我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红)。类使用的7个阶段类从被加载到虚拟机内存中开始,到卸载出内存...转载 2019-01-20 12:10:46 · 156 阅读 · 0 评论 -
Java虚拟机12:虚拟机性能监控与故障处理工具
前言定位系统问题的时候,知识、经验是基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。经常使用适当的虚拟机监控和分析的工具可以加快分析数据、定位解决问题的速度。jps:虚拟机进程状况工具首先约定一下运行的代码都是以下这段 1 public class TestMain 2 { 3 pu...转载 2019-01-20 11:54:52 · 183 阅读 · 0 评论 -
Java虚拟机11:内存分配原则
前言JVM的自动内存管理要自动化的解决两个问题:对象分配内存以及回收分配给对象的内存。对象的内存分配一般是指在堆上分配,少数情况下也可能会直接分配在老年代上,对象主要分配在新生代的Eden 区上,如果启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配。分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数。垃圾收...转载 2019-01-20 11:42:18 · 360 阅读 · 0 评论 -
Java虚拟机10:Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是通过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是我们使用的虚拟机HotSpot名称的由来)。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器叫做即时编译器(Just In T...转载 2019-01-19 15:04:06 · 3055 阅读 · 0 评论 -
Java虚拟机9:垃圾收集(GC)-4(垃圾收集器)
1.前言垃圾收集器是前一章垃圾收集算法理论知识的具体实现了,不同虚拟机所提供的垃圾收集器可能会有很大差别,另外我们必须提前说明一个道理:没有最好的垃圾收集器,更加没有万能的收集器,只能选择对具体应用最合适的收集器。这也是HotSpot为什么要实现这么多收集器的原因,下面我们以HotSpot为例讲解。在写之前,先介绍几个概念。1.1.并行和并发的区别这个区别之前在你专门的一节介绍过,这里...转载 2019-01-19 14:51:19 · 197 阅读 · 0 评论 -
Java虚拟机8:垃圾收集(GC)-3(垃圾收集算法)
1.垃圾对象的判断Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,要先确定这些对象是否还有用,判定对象是否为垃圾对象有如下算法:(1):引用计数算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的。 引用计数算法的实现简单,判定效率也很高,在大部分...转载 2019-01-19 13:02:07 · 223 阅读 · 0 评论 -
Java虚拟机7:垃圾收集(GC)-2(并行和并发的区别)
1.并发编程下这两个名词都是并发编程中的概念,在并发编程的模型下的定义:并发:是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序。 并行:是多个或同时一个cpu上,每个cpu运行一个程序。打个比方,并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。...转载 2019-01-19 12:59:55 · 204 阅读 · 0 评论 -
Java虚拟机6:垃圾收集(GC)-1(内存溢出和内存泄漏的区别)
1.前言在进行垃圾收集之前需要普及几个比较重要的概念。2.内存溢出和内存泄露的概念和区别:(1):内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间可以分配,系统不能满足需求,出现了out of memory;比如申请了一个int,但是它存了long才能存下的数,那就是内存溢出。(2):内存泄露(memory leak):是指程序在申请内存之后,无法释...转载 2019-01-19 08:47:04 · 243 阅读 · 0 评论 -
Java虚拟机5:常用JVM命令参数
这里汇总一些平时用到的、看到的一些虚拟机参数:(1)-Xms20M表示设置堆容量的最小值为20M,必须以M为单位(2)-Xmx20M表示设置堆容量的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免堆自动扩展。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高(3)-verbose:gc表示输出虚拟机中GC的详细情况(4)-Xss128...转载 2019-01-19 08:44:54 · 251 阅读 · 0 评论 -
JVM性能优化(三):垃圾收集
JVM性能优化(三):垃圾收集原文地址,译文地址,译者:GreensterJava平台的垃圾收集机制显著提高了开发者的效率,但是一个实现糟糕的垃圾收集器可能过多地消耗应用程序的资源。在Java虚拟机性能优化系列的第三部分,Eva Andreasson向Java初学者介绍了Java平台的内存模型和垃圾收集机制。她解释了为什么碎片化(而不是垃圾收集)是Java应用程序性能的主要问题所在,以及为...转载 2019-09-04 11:42:43 · 250 阅读 · 0 评论