深入理解JVM
文章平均质量分 81
你好龙卷风!!!
如你所愿
展开
-
java禁止对象引用传值,利用克隆的浅拷贝
通过 Cloneable 接口可以很轻松地实现 Java 对象的克隆,只需要 implements Cloneable 并实现 Object 的 clone() 方法即可。原因:因为回退后对象的地址没变,所以新工单的值会改变老工单的值,从编写的代码上看是两个对象,单从jvm上是一个值,因为地址是一个。那怎么做才能把一个新对象获取到旧对象的值而改变引用地址呢,克隆浅拷贝。工单回退时做留痕操作时发现把工单对象回退之后的值会影响到老工单的值,原创 2023-03-05 18:16:01 · 404 阅读 · 0 评论 -
使用pmap查看进程内存
使用pmap查看进程内存pmap 1569内容太多只截取了中间的一部分第一列:内存块起始地址第二列:内存占用大小第三列:权限第四列:内存名称,其中【anon】表示动态分配的内存,【stack】表示栈内存另外最后一行会显示内存占用总量,不过是虚拟内存大小,物理内存通过top看 total 2009524K通过jmap查看java内存使用情况通过jmap可以查看某个Java进程中每一个对象的有多少实例,占用多少内存,输出到文本文件到看jma.原创 2021-09-03 14:25:34 · 990 阅读 · 0 评论 -
jstack实战死循环与死锁
jstack作用jstack可以打印出所有jvm内部所有线程如果cpu飙高,有可能是发生了死循环之类,需要定位哪个线程出了问题jstack使用./jstack 9204 > /opt/stack.txt9204为线程>后面跟着导出的位置内容:"http-bio-8080-exec-10" #56 daemon prio=5 os_prio=0 tid=0x608e5800 nid=0x25ae waiting on condition [0x5f479000] j..转载 2021-09-03 14:15:10 · 207 阅读 · 0 评论 -
jvm8:调优实战
-JVM参数 通用JVM参数 -server如果不配置该参数,JVM会根据应用服务器硬件配置自动选择不同模式,server模式启动比较慢,但是运行期速度得到了优化,适合于服务器端运行的JVM。-client启动比较快,但是运行期响应没有server模式的优化,适合于个人PC的服务开发和测试。-Xmx设置java heap的最大值,默认是机器物理内存的1/4。这个值决定了最多可用的Java堆内存:分配过少就会在应用中需要大量内存作缓存或者临时对象时出现OOM(Out Of Mem转载 2021-03-17 14:04:16 · 499 阅读 · 0 评论 -
阿里在线分析诊断工具Arthas和jvm-sandbox使用demo
1 阿里在线分析诊断工具Arthas(阿尔萨斯)参考:https://alibaba.github.io/arthas/参考:https://github.com/alibaba/arthas/blob/master/README_CN.md2 阿里在线分析诊断工具Jvm-Sandbox(JVM沙盒)参考:https://github.com/alibaba/jvm-sandbox3 Arthas与Jvm-Sandbox比较Arthas就像是一个剑冢...转载 2021-03-17 11:31:26 · 1220 阅读 · 0 评论 -
jdk自带的jvm监控工具 jconsole ,jvisualvm,jmc
1.jconsolejconsole 主要监控 JVM 的概览、内存、线程、类、vm概要、MBean等内容。JConsole 会消耗大量系统资源,因此 Oracle 建议仅在用于创建原型的开发环境中使用它。还建议使用远程监控将 JConsole 应用程序与所监控的平台隔离。因此线上使用的人非常的少,网上的相关教程也不是很多。进入jdk安装目录下的bin 点击jconsole.exe选择一个进程 连接2.jvisualvmjvisualvm,jdk 自带全能工具,可以分析内存..原创 2021-03-17 11:16:28 · 8047 阅读 · 0 评论 -
JVM7:常见的垃圾回收器
常见的垃圾回收器: Serial Serial Old Parallel Scavenge Parallel Old ParNew CMS G1 ZGC Shenandoah Epsilon 下图已经列出来了这,其中Epsilon是debug使用的,不用过分关注;最常见的组合有:Serial +Serial Old 、Parallel Scavenge + Parallel Old 、ParNew + CMS。G1之前都是不仅在逻辑上是分代的而且在物理层面上也是转载 2021-02-19 19:22:55 · 174 阅读 · 0 评论 -
JVM6:常见的GC算法
一、标记-清除算法:1、标记清除算法的概念:标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象;然后,在清除阶段,清除所有未被标记的对象。2、标记-清除算法详解:它的做法是当堆中的有效内存空间(available memory)被耗尽的时候,就会停止整个程序(也被成为stop the world),然后进行两项工作,第转载 2021-02-19 19:06:51 · 131 阅读 · 0 评论 -
JVM5: GC如何判断对象是否为垃圾
查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。引用计数法下面通过一段代码来对比说明: 1 2 3...转载 2021-02-19 17:54:38 · 180 阅读 · 0 评论 -
JVM4:Java运行时数据区域
众所周知,Java 虚拟机有自动内存管理机制,如果出现内存泄漏和溢出方面的问题,排查错误就必须要了解虚拟机是怎样使用内存的。下图是 JDK8 之后的 JVM 内存布局。JDK8 之前的内存区域图如下:在 HotSpot JVM 中,永久代中用于存放类和方法的元数据以及常量池,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。永久代是有大小限制的,因此如果加载的类太多,很有可能导致永久代内存溢出,即万恶的java.lang.OutOfMemoryE.转载 2021-02-18 17:46:36 · 103 阅读 · 0 评论 -
JVM3:现代cpu模型和 JMM底层实现原理
一.现代cpu模型在多线程下的不足1.写在前面一段代码引来的思考:为什么程序一直走不出Thread_One的while循环呢?public class Test{ public static boolean threadOneFlag = true; public volatile static boolean threadTwoFlag = true; public static void main(String[] args) throws Inter转载 2021-02-17 17:31:02 · 399 阅读 · 0 评论 -
自定义 ClassLoader 绕过双亲委派的实验
1.对于任意一个类,由加载它的ClassLoader和它本身决定了在java虚拟机中的唯一性。也就是说比较2个类,只有它们都是由同一个ClassLoader加载,那么比较才有意义。否则,即使是同一个类文件,如果加载它们的ClassLoader不同,那么这2个类必定不相等。2.类加载的双亲委派机制是可以破坏的,通过改变CallClassLoader和ContextClassLoader。被当前类引用的类的加载也是由加载当前类的ClassLoader加载,子线程的ContextClassLoader是.转载 2021-02-16 19:13:41 · 335 阅读 · 0 评论 -
JVM2:深入理解ClassLoader工作机制
一、什么是ClassLoader?ClassLoader 顾名思义就是类加载器,ClassLoader 作用:负责将 Class 加载到 JVM 中 审查每个类由谁加载(父优先的等级加载机制) 将 Class 字节码重新解析成 JVM 统一要求的对象格式延迟加载JVM 运行并不是一次性加载所需要的全部类的,它是按需加载,也就是延迟加载。程序在运行的过程中会逐渐遇到很多不认识的新类,这时候就会调用 ClassLoader 来加载这些类。加载完成后就会将 Class 对象存在 ClassL原创 2021-02-16 15:36:18 · 280 阅读 · 0 评论 -
JVM1:从一个class文件深入理解Java字节码结构
前言我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结构。1.Demo源码首先,编写一个简单的Java源码:package com.april.test;public class Demo { private int num = 1; public int add() { num = num + 2;转载 2021-02-16 12:12:30 · 255 阅读 · 0 评论