深入理解JVM
文章平均质量分 89
深入理解JVM
HelloWorld搬运工
HelloWorld是学习程序的第一个程序,搬运工是将一件东西从一个地方运到另一个地方。HelloWorld搬运工,分享技术知识,有原创也有转发,彼此交流,一起学习,共同进步。
展开
-
系统架构性能问题诊断及优化思路
对于业务系统性能问题,我们经常想到的就是要扩展数据库的硬件性能,比如扩展CPU和内存,扩展集群,但是实际上可以看到很多应用的性能问题并不是硬件性能导致的,而是由于软件代码性能引起的。第二个点也是我们经常谈的比较多的点,就是我们的业务系统在进行架构设计的时候,特别是面对非功能性需求,我们都会谈到系统本身的数据库,中间件都采用了集群技术,能够做到弹性水平扩展。比如在我们最近的项目实施中,结合APM和服务链监控,我们可以快速的发现究竟是哪个服务调用出现了性能问题,或者快速的定位出哪个SQL语句有验证的性能问题。原创 2022-09-18 20:36:36 · 340 阅读 · 0 评论 -
细数线程池的10个坑
日常开发中,为了更好管理线程资源,减少创建线程和销毁线程的资源损耗,我们会使用线程池来执行一些异步任务。但是线程池使用不当,就可能会引发生产事故。今天田螺哥跟大家聊聊线程池的10个坑。大家看完肯定会有帮助的~线程池默认使用无界队列,任务过多导致OOM线程创建过多,导致OOM共享线程池,次要逻辑拖垮主要逻辑线程池拒绝策略的坑Spring内部线程池的坑使用线程池时,没有自定义命名线程池参数设置不合理线程池异常处理的坑使用完线程池忘记关闭。原创 2022-08-22 19:17:07 · 217 阅读 · 0 评论 -
JVM 之逃逸分析技术
引言我在面试别人的过程中,JVM 内存模型我几乎必问,虽然有人说问这些就是面试造航母,工作拧螺丝。如果你想当一名 CRUD 码农,你可以选择不用了解这些。在 JVM 内存模型的问答中,有些人能说出对象是在堆上分配的。但当我问对象一定是在堆上存储的嘛时,大部分人都回答是,或者犹豫了。其实能回答出对象是在堆上分配存储已算正确了。但随着JIT即时编译器的发展和逃逸分析技术的逐渐成熟,所有对象都分配到堆上也逐渐变得不那么绝对了。栈上分配,标量替换,锁消除等优化技术会发生一些微妙的变化。..原创 2021-07-19 19:38:54 · 305 阅读 · 0 评论 -
Java虚拟机(JVM)最新面试题汇总
个人博客请访问http://www.x0100.topJava内存区域说一下 JVM 的主要组成部分及其作用?JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime d...原创 2020-06-18 15:40:58 · 300 阅读 · 0 评论 -
JVM GC的这几个问题你了解吗?
个人博客请访问http://www.x0100.top本文不再重复谈GC算法以及垃圾回收器,而是谈谈在GC发生的时候,有几个可能被忽略的问题。搞懂这些问题,相信将对GC的理解能再加深几分。本文主要内容- Q1: GC工作是如何发起的?- Q2: Stop The World到底如何让Java线程都停下来?- Q3: 如何找到GC Roots?- Q4: GC时如何处理四种特殊引用?- Q5: 对象移动后,引用如何修正?Q1: GC工作是如何发起的?垃圾回...原创 2020-05-13 16:40:36 · 1082 阅读 · 0 评论 -
不再使用的对象赋值为null会有意料之外的惊喜
个人博客请访问http://www.x0100.top前言许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的...原创 2020-05-08 11:35:11 · 267 阅读 · 0 评论 -
Java - 虚拟机学习笔记2 类加载机制
一、Class类文件二、类加载机制三、类加载器四、类的初始化五、总结一、Class类文件Sun公司于1995年5月正式推出Java语言,如今Java已经得到广泛的认可和使用,Java得以欢迎的重要原因是它实现了“一次编写,到处运行”的理想。构成平台无关性的基础是虚拟机和字节码。字节码是一种虚拟的机器指令代码,不针对特定的机器,Java虚拟机是执行Java程...原创 2019-10-09 11:20:52 · 170 阅读 · 0 评论 -
Java堆外内存使用
JVM内部会把所有内存分成Java使用的堆内存和Native使用的内存,它们之间是不能共享的,就是说当你的Native内存用完了时,如果Java堆又有空闲内存,这时Native会重新向Jvm申请,而不是直接使用Java堆内存。使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。...原创 2018-10-24 21:49:21 · 2927 阅读 · 1 评论 -
jvm基础总结概述
一、运行时数据区域程序计数器记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。虚拟机栈每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。可以通过 -Xss 这个虚拟机参数来指定一个程序的 Java 虚拟...原创 2018-05-14 21:13:07 · 299 阅读 · 0 评论 -
jdk命令行工具详解
由于java jdk命令行工具比较重要,加之看到一篇不错的总结,所以接下来详细讲解。很多java开发人员一旦发现应用无法响应、首先查看一下日志、在查找日志无果的情况下动不动就重启java应用先让其正常工作了再说。还有更为夸张的是听到过制作定时脚本每天半夜定时重启、并笑着说重启解决一切问题。这种解决办法显然是下下策、经验不足的表现。除了查看日至之外、对于java进程JVM的...原创 2018-05-16 22:17:21 · 3501 阅读 · 0 评论 -
Java命令学习系列(二)——Jstack
jstack是java虚拟机自带的一种堆栈跟踪工具。功能jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么...原创 2018-05-23 08:09:55 · 2092 阅读 · 1 评论 -
Java命令学习系列(三)——Jmap
什么是堆Dump堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。基础知识常见内存错误:outOfMemoryError年老代内存不足。outOfMemoryError:PermGen...原创 2018-05-23 08:13:03 · 322 阅读 · 1 评论 -
Java命令学习系列(四)——jstat
jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。jstat位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对...原创 2018-05-23 08:15:29 · 775 阅读 · 0 评论 -
Java命令学习系列(零)——常见命令及Java Dump介绍
一、常用命令:在JDK的bin目彔下,包含了java命令及其他实用工具。jps:查看本机的Java中进程信息。jstack:打印线程的栈信息,制作线程Dump。jmap:打印内存映射,制作堆Dump。jstat:性能监控工具。jhat:内存分析工具。jconsole:简易的可视化控制台。jvisualvm:功能强大的控制台。二、认识Java Dump:...原创 2018-05-23 08:20:54 · 273 阅读 · 0 评论 -
G1与CMS垃圾回收
G1 GC,全称Garbage-FirstGarbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信熟悉JVM的同学们都不会对它感到陌生。在JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。那么与之前的CMS相比,G1有哪些改变,哪些优势呢?什么是CMSCMS收集器是基于标记清...原创 2018-06-13 20:00:33 · 3951 阅读 · 2 评论 -
Java - 虚拟机学习笔记1 自动内存管理机制
在学习Java的时候,我们通常会将其与c++进行对比,Java在c++的基础上作了许多改进,摒弃了c++中很多很少使用、难以理解的且容易混淆的特性,例如头文件、指针、运算符重载、多继承等等。Java与c++相比有很多不同之处,其中就包括自动内存管理机制。在c++中,对于new分配的内存最终都需要使用对应的delete进行释放。而对于Java来说,Java虚拟机的自动内存管理机制在内存管理方面帮我们...原创 2019-10-10 09:14:48 · 302 阅读 · 0 评论