
JVM
文章平均质量分 91
zero__007
这个作者很懒,什么都没留下…
展开
-
Spring Gateway下的GC停顿排查之旅
查看容器实例,发现的确会打印出大量的日志文件,几乎一个小时就有十几个文件,在查看下logback的配置xml,发现目前的配置是每100M一个文件,所以会产生很多FileOutputStream是可以解释的。特别是,我们的容器配置是2核4G的低配实例,即使开启了并行处理,也只是多了一个线程,减少耗时的程度有限,只能缓解问题,但并未根治。在通过对比前后两星期的dump文件发现,随着程序的运行,越来越多的FileOutputStream出现,而这些都是用来打日志的,并且都是同名的日志文件出现了几千次。转载 2024-05-25 11:10:39 · 275 阅读 · 0 评论 -
Java 逃逸分析
关于 Java 逃逸分析的定义:逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配内存的一项技术。开启逃逸分析:-XX:+DoEscapeAnalysis关闭逃逸分析:-XX:-DoEscapeAnalysis显示分析结果:-XX:+PrintEscapeAnalysis逃逸分析技术在 Java SE 6u23+ 开始支持,并默认设置为启用状态,可以不用额外加这个参数。转载 2024-05-22 14:54:08 · 161 阅读 · 0 评论 -
JVM stop the world
转载自:https://zhuanlan.zhihu.com/p/91937583。转载 2024-01-09 23:00:00 · 146 阅读 · 0 评论 -
JVM三色标记
转载自:https://mp.weixin.qq.com/s/01V4wDOmlodnR4mLpZrm8A三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。JVM中的CMS、G1垃圾回收器所使用垃圾回收算法即为三色标记法。三色标记算法思想三色标记法将对象的颜色分为了黑、灰、白,三种颜色。白色:该对象没有被标记过。(对象垃圾)灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾转载 2021-10-14 13:49:40 · 174 阅读 · 0 评论 -
三色标记
转载自:https://www.jianshu.com/u/b5a7e092f589文章目录1. 垃圾回收的简单回顾2. 三色标记法2.1 基本算法2.2 多标-浮动垃圾2.3 漏标-读写屏障2.3.1 写屏障(Store Barrier)(1) 写屏障 + SATB(2) 写屏障 + 增量更新2.3.2 读屏障(Load Barrier)2.4 三色标记法与现代垃圾回收器 1. 垃圾回收的简单回顾关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生转载 2021-03-15 15:41:20 · 176 阅读 · 0 评论 -
JDK9 GC参数
转载自:https://zhuanlan.zhihu.com/p/159265336今天我们讲讲JDK9中的JVM GC调优参数,JDK9中JVM的参数总共有2142个,其中正式的参数有659个。好像比JDK8中的参数要少一点。为了方便大家的参考,特意将JDK9中的GC参数总结成了一张PDF,这个PDF比之前总结的JDK8的PDF在排版,颜色和内容准确性上面又有了非常大的提升,欢迎大家下载。Oracle中的文档今天这篇文章的内容都是从Oracle JDK9的官方文档中提炼出来的。对于里面的内容的真实转载 2020-08-29 23:05:33 · 632 阅读 · 0 评论 -
Java虚拟机指令dup
转载自:https://blog.csdn.net/Gabriel576282253/article/details/98968241dup指令的作用:dup指令可以复制操作数栈栈顶的一个字,再将这个字压入栈。也就是对栈顶的内容做了个拷贝,此时操作数栈上有连续相同的两个对象地址。JAVA是基于栈的实现,任何操作都是入栈出栈,没有任何寄存器,所以如果要对某一操作数做两次连续操作,那就要复制两次栈顶操作数,比如: public void test() { int x;转载 2020-08-14 15:51:18 · 440 阅读 · 0 评论 -
Java类的生命周期
编写一个java的源文件后,经过编译会生成一个后缀名为class的字节码文件,只有这种字节码文件才能够在Java虚拟机中运行,Java类的生命周期就是指一个class文件从加载到卸载的全过程。 一个Java类的完整的生命周期会经历加载、链接、初始化、使用、卸载五个阶段,当然也有在加载或者链接之后没有被初始化就直接被使用的情况。加载 类的加载是指把类的.cla原创 2015-07-18 12:06:11 · 577 阅读 · 0 评论 -
JVM性能监控工具jstat、jps、jstack、jmap、jhat
jps是可以查看当前Java进程。 命令格式:jps [options ] [ hostid ] [options]选项 : -q:仅输出java进程号 -m:输出传递给Java进程(主函数)的参数 -l:输出主函数的完整路径 -v:输出jvm启动参数 jinfo查看正在运行的Java进程的扩展参数。 命令格式:jinfo <option> <pid> 例如:原创 2016-11-24 20:15:26 · 806 阅读 · 0 评论 -
单个JVM下支撑100w线程数
转载自: http://blog.csdn.net/xiaolang85/article/details/74322277 http://blog.csdn.net/tiger0709/article/details/74296720 http://jzhihui.iteye.com/blog/1271122I、创建的线程数的计算公式:(MaxProcessMemory - JVMMemory转载 2017-09-18 18:29:01 · 771 阅读 · 0 评论 -
方法区
在JVM实例中,对装载的类型信息是存储在一个逻辑方法内存区中,当Java虚拟机加载了一个类的时候,它会跟着这个Class的类型去路径里面查找对应的class文件,类加载器读取这个class文件(线性二进制数据),然后将该文件传递给Java虚拟机,JVM从二进制数据中提取信息并且将这些信息存储在方法区,而类中声明(静态)变量就是来自于方法区中存储的信息。 JVM虚拟机将搜索和使用类型原创 2016-04-02 14:31:02 · 3386 阅读 · 0 评论 -
关键业务系统的JVM参数推荐
转载自:http://calvin1978.blogcn.com/articles/jvmoption-7.html性能篇1. 取消偏向锁 -XX:-UseBiasedLocking JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它的线程,取消同步块上的synchronized原语。如果始终只有一条线程在访问它,就成功略过同步操作以获得性能提升。 但一旦有第二条线程访问这把...转载 2018-11-25 10:35:43 · 958 阅读 · 0 评论 -
为什么新生代需要有两个Survivor区
转载自:http://blog.csdn.net/antony9118/article/details/514255811.为什么要有Survivor区 首先思考设置Survivor区的意义在哪里? 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(也可以看做触发了Full GC)。老年代的内存空间远大于新...转载 2018-12-19 20:32:21 · 672 阅读 · 0 评论 -
Eclipse Memory Analyzer使用
Eclipse Memory Analyzer是Eclipse提供的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助查找java进程dump后的文件。下载:https://www.eclipse.org/mat/downloads.phpMac中打开会报错,参看提示的错误log有如下内容:…java.lang.IllegalStateException: Th...原创 2018-12-21 22:32:43 · 651 阅读 · 0 评论 -
Java8 Metaspace调优
转载自:https://blog.csdn.net/bolg_hero/article/details/78189621 由于服务器在运行一段时间后出现fullgc,最终定位到是由于metaspace引起fullgc,不断的fullgc又占用大量cpu导致程序最终不可用。查看JVM配置-Xms1000m -Xmx1000m -XX:MaxNewSize=256m -XX:ThreadSta...转载 2019-01-03 21:46:23 · 6982 阅读 · 3 评论 -
gc日志相关参数
转载自:http://blog.csdn.net/wisgood/article/details/724857081.-verbose:gc这个参数会输出虚拟机中GC的情况.使用后输出如下:[Full GC 168K->97K(1984K), 0.0253873 secs] 箭头前后的数据168K和97K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有168K-97K=7...转载 2019-02-01 10:43:28 · 656 阅读 · 0 评论 -
查看JAVA进程占用内存
使用ps查看JAVA进程使用的内存和虚拟内存( Linux内存管理 ):$ ps -p ${pid} -o rss,vsz RSS VSZ7152568 17485844VSZ是虚拟内存,RSS是实际使用的内存,单位KB。你会发现,RSS会远远超过了-Xmx的设定。为什么呢?首先要搞清楚JVM的内存机制: JVM内存区域总体分两类,heap区 和 非heap 区(本地内存) ...原创 2019-04-10 21:57:33 · 22427 阅读 · 0 评论 -
Java虚拟机启动、加载类过程分析
转载自:https://blog.csdn.net/luanlouis/article/details/50529868 首先定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程。package org.luanlouis.jvm.load;import sun.security.pkcs11.P11Util;/** * Created by louis ...转载 2019-08-25 11:47:25 · 796 阅读 · 0 评论 -
对象的创建过程
虚拟机遇到一条new指令时,首先去常量池中寻找有没有这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有则会先执行相应的类加载过程,在通过检查后,虚拟机为该新生对象分配内存。。 对象所需内存的大小在类加载完成后便能完全确定,简单来说为对象分配空间就是把一块确定大小的内存从Java堆中划分出来。至于如何划分空间,暂不深入讨论,但是需要引起注意的是多线程频繁原创 2016-09-22 21:36:34 · 389 阅读 · 0 评论 -
如何防止内存泄漏
1)使用软引用阻止泄漏在Java语言中有一种形式的内存泄漏称为对象游离(Object Loitering):public class LeakyChecksum{ private byte[] byteArray; public synchronized int getFileCheckSum(String filename){ int len = get转载 2016-04-02 14:45:59 · 782 阅读 · 0 评论 -
类的加载、执行顺序
什么时候类加载:第一次需要使用类信息时加载。 类加载的原则:延迟加载,能不加载就不加载。JVM虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化(类的初始化有且仅有一次): 1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用原创 2015-07-18 13:02:44 · 569 阅读 · 0 评论 -
引用设成null对GC有帮助吗?
转载自:http://www.newsmth.net/nForum/#!article/Java/275101?p=2经常听到过这种说法:如果一个对象没有被RC Roots直接或间接引用,就会被GC. 如果显示地把它设成null,可以帮助GC。是否真的有用?public static void main(String[] args)() { byte[] placehold转载 2016-09-12 21:41:05 · 1825 阅读 · 0 评论 -
JMM主内存与工作内存交互
Java虚拟机内存模型中定义了8种关于主内存和工作内存的交互协议操作:lock:作用于主内存的变量,把一个变量标识为一条线程独占状态。unlock:作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量可以被其他线程锁定。read:作用于主内的变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。load:作用于工作内存的变量,把read读取操作从主内存原创 2016-11-03 20:35:10 · 1925 阅读 · 0 评论 -
栈上分配和TLAB
栈上分配 JVM允许将线程私有的对象打散分配在栈上,而不是分配在堆上。分配在栈上的好处是可以在函数调用结束后自行销毁,而不需要垃圾回收器的介入,从而提高系统性能。 栈上分配的一个技术基础是进行逃逸分析,逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体。另一个是标量替换,允许将对象打散分配在栈上,比如若一个对象拥有两个字段,会将这两个字段视作局部变量进行分配。 只能在server模原创 2016-10-14 16:06:02 · 5760 阅读 · 1 评论 -
JVM优化之调整大内存分页(LargePage)
转载自:http://jm.taobao.org/2009/11/21/3157/什么是内存分页? CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF,即4G,也就是说可支持的物理内存最大是4G。但在实践过程中,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。为了解决此类问题,现代CPU引入了MMU(Memory转载 2016-10-25 19:45:34 · 7986 阅读 · 0 评论 -
解释器与编译器
HotSpot虚拟机采用解释器与编译器并存的架构,HotSpot内置了两种即时编译器,分别称为Client Compiler和Server Compiler或则简称为C1编译器和C2编译器。采用编译器和解释器搭配使用的方式在虚拟机中称为“混合模式(Mixed Mode)”。 解释器能够迅速的执行程序(编译代码耗时),而编译器编译成的本地代码运行效率更高,但两种编译器也有差异:Client Co原创 2016-10-28 15:15:43 · 1016 阅读 · 0 评论 -
对象的内存布局(java对象大小)
转载自:http://www.infoq.com/cn/articles/jvm-hotspot http://www.open-open.com/lib/view/open1423111722764.html http://blog.csdn.net/u013256816/article/details/51008443转载 2016-09-04 10:43:33 · 910 阅读 · 0 评论 -
逃逸分析
逃逸分析优化栈上分配 优化原理:分析找到未逃逸的变量,将变量类的实例化内存直接在栈里分配(无需进入堆),分配完成后,继续在调用栈内执行,最后线程结束,栈空间被回收,局部变量也被回收。 这是优化后的处理方式,对比可以看出,主要区别在栈空间直接作为临时对象的存储介质。从而减少了临时对象在堆内的分配数量。锁省略 如果通过逃逸分析能够判断出指向某个局部变量的多个引用被限制在同一方法体内,并且所有这原创 2017-03-02 09:56:14 · 569 阅读 · 0 评论 -
Java 8从永久代到metaspace
转载自:http://blog.csdn.net/chenleixing/article/details/48286127 http://blog.csdn.net/wang8118/article/details/45765869 http://lovestblog.cn/blog/2016/10/29/metaspace/ Jav转载 2016-05-06 21:02:52 · 5716 阅读 · 0 评论 -
JVM命令参数大全
参数选项 含义 -Xmssize 设置初始化堆内存大小,这个值的大小必须是1024的倍数,并且大于1M,可以指定单位k(K),m(M),g(G)。例如 -Xms6m。如果没有设置这个值,那么它的初始化大小就是年轻代和老年代的和 -Xmxsize 设置最大堆内存大小,这个值的大小必须是1024的倍数,并且大于2M,可以指定单位k(K),m(M),g(G)。默认值是根据运行时的系统配置原创 2016-10-18 13:12:51 · 2845 阅读 · 0 评论 -
Java内存模型之happens-before
从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。转载 2017-11-01 18:59:13 · 361 阅读 · 0 评论 -
ClassLoader
类加载器 通过一个类的全限定名来获取描述此类的二进制流,执行这个动作的代码模块成为“类加载器”。JDK默认ClassLoaderBootstrp ClassLoader 启动类加载器,是Java类加载层次中最顶层的类加载器。Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的。它主要负责加载%JAVA_HOME%/jre/lib或原创 2015-01-13 10:25:22 · 446 阅读 · 0 评论 -
Java内存区域与内存溢出
转载自:http://blog.csdn.net/ns_code/article/details/17565503内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型转载 2015-07-18 11:58:11 · 480 阅读 · 1 评论 -
JVM垃圾收集
转载自:http://blog.csdn.net/ns_code/article/details/18076173 http://www.cnblogs.com/laoyanghj/archive/2011/08/17/jvm.html垃圾对象的判断 Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,首先要先确定这些对象转载 2015-07-20 09:59:39 · 447 阅读 · 0 评论 -
JVM中的Stack和Heap
转载自:http://www.cnblogs.com/jiayi/archive/2010/06/08/1753867.html 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题。 Stack(栈)是JVM的内存指令区。Stack管理很转载 2016-04-02 14:25:25 · 766 阅读 · 0 评论