随笔分类 - jvm
摘要:监控JVM信息的工具有JConsole。而ManagementFactory是一个可以获取JVM线程、内存、编译等信息的一个工厂类。 ManagementFactory使用: public class JvmInfo { private static final long MB = 1024 * 1
阅读全文
摘要:前言最近在做excel解析的编码,其中涉及到一个内存占用空间优化的问题。解决的方法是尽量少的创建对象,可以共用的对象信息不用创建多份。查阅资料后得到如下文章,作为学习记录使用。JAVA对象头由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记
阅读全文
摘要:如何判断一个对象占用多少字节?这是我之前遇到的一个面试题,在这里分享一下。 要判断一个对象占用多少字节,对象内存布局是必须要了解的。 对象内存布局 在HotSpot虚拟机里对象内存布局分为3个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) 对象头 对
阅读全文
摘要:一、先上答案 这个问题有坑,有两种回答 第一种解释: object实例对象,占16个字节。 第二种解释: Object o:普通对象指针(ordinary object pointer),占4个字节。 new Object():object实例对象,占16个字节。 所以一共占:4+16=20个字节。
阅读全文
摘要:通常的处理,我们还是要在FULLGC时取到当时的dump文件,来分析内存里都有哪些数据占居着内存。这里有两种办法来获取dump文件: 1.通过在jvm里添加参数配置:+HeapDumpBeforeFullGC,+HeapDumpAfterFullGC 这种方法需要在应用启动前要提前配置好,如果不需要
阅读全文
摘要:线上FullGC频繁的排查腾讯云服务器 2核4G 8M带宽 3年只要222😂😂,正常价格要4千多,这羊毛不薅白不薅😍😍。 https://curl.qcloud.com/50OxDE4W本应该写在文末的这个问题我再github上提交了一个issue,具体issue的讨论见这里问题前段时间发现
阅读全文
摘要:1:部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代。 2:如果对象的大小大于Eden的二分之一会直接分配在old,如果old也分配不下,会做一次majorGC,如果小于ed
阅读全文
摘要:JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 1、程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处
阅读全文
摘要:1. LockSupport简介 在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.u
阅读全文
摘要:目录:java虚拟机汇总 class文件结构分析 1).class文件常量池中的常量项结构 2). 常用的属性表的集合 类加载过程 1).类加载器的原理以及实现 虚拟机结构分析 1).jdk1.7和1.8版本的方法区构造变化 2).常量池简单区分 对象结构分析<<== 现在位置 1).压缩指针详解
阅读全文
摘要:Java中的四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。 Java为什么要设计这四种引用 Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。 Java设计这四种引用的主要目
阅读全文
摘要:今天主要通过多读单写的例子来说下读写锁的原理概念多读单写,简单说,就是对资源的访问分为两种状态,一种是读操作,另一种是写操作。由应用程序提示锁应该做哪种操作。当为读模式时,所有的写动作被悬挂,而读请求被允许通过,而写动作时,所有操作被悬挂。并且,读写切换时,有足够的状态等待,直到真正安全时,才会切换
阅读全文
摘要:由来和具体概念从JDK5开始,JSR-133使用 happens-before 来实现变量的内存可见性问题。在JMM中,如果一个操作执行的结果需要对另外一个操作可见,那么二者必定要存在 happens-before 关系。与开发人员密切相关的 happens-before 规则1、程序顺序规则:一个
阅读全文
摘要:在工作中,经常会碰到CPU占用100%的情况,那如何找到是那个线程占用了cpu呢? 1. top命令,找到cpu占用最高的进程 2. 查看该进程的线程, top -p <pid> 3. ctrl+H 切换到线程模式,找到占用cpu最高的线程。并把线程号转化为十六进制,printf "%x\n" <线
阅读全文
摘要:工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多;第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,
阅读全文
摘要:双亲委派机制时JVM类加载的默认使用的机制,其原理是:当一个类加载器收到类加载任务时,会先交给自己的父加载器去完成,因此最终加载任务都会传递到最顶层的BootstrapClassLoader,只有当父加载器无法完成加载任务时,才会尝试自己来加载。按照由父级到子集的顺序,类加载器主要包含以下几个: B
阅读全文
摘要:好久,好久....没有更博客了。这一次利用闲暇时间,来扯一下关于JVM中的TLAB。 什么是TLAB?它是干什么的?咋们先抛开这个问题,一切的开始得从new对象到指针碰撞开始讲起。 new对象与指针碰撞 new对象怎么就出问题了呢? java中我们要创建一个对象,用关键字new就可以了。但是,在我们
阅读全文
摘要:ps p 17618 -L -o pcpu,pmem,pid,tid,time,tname,cmd printf "%x\n" 17620 jstack -l 44d4 > jstack.log jstack -l 17618 > jstack.log jmap -dump:live,format=
阅读全文
摘要:原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了JVM中堆内存运行的情况。可以通过以下几种方式生成Heap Dump文件: 使用 jmap 命令生成
阅读全文
摘要:JVM配置参数之(-D、-X、-XX的区别) 最近在学习jvm调优相关的内容, 一直有一个疑问,为什么有些参数是以-X开头的,有些是以-XX开头的,还有-D开头的? 通过查询资料、总结如下 -XX 说明: 标准选择(Standard Options) 这些是 JVM 的所有实现都支持的最常用的选项。
阅读全文