JVM
文章平均质量分 88
另一只羊
这个作者很懒,什么都没留下…
展开
-
Java内存模型
Java内存模型 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率与一致性。原创 2017-05-08 17:41:22 · 225 阅读 · 0 评论 -
Java内存区域与内存溢出异常
运行时数据区域 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区1. 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 严格来说是一个数据结构,用于保存当前正在执行的程序的内存地址,由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程原创 2017-05-07 23:27:25 · 259 阅读 · 0 评论 -
虚拟机栈溢出之这个例子谨慎运行
/** * 配置jvm参数:设置线程的栈容量 * -Xss2M */public class JavaVMStackOOM { private void dontStop() { while (true) {} } public void stackLeakByThread() { while (true) { T原创 2017-06-12 17:42:45 · 563 阅读 · 0 评论 -
JVM内存调优
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。原创 2017-07-12 17:38:29 · 183 阅读 · 0 评论 -
内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况也可能直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃原创 2017-07-12 16:44:07 · 246 阅读 · 0 评论 -
垃圾收集器
上文解释了垃圾收集的算法,本文将会介绍内存回收的具体实现-垃圾收集器。Serial收集器 这是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾手机工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。“Stop the world”,由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常工作的线程全部停掉,这对原创 2017-07-12 15:26:50 · 271 阅读 · 0 评论 -
垃圾收集算法
判定出垃圾对象之后,便可以进行垃圾回收了。下面介绍一些垃圾收集算法,由于垃圾收集算法的实现涉及大量的程序细节,因此这里主要是阐明各算法的实现思想,而不去细论算法的具体实现。标记—清除算法(Mark-Sweep)标记—清除算法是最基础的收集算法,它分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实就是前面的可达性分析算法中判定垃圾对象的标原创 2017-07-12 13:36:24 · 383 阅读 · 0 评论 -
类加载器
一、类与类加载器回顾一下,加载阶段进行的操作: 1、通过一个类的全限定名来获取其定义的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3、在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。 加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个j原创 2017-07-11 16:47:47 · 367 阅读 · 0 评论 -
类加载机制
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期原创 2017-07-11 00:16:37 · 345 阅读 · 0 评论 -
Class类文件的结构
平台无关性Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。 Java语言中的各种变量、关键字原创 2017-06-21 15:57:27 · 339 阅读 · 0 评论 -
HotSpot虚拟机对象探秘
对象实例化分析对内存分配情况分析最常见的示例便是对象实例化:Object obj = new Object();虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(加载的过程涉及到方法区)。在类加载检查通过后,虚拟机才会为新对象分配内存(堆)。这段代码的执行会涉原创 2017-06-21 10:35:31 · 238 阅读 · 0 评论 -
内存溢出分析:OutOfMemoryError异常
下面给出个内存区域内存溢出的简单测试方法:一、Java堆溢出将堆大小限制为20MB,不可扩展(将堆堆最小值参数与最大值参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析。import java.util.ArrayList;import java.util.List;原创 2017-06-12 20:12:24 · 1144 阅读 · 0 评论 -
垃圾对象的判定
引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的。引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的选择,当Java语言并没有选择这种算法来进行垃圾回收,主要原因是它很难解决对象之间的相互循环引用问题。考虑一种情形:对象objA和objB都有字段instance,赋值令obj原创 2017-07-12 13:16:54 · 408 阅读 · 0 评论