`
snake1987
  • 浏览: 71842 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于java hotspot vm的server版和client版的一点小事

    博客分类:
  • java
阅读更多
我们知道,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.注意一下线程可见性的问题
分享到:
评论

相关推荐

    The Java HotSpot VM.pdf

    The Java HotSpot VM.pdf

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    Java HotSpot VM Options

    jvm参数介绍,oracle HotSpot官方参数文档。

    java-jdk-hotspot源码

    学习JDK 源码必备,提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初...

    Memory Management in the Java HotSpot Virtual Machine.pdf

    Memory Management in the Java HotSpot Virtual Machine.pdf

    Java Performance Companion(Addison,2016)

    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 ...

    Java.Performance.Companion.0133796825

    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 ...

    Java Performance

    Gaining “under the hood” knowledge of the Java HotSpot VM that can help you address most Java performance issues Integrating JVM-level and application monitoring Mastering Java method and heap ...

    Hotspot VM源码

    HotSpot正是目前世界上java虚拟机的最好的实现。 HotSpot的基础代码是许多人辛勤劳动的结晶,这个过程迄今已持续了超过10年的时间(当然时间长并不意味着一定好,一半一半吧)。所以到现在为止,他的体积是很大的。...

    08-java11-hotspot-guide.pdf

    这是官方的原版表中文档。Java11平台中,官方hotspot虚拟机的具体实现的标书。

    Prentice Hall - Java Performance

    Gaining “under the hood” knowledge of the Java HotSpot VM that can help you address most Java performance issues Integrating JVM-level and application monitoring Mastering Java method and heap ...

    Java_Performance

    Ø Gaining “under the hood” knowledge of the Java HotSpot VM that can help you address most Java performance issues Ø Integrating JVM-level and application monitoring Ø Mastering Java method and ...

    hotspot-virtual-machine-garbage-collection-tuning-guide.pdf

    The Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide describes the garbage collection methods included in the Java HotSpot Virtual Machine (Java HotSpot VM) and ...

    hotspot.tar.gz

    官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。

    JAVA虚拟机精讲

    《Java虚拟机精讲》以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法...

    The_Java_HotSpot_Performance_Engine_Architecture

    The_Java_HotSpot_Performance_Engine_Architecture,java虚拟机进阶

    HotSpot实战高清版本

    本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...

    Java虚拟机精讲.高翔龙.带书签完整版.pdf

    本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器...

    jdk1.8 下载。 hotspot (包含源码)

    jdk1.8。hotspot java jdk java开发工具。

    借HSDB来探索HotSpot VM的运行时数据.gist1

    It will be set after the class is loaded.VM Started: Set deferred breakpoint Tes

Global site tag (gtag.js) - Google Analytics