![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 84
施小赞
人生苦短,我爱Java
展开
-
第28章:性能优化案例
1、性能优化案例1:调整堆大小提高服务吞吐量1.1、修改tomcat JVM配置生产环境下, Tomcat并不建议直接在catalina.sh里配置变量,而是写在与 catalina同级目录(bin目录)下的setenv.sh里。1.2、初始配置setenv.sh 文件中写入(大小根据自己情况修改):setenv.sh 内容如下export CATALINA_OPTS="$CATALINA_OPTS -Xms30m"export CATALINA_OPTS="$C...原创 2021-11-25 11:40:13 · 821 阅读 · 2 评论 -
第27章:OOM常见各种场景及解决方案
1、OOM案例1:堆溢出1.1、报错信息java.lang.OutOfMemoryError: Java heap space1.2、案例模拟127.0.0.1:8080/add/** * 案例1:模拟线上环境OOM */@RequestMapping("/add")public void addObject(){ System.err.println("add"+peopleSevice); ArrayList<People> peop原创 2021-11-25 11:26:27 · 2023 阅读 · 2 评论 -
第26章:分析GC日志
1、GC日志参数2、GC日志格式2.1、GC分类针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC / Young GC):只是新生代(Eden / S0, S1)的垃圾收集 老年代收集(Major GC / Old GC):只是老年代的垃圾收集。目前,只有CMS原创 2021-11-25 11:16:57 · 131 阅读 · 0 评论 -
第25章:JVM运行时参数
1、JVM参数选项类型1.1、类型一:标准参数选项特点:比较稳定,后续版本基本不会变化以 - 开头各种选项:运行java或java -help可以看到所有的标准选项> java -help用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...] (执行 jar 文件)其中选项包括: -d32原创 2021-11-25 11:14:23 · 781 阅读 · 0 评论 -
第24章:JVM监控及诊断工具-GUI篇
1、工具概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。 要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。 分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里原创 2021-11-16 15:14:01 · 6335 阅读 · 0 评论 -
MAT图示详解
1、概览2、直方图3、线程概述情况 thread overview原创 2021-11-15 17:28:03 · 485 阅读 · 0 评论 -
第23章:JVM监控及诊断工具-命令行篇
1、概述性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。体会2:无监控、不调优!简单命令行工具在我们.原创 2021-11-15 14:22:32 · 128 阅读 · 0 评论 -
第22章:概述篇
1、大厂面试题支付宝:支付宝三面:JVM性能调优都做了什么?小米:有做过JVM内存优化吗?从SQL、JVM、架构、数据库四个方面讲讲优化思路蚂蚁金服:JVM的编译优化jvm性能调优都做了什么JVM诊断调优工具用过哪些?二面:jvm怎样调优,堆内存、栈空间设置多少合适三面:JVM相关的分析工具使用过的有哪些?具体的性能调优步骤如何阿里:如何进行JVM调优?有哪些方法?如何理解内存泄漏问题?有哪些情况会导致内存泄漏?如何解决?字节跳原创 2021-11-15 14:12:40 · 516 阅读 · 0 评论 -
十七、垃圾回收器
1、GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。> 在诸如单CPU处理器或者较小的应用内存等硬件平台不...原创 2020-06-08 03:24:42 · 434 阅读 · 0 评论 -
十六、垃圾回收相关概念
1、System.gc()的理解在默认情况下,通过System.gc ()或者Runtime.getRuntime () .gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc ()调用附带一个免责声明,无法保证对垃圾收集器的调用。 JVM实现者可以通过System.gc ()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准.原创 2020-06-07 14:35:07 · 215 阅读 · 0 评论 -
十五、垃圾回收相关算法
1、标记阶段:引用计数算法垃圾标记阶段:对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象, GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。方...原创 2020-06-07 14:35:34 · 203 阅读 · 0 评论 -
十四、垃圾回收概述
1、什么是垃圾垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题:哪些内存需要回收? 什么时候回收? 如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展, Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。大厂面试题蚂蚁.原创 2020-06-06 19:21:53 · 223 阅读 · 0 评论 -
十三、StringTable
1、String的基本特性String : 字符串,使用一对 "" 引起来表示。String s1 = "shuidiit";//字面量的定义方式String s2 = new String("hello");String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小 String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时原创 2020-06-06 19:15:49 · 298 阅读 · 0 评论 -
十二、执行引擎
1、执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一..原创 2021-02-02 10:43:42 · 119 阅读 · 0 评论 -
十、对象的实例化内存布局与访问定位 十一、直接内存
1、对象的实例化美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面: java对象头里有什么1.判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查...原创 2020-06-06 19:04:12 · 201 阅读 · 0 评论 -
九、方法区
1、 栈、堆、方法区的交互关系2、 方法区的理解https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4方法区在哪里?《Java虚拟机规范》中明确说明: “尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。” 但对于HotSpot JVM而言,方法区还有一...原创 2020-06-06 19:00:14 · 279 阅读 · 0 评论 -
八、堆
八、堆1、堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java 堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。>堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(ThreadLocal Allocation Buffer, TLAB)《Java虚拟机规...原创 2020-06-06 15:50:50 · 308 阅读 · 0 评论 -
六、本地方法接口 七、本地方法栈
六、本地方法接口什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个c的函数。"A native method is a Java method whose implementation isprovi...原创 2020-06-06 15:35:40 · 204 阅读 · 0 评论 -
五、虚拟机栈
1、虚拟机栈概述虚拟机栈出现的背景由于跨平台性的设计, Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。初步印象有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack) ?为什么?内存中的栈与堆栈是运行时的单位,而堆是存储的单位。即:栈解决程序的运行问题,即程序..原创 2020-06-06 15:28:39 · 1748 阅读 · 0 评论 -
二、类加载子系统 三、运行时数据区概述及线程 四、程序计数器(PC 寄存器)
1、类加载子系统作用Class文件,class文件在文件开头有特定的文件标识。只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定(这部分常量信息是Class文件中常量池部分的内存映射)2、类加载器ClassLoader角色3、类加载过程加载:1.通过一个类的全限定名获取定义此类的二进制字节流2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3.在内存中生成一个代表这个类的jav...原创 2020-06-06 15:13:44 · 238 阅读 · 0 评论 -
一、JVM与Java体系结构
1、jvm整体结构2、Java 代码执行流程原创 2020-06-06 15:04:15 · 97 阅读 · 0 评论 -
JVM小总结
1、JVM垃圾回收的时候如何确定垃圾?是否知道什么是 GC Roots什么是垃圾:简单的说就是内存中已经不再被使用到的空间就是垃圾要进行垃圾回收,如何判断一个对象是否可以被回收① 引用计数法Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,给对象中添加一个引用计数器,每当有一个地方引用它,计数器值加1每当有一个引用失效时,计数器值减1。任何时刻计数器值为零的对象就是不可能再被使用的,那么原创 2020-05-23 18:18:58 · 1190 阅读 · 0 评论 -
jvm学习笔记-1
一、JVM与Java体系结构1、jvm整体结构2、Java 代码执行流程二、类加载子系统1、类加载子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量...原创 2020-05-23 18:05:44 · 226 阅读 · 0 评论