
JVM
文章平均质量分 88
z1340954953
男儿当自强
展开
-
自动内存管理机制_运行时数据区域
程序计数器一块内存区域,可以看做是当前线程执行的字节码的行号指示器。在虚拟机的概念模型中,字节码解释器工作时候,就是通过改变这个序号来执行字节码指令,比如分支,循环,跳转,异常处理,线程恢复等基础功能都需要。由于java虚拟机的多线程是通过线程轮流切换执行的。任意一个时刻只能执行一个线程,因此为了每个线程切换后都能恢复到原来执行的位置,那么每个线程都必须独有一个程序计数器。各个计数器键互不影响,这...原创 2018-03-28 15:24:05 · 184 阅读 · 0 评论 -
破坏双亲委派模型和自定义自己的类加载器
ClassLoader loadeClass源码:protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // ...原创 2018-04-25 09:42:16 · 1818 阅读 · 0 评论 -
虚拟机性能监控和故障处理工具
* 如果监控运行与jdk1.5的虚拟上的程序,程序启动时候请添加参数"-Dcom.sun.management.jmxremote"开启JMX管理功能,由于部分工具基于JMX的,但是如果环境在JDK1.6之上,那JMX是默认开启的Sun JDK监控和故障处理工具名称主要作用jpsJVM Process Status Tool,显示指定系统内的所有HotSpot虚拟机进程jstatJVM Stati...原创 2018-04-20 10:34:10 · 290 阅读 · 0 评论 -
JVM调优策略
GC的两种类型1. 新生代GC(Minor GC):指的是新生代中发生的垃圾回收,因为新生代中的对象创建和销毁都比较快,频繁,所以新生代的Minor GC发生很频繁,如果新生代中出现了FULL GC,一般是由于内存担保失败(新生代的存活的对象无法移动到老年代中)导致的2. 老年代GC(Major GC/FULL GC):指的是老年代中发生的垃圾回收,一般伴随着一次Minor GC,而且FULL G...转载 2018-04-18 15:42:19 · 470 阅读 · 0 评论 -
常用JVM参数
(1)-Xms20M表示设置JVM启动内存的最小值为20M,必须以M为单位(2)-Xmx20M表示设置JVM启动内存的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免JVM内存自动扩展。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高(3)-verbose:gc表示输出虚拟机中GC的详细情况(4)-Xss128k表示可以设置虚拟机栈的大小为128k(5)-Xo...转载 2018-04-18 11:00:46 · 273 阅读 · 0 评论 -
虚拟机执行子系统_类加载器、双亲委派模型
类加载器的定义通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码称为类加载器类和类加载器对于任意一个类,都需要由加载它的类加载器和这个类本身一同确定在java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。也就是:比较两个类是否相等,只有在这两个类都是同一个类加载器加载的并且是来源于同一个...原创 2018-04-17 11:14:39 · 317 阅读 · 0 评论 -
类文件结构_class类文件的的结构
跨平台的实现Java诞生之初提出一个口号"一次编写,到处运行"。与平台无关的思想最终实现在操作系统的应用层上:Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现一次编写,到处运行。实现语言无关性(java虚拟机上可以运行Scala等其他语言)仍然是虚拟机和字节码的存储格式.java 虚拟机不和任何语言绑定,只是和Cl...原创 2018-04-11 14:16:07 · 382 阅读 · 0 评论 -
虚拟机类加载机制_类加载的过程
Java虚拟机中类加载的全过程: 加载、验证、准备、解析和初始化这5个阶段加载加载时类加载过程的一个阶段,在加载阶段,虚拟机需要完成3件事1> 通过一个类的全限定名来获取定义此类的二进制字节流2> 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构3> 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口(对于HotSpot...原创 2018-04-16 11:36:39 · 286 阅读 · 0 评论 -
eclipse设置查看GC日志和如何理解GC日志
eclipse的gc日志配置可以在eclipse.ini中加入参数实现,不过打印的日志是整个eclipse的内存回收情况,如何实现准确的看一个java应用的gc日志呢.1. Run as -> Run configurations -> java应用名 -> arguments ->VM arguments,加入jvm参数就行2. 测试代码package cn.erong....原创 2018-03-28 10:30:38 · 2984 阅读 · 0 评论 -
垃圾收集器与内存分配策略_hotspot垃圾收集算法实现和垃圾收集器
HotSpot算法实现1. 枚举根节点从可达性分析中从GC Roots节点中找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中。如果逐个检查,消耗很多资源另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项分析工作必须在一个能保证一致性的快照中进行-这里的一致性指的是在整个分析期间整个执行系统看起来就像是冻结在某...原创 2018-03-28 15:25:37 · 208 阅读 · 0 评论 -
虚拟机类加载机制_类加载时机和类的生命周期
类加载机制类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,可以在初始化之后再解析,为了支持java语言运行时绑定类的初始化时机java虚拟机规范中并没有对加载有强制约束,但是对于类的...原创 2018-04-09 16:54:11 · 242 阅读 · 1 评论 -
垃圾收集器与内存分配策略_垃圾收集算法
前面了解了java运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出执行者出栈和入栈操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。因而这几个区域的内存回收都具有确定性。也就是在对于程序计数器、虚拟机栈、本地方法栈这几个内存区域不需要考虑回收问题,方法结束或线程销毁,内存自然随着回收了。java堆和方法区则不一样,...原创 2018-03-28 15:25:12 · 198 阅读 · 0 评论 -
垃圾收集器与内存分配策略_内存分配策略
对象的内存分配策略测试环境jdk1.6 32位对象的内存分配,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在tlab上分配。少数情况下也可能会直接分配在老年代中,分配的规则不是百分百确定,其细节取决于当前使用的是那种垃圾收集器组合,还有虚拟机中于内存相关的参数配置,下面介绍的是几条普遍的内存分配规则。对象优先在Eden分配大多数的对象在新生代Eden...原创 2018-03-31 11:22:09 · 324 阅读 · 0 评论 -
【转】线上OOM问题定位
JAVA出现OOM问题的原因 1. 分配的内存空间小,正常的业务需要较大的内存空间 2. 对象频繁被申请,没有释放掉 3. 资源不断的申请,导致资源耗尽,如线程不断创建,不断的发起网络连接 定位OOM 1. 确定JVM的内存空间是否分配过小 jmap -heap pId 可以看出新生代、老年代的空间大小和使用情况 2. 找到最耗费内存对象 jmap -histo:live...转载 2019-03-10 10:14:49 · 522 阅读 · 0 评论