我们知道,java的虚拟器其实是有两个版本的,
client版比较适合桌面程序,它会做一些例如像快速初始化,懒加载这一类的事情来适应桌面程序的特点
server版则比较适合服务器程序,它做的则是一些针对服务器特点的事情,比如预加载,尤其在一些并发的处理上,它更是会做很多的优化,
比如线程共享变量的处理,它经过编译(运行)发现并没有要求某一变量对其他线程可见,它则不会将该变量同步到主存(可能永远不会)
之前在学习java并发时写过一个线程池
http://snake1987.iteye.com/blog/993112
稍微试了一下-server跟-client的区别
下面是运行结果
//-client
//55234043228
//234164019238
//-server
//3076884002
//3077230620
第一个结果是调度任务完成时间
第二个结果是完成所有任务的完成时间
很吓人的结果 近10倍
然后是今天
最近在写一个模块,并发会很高,所以打算能避免冲突则尽量让它不冲突
所以在一个全局消息队列的处理上,只在修改时加锁,在读取时则不加锁
因为消息的读取在业务上是允许延时的,所以打算不保证可见性,
因为根据文档得知cpu寄存器在一段时间后,是会将数据同步到主存的,这时自然就可见了
但会不会同步到主存呢,为了验证这个问题,写了个小测试
public static class LoopWrap {
private boolean loop;
public LoopWrap(boolean loop) {
this.loop = loop;
}
public boolean isLoop() {
return loop;
}
public void setLoop(boolean loop) {
this.loop = loop;
}
}
public static void main(String[] args) throws InterruptedException {
//该变量没有保证可见性
LoopWrap loop = new LoopWrap(true);
for(int i = 0;i<3;i++) {
Thread t = new TestThread(loop); t.start();
}
System.out.println("sleep");
Thread.sleep(10000);
System.out.println("change loop");
//sleep之后改变变量为false,如果是可见的,线程应该马上输出end,如果没有,则看一下什么时候会可见
loop.setLoop(false);
Thread.sleep(10000);
}
public static class TestThread extends Thread {
private LoopWrap loop;
public TestThread(LoopWrap loop) {
this.loop = loop;
}
@Override
public void run() {
long count = 0;
while(loop.isLoop()) {
for(int i = 0;i<100;i++) {
count+=i;
}
}
System.out.println("end");
}
}
public static class LoopWrap {
private boolean loop;
public LoopWrap(boolean loop) {
this.loop = loop;
}
public boolean isLoop() {
return loop;
}
public void setLoop(boolean loop) {
this.loop = loop;
}
}
public static void main(String[] args) throws InterruptedException {
LoopWrap loop = new LoopWrap(true);
for(int i = 0;i<3;i++) {
Thread t = new TestThread(loop);
t.start();
}
System.out.println("sleep");
Thread.sleep(10000);
System.out.println("change loop");
loop.setLoop(false);
Thread.sleep(10000);
}
public static class TestThread extends Thread {
private LoopWrap loop;
public TestThread(LoopWrap loop) {
this.loop = loop;
}
@Override
public void run() {
long count = 0;
while(loop.isLoop()) {
for(int i = 0;i<100;i++) {
count+=i;
}
}
System.out.println("end");
}
}
-client下是瞬间输出了end
-server下是死循环~~也就是说一直没有同步到主存了,或者说其他的线程一直只访问的是线程内缓存,也没有重新从主存中去取值
在这说一下,在开发并发相关的tx们,注意一下
1.在做压力测试的时候,记得使用hotspot的server版,否则是没有意义的
2.注意一下线程可见性的问题
分享到:
相关推荐
《Java SE 6与HotSpot VM故障排除指南》是Oracle公司于2008年11月发布的一份技术文档,旨在帮助开发人员、系统管理员和技术支持人员解决在使用Java Standard Edition 6 (Java SE 6) 和HotSpot虚拟机过程中遇到的各种...
《Java HotSpot 虚拟机》文件中包含了关于Java虚拟机(JVM)的深入讨论,尤其是在HotSpot虚拟机上的即时编译(JIT)技术,以及Java语言的最新发展。文件内容侧重于以下几个核心知识点: 1. **Java HotSpot虚拟机的...
1. 即时编译器:HotSpot虚拟机包含两个主要的JIT编译器,即Client Compiler(C1)和Server Compiler(C2),它们分别优化了不同类型的Java应用程序的性能。C1更倾向于编译速度,适用于短小快速运行的应用程序;C2则...
Compilation in the HotSpot VM 是一篇关于 Java 虚拟机(Java Virtual Machine,JVM)的技术文档, 由 Oracle 公司的 HotSpot 编译器团队的 Zoltán Majó 撰写。该文档详细介绍了 HotSpot JVM 中的编译过程,包括...
Hotspot有两个JIT编译器:Client Compiler(C1)和Server Compiler(C2)。C1适用于快速启动,而C2则更注重长期性能。 二、垃圾收集器 Hotspot JVM提供了多种垃圾收集器,如Serial、Parallel、Concurrent Mark ...
HotSpot VM是Oracle JDK中默认的JVM实现,它提供了一种称为HSDB(HotSpot Debugger Bridge)的工具,用于在运行时查看和分析JVM内部的数据。本篇将通过HSDB的使用案例来探讨HotSpot VM的运行时数据。 首先,我们...
【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...
本文档提供了Java HotSpot虚拟机(JVM)中内存管理的广泛概述,特别是在Sun公司的Java 2平台标准版(J2SE)5.0版本的发布中。文档描述了可供使用的垃圾收集器(Garbage Collectors),给出了关于如何选择和配置收集...
学习JDK 源码必备,提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初...
更多关于 Java HotSpot 虚拟机的信息,可以参考以下资源: - [Oracle 官方文档](https://docs.oracle.com/javase/8/docs/technotes/guides/vm/) - [Java 官方社区](https://community.oracle.com/tech/java) 以上...
《Memory Management in the Java HotSpot™ Virtual Machine》一文深入探讨了Java HotSpot虚拟机中的内存管理机制,这是Java性能优化的关键领域。HotSpot虚拟机是Oracle JDK和JRE的一部分,以其高性能和优化能力而...
- **Java栈(Java Stack)**:用于存储局部变量和线程状态。 - **Java堆(Java Heap)**:存放对象实例和数组。 - **本地方法栈(Native Method Stack)**:支持本地方法调用。 3. **自动内存管理器(Automatic Memory ...
The authors, who are all leading Java performance and Java HotSpot VM experts, help you improve performance by using modern software engineering practices, avoiding common mistakes, and applying tips ...
本篇文章将深入探讨HotSpot VM的运行时数据结构,以理解标题中提到的`t1`、`t2`和`t3`变量在内存中的存储位置。 首先,我们来看一下给出的Java代码片段: ```java public class Test { static Test2 t1 = new ...
Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.8是Java 8版本的别称,这是一个重要的里程碑,因为它引入了许多创新特性,提升了开发...
Java HotSpot 是 Sun Microsystems 开发的一款 Java 虚拟机(JVM),其中客户端编译器(Client Compiler)是 JVM 的核心组件之一。该编译器负责将 Java 字节码编译成机器代码,以提高 Java 程序的执行速度。 Java 6 ...
【描述】:本篇文章旨在探讨Java内存模型中不同类型的变量——包括静态变量t1、实例变量t2和局部变量t3——在HotSpot VM中的存储位置。我们将借助HSDB(HotSpot Serviceability Agent的调试器)来探索实际运行时的...
java 虚拟机 hotspot 源码