垃圾回收器的实现:

1.让用户都暂停,不再产生垃圾,就去收集垃圾。新生代用复制算法清理垃圾,老生代用标记整理算法搜集垃圾。

优秀的算法:服务端默认是CMS收集器。

%..jvm案例演示
内存:
Jconsole的内存标签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(java堆和永久代)的变化趋势。
我们通过下面的一段代码体验一下它的监视功能。运行时设置的虚拟机参数为:-Xms100m -Xmx100m -XX:+UseSerialGC,这段代码的作用是以64kb/50毫秒的速度往java堆内存中填充数据。
public class TestMemory {
static class OOMObject {
public byte[] placeholder = new byte[ * ];
} public static void fillHeap(int num) throws Exception {
ArrayList<OOMObject> list = new ArrayList<OOMObject>();
for (int i = ; i < num; i++) {
Thread.sleep();
list.add(new OOMObject());
}
System.gc();
} public static void main(String[] args) throws Exception {
fillHeap();
Thread.sleep();
}
}

从图中可以看出,运行轨迹成曲线增长,循环1000次后,虽然整个新生代Eden和Survivor区都基本上被清空了,但是老年代仍然保持峰值状态,这说明,填充的数据在GC后仍然存活,因为list的作用域没有结束。如果把System.gc();移到fillHeap();后,就可以全部回收掉。
线程:
jconsole线程标签相当于可视化了jstack命令,遇到线程停顿时,可以使用这个也签进行监控分析。线程长时间停顿的主要原因有:等待外部资源(数据库连接等),死循环、锁等待。下面的代码将演示这几种情况:
package cn.java.jvm; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class TestThread {
/**
* 死循环演示
*
* @param args
*/
public static void createBusyThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("createBusyThread");
while (true)
;
}
}, "testBusyThread");
thread.start();
} /**
* 线程锁等待
*
* @param args
*/
public static void createLockThread(final Object lock) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("createLockThread");
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}, "testLockThread");
thread.start();
} public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread();
br.readLine();
Object object = new Object();
createLockThread(object);
}
}
main线程:追踪到需要键盘录入
testBusyThread线程:线程阻塞在18行的while(true),直到线程切换,很耗性能
testLockThread线程:出于waitting状态,等待notify 死锁:
package cn.java.jvm; public class TestDeadThread implements Runnable {
int a, b; public TestDeadThread(int a, int b) {
this.a = a;
this.b = b;
} @Override
public void run() {
System.out.println("createDeadThread");
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
} public static void main(String[] args) {
for (int i = ; i < ; i++) {
new Thread(new TestDeadThread(, )).start();
new Thread(new TestDeadThread(, )).start();
}
}
}

Jconsole点击检查死锁,会出现死锁的详情。

thread-5的锁被thread-10持有,相反亦是,造成死锁。

jvm2的更多相关文章

  1. jvm--2.类加载机制

    3.JVM类加载机制 (1)类加载机制 虚拟机把描述类的数据从Class文件,用ClassLoader ,加载到内存,并对数据进行校验.转换解析和初始化,最终形成虚拟机直接使用的java类型, 这就是 ...

  2. JVM-2.Class文件结构

    1.Class文件 (1)无关性:除了平台无关性,JVM还支持语言无关性:目前Clojure.Groovy.JRuby.Jyphon.Scala等语言可以在JVM上运行.实现语言无关性的原理仍然是字节 ...

  3. [JVM-2]常用JVM命令参数

    (1)-Xms20M 表示设置JVM堆内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM堆内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM内存 ...

  4. 理解JVM2 栈内存,方法区,堆内存

    堆,方法区,栈的关系 分配最大堆内存-Xmx32m class SimpleHeap(val id: Int){ fun show() = println("My id is $id&quo ...

  5. 深入理解JVM2

    1 JVM简介 VM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. ...

  6. JVM2 类加载子系统

    目录 类加载子系统 类加载器子系统 类加载器ClassLoader角色 类加载的过程 案例 加载Loading 连接Linking 初始化Intialization clinit() 类的加载器 虚拟 ...

  7. (转)Apache实现反向代理负载均衡

    说到负载均衡LVS这套技术,有很多种实现方法. 本文所说,主要就是利用apache服务器实现反向代理,实现负载均衡. 首先,传统的正向代理如下图所示,正如我们用的游戏加速代理,大多的个人PC把请求发给 ...

  8. No.1 CAS 之LDAP认证服务端集群配置

    建档日期:   2016/08/31 最后修改日期:   2016/12/09   1 概述 本文描述了CAS单点登录服务端配置的大概流程,希望抛砖引玉,帮助你完成CAS服务端的配置. 本文采用apa ...

  9. java回顾rmi

    搞java的不懂rmi好像说不过去.. ,复习一遍. 参照http://www.iteye.com/topic/173909 http://lzj0470.iteye.com/blog/426760  ...

随机推荐

  1. 在input文本框中存入对象格式的数据

    <input id="teaching" type="hidden" name="teachingProgram" /> JQ: ...

  2. 【BZOJ2699】更新 动态规划

    [BZOJ2699]更新 Description        对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A ...

  3. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  4. Thymeleaf模板如何获取springMVC返回的model值

    Thymeleaf模板如何获取springMVC返回的model值 后台的实现: @RequestMapping("/hello") public String hello(Mod ...

  5. 按批次处理list数据 (list按条数取)

    按批次处理list数据的两种方法 主要应用于list存储数据过多,不能使list整体进行其余操作 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  6. 常见到的runtime exception

    ClassCastException    类转换异常 IllegalArgumentException   非法参数异常 IndexOutOfBoundsException   数组越界异常 Nul ...

  7. datasnap rest Windows客户端编写

    首先吐槽一下XE关于datasnap的资料真的是太少了... 服务端用DSHTTPService1控件可以实现http接口方式的调用,返回的都是json格式数据,适用于跨平台解析. 这里着重强调一下d ...

  8. alexnet,VGG,googlenet,resnet

    非常好的一篇:https://my.oschina.net/u/876354/blog/1637819 alexnet和VGG没什么特别的,VGG深一些. Deep learning 实际上是一种 f ...

  9. 【使用时发生的意外】file is not sufficiently replicated yet

    异常堆栈如下: -- ::, ERROR [com.ultrapower.secsight.util.HdfsUtil] - 追加写入文件失败! org.apache.hadoop.ipc.Remot ...

  10. golang: multiple http.writeHeader calls

    背景: golang的http服务,读取文件,提供给client下载时候. 出现 multiple http.writeHeader calls 错误. func DownloadFile(w htt ...