想验证你对 jvm 配的一些调优参数有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms、Xmx 等参数?想不想找到你的应用的永久区 PermGen 的使用峰值,并根据其去设置合理的 XX:PermSize、XX:MaxPermSize 等参数?如何根据应用实时的运行运行情况合理配置年轻代(Young Generation,即 Eden 区和两个 Survivor 区之和)和年老代(Ol...
分类:
编程语言 时间:
2015-04-15 21:31:02
阅读次数:
197
ubuntu版本12.04.3 64位hadoop是用运行在java虚拟机上的,所以需要先安装jdk,jdk安装配置方法在另一篇博文ubuntu12.04下安装jdk1.7源码包准备:我下载的是hadoop-1.2.1.tar.gz,这个版本比较稳定,下载地址可以到官网提供的镜像http://www...
分类:
系统相关 时间:
2015-04-15 20:50:54
阅读次数:
209
上图是一张Java运行时的内存分布图,可知虚拟机内存都有发生OutOfMemoryError(下文称 OOM)异常的可能,作为一个合格的Java开发人员,我们应该做到的是:(1)第一,通过代码验证 Java 虚拟机规范中描述的各个运行时区域储存的内容;
(2)第二,遇到内存溢出的时候,应该可以找打具体的位置,并进行合理的解决;下边就聊一下 OOM:一、Java 堆溢出我们知道Java 堆用于储存对...
分类:
编程语言 时间:
2015-04-14 19:47:14
阅读次数:
216
一、在 Java 虚拟机规范中,对虚拟机栈这个区域规定了两种异常状况:(1)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;
(2)如果虚拟机栈可以动态扩展(当前大部分的 Java 虚拟机都可动态扩展,只不过 Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够
的内存时会抛出 OutOfMemoryError 异常。
(3)与...
分类:
编程语言 时间:
2015-04-14 19:45:14
阅读次数:
282
如果要向运行时常量池中添加内容,最简单的做法就是使用 String.intern()这个 Native 方法。该方法的作用是:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的String 对象;否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize 和-XX:Ma...
分类:
编程语言 时间:
2015-04-14 19:44:21
阅读次数:
153
一、概述
对于 C 和 C++程序开发的开发人员来说,在内存管理领域,程序员对内存拥有绝对的使用权,但是也要主要到正确的使用和清理内存,这就要求程序员有较高的水平。而对于 Java 程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/free 代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为 Jav...
分类:
编程语言 时间:
2015-04-14 18:07:19
阅读次数:
147
对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈、 Java 堆、方法区这三个最重要内存区域之间的关联关系,如下面的这句代码:Object obj = new Object();我们知道在Java栈中保存的是对象的引用,在Java堆中才是具体new出来的对象实体,根据具体类型以及虚拟机实现的对象内存布局( Object Memory Layou...
分类:
编程语言 时间:
2015-04-14 18:03:12
阅读次数:
132
Java虚拟机内存原型寄存器:在程序中无法控制栈:存放基本类型的数据和对象的引用,但是对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据静态域:存放在对象中用static定义的静态成员常量池:存放变量非RAM存储:硬盘等永久存储空间Java内存分配中的栈栈的基本单位是帧(或栈帧):每当一...
分类:
编程语言 时间:
2015-04-14 16:20:48
阅读次数:
131
今天开始实战Java虚拟机之三:“虚拟机的工作模式”。总计有5个系列实战Java虚拟机之一“堆溢出处理”实战Java虚拟机之二“虚拟机的工作模式”实战Java虚拟机之三“G1的新生代GC”实战Java虚拟机之四“禁用System.gc()”实战Java虚拟机之五“开启JIT编译”新生代GC的主要工作是..
分类:
编程语言 时间:
2015-04-14 14:48:15
阅读次数:
184
新生代GC的主要工作是回收eden区和survivor区。一旦eden区被占满,新生代GC就会启动。新生代GC收集前后的堆数据如图5.6所示,其中E表示eden区,S表示survivor区,O表示老年代。
分类:
编程语言 时间:
2015-04-14 14:21:28
阅读次数:
148