- 浏览: 988909 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
以下继续探讨,说说jvm的线程(thread)及其执行中和内存相关的问题。but今天是写不完了,请保持关注,先写个预告栏咯
记
得当年学java之初,总是很鄙夷它,因为那时候对c/c++很痴迷,结果呢,第一个多线程程序还是拿java写出来的。而线程(thread),本是操
作系统的所提供/支持的,所以当初有一段时间,我总在怀疑我那java程序创建的线程到底是不是真正的操作系统线程,现在看来很可笑。
题外,再继续质疑一下:
在
有些平台上,比如Linux或者大部分的unix,只有进程而没有线程的概念的,但这些平台上,进程间通讯的手段极其发达,所以jvm会用进程模拟线程,
效果也是一样的。不过,也有一些平台如sorlaris,在java线程和os内核线程间,存在着不是1对1的关系,实在让我挠头,容以后再去把它搞明
白。
简单的说,jvm如何实现多线程呢,首先要有os的支持包括变相的支持,那么jvm通过os提供线程接口创建新线程,这些新线程当然
还不能直接执行你的 thread对象的run方法,但它会拥有并执行属于该线程的一个java
interpreter实例或者上下文,java解释器再去执行你的run方法,当run方法结束(自然结束时),java
interpreter发现没有字节码可以解释了,也宣告结束,OS线程也就自然终结了。至于要实现线程的终止,挂起,恢复,也都可以从OS那里找到相应
的接口,这里不再细说,而主要关注对内存的影响,主要是java stack和native call等问题。
待续
续
当
执行引擎(即java interpreter,对应一个ExecEnv)开始解释执行一个java
method以前,它首先初始化自身,即分配自己的initial java
stack,栈开始时尺寸很小,随着使用的需要而扩展,存在一个400k的默认长度限制(
-Xss<size>可更改该值);ExecEnv有两个重要的标志(或指针),一个是pc,即程序计数器,另一个是optop,即栈顶,也是最上面一个操作数(即本地变量)的位置。
pc总是指向要执行的byte code(随着每一条byte code的执行,pc自动改变),而optop指向java stack的顶端(也随某些byte code的执行而改动)。当方法执行时,方法的invoker将pc指向method block的code
位,同时,在java stack里为该方法新建java frame(每一个方法在编译期就确定了运行它所需的最大stack
size,所以,新建java freame时,会按照这个size去检查java stack是否满足,若不足,则扩展java
stack,而java stack已经达到最大长度限制时,扩展失败,发生stack
overflow),准备工作完成后,还给ExecEnv继续解释和执行;当方法执行完毕时,一条ret字节指令将pc和optop送回前一个java
frame所记录的位置。所以,对于某个线程来说,其java stack完整的记录了所深入的每一层java method(每层一个java
frame),除了native method,本质上是因为c的堆栈不能记录。
以上是执行java method,若是native
method呢?很简单,native method在类加载时,即被jvm安排了一个native invoker在其method
block中,继而在ExecEnv执行一条call该native method的字节指令时,native
invoker被执行,如果是首次执行,那么这个native mothod的method block的code段尚未挂接,native invoker检查到这个信息,将根据method name和signature搜索系统中已加载的dll的合适挂接点,将找到的挂接点挂在code上,而后调用该code段即可(找不到挂接点,会发生什么异常你应该清楚)。过程中,除非你的native method中又反调了java method,那么,java stack将毫无变化。
再来关注一下native method的内存模型:native mthod自身的机器码code
存在于dll镜像(image)中;nm的本地变量存在于线程堆栈内(指native thread,和java
thread是绑定着的);nm用到的静态变量存在于dll的共享变量区中;nm制造的java对象(通过jni手段new来的)依然在java
heap;而nm声明的global ref以及local ref存放在jvm的native c
heap上。本地方法也会带来内存泄露(c的内存泄露,也可能是java heap的global ref的未释放),特别是c
heap的泄露,运行期是极难探测和定位的。
最后,说说调用深度过深(即java
stack会很长)带来的负面影响。在前一节,我们知道本地变量都寄存在java
stack中。如果调用深度过深,特别是jvm长时间运行在较高深度调用的情形下,意味着在栈上的各frame中,存在着很多变量,它们中的引用类型将一
直保持对java heap上对应对象的引用而导致gc器始终不能释放它们;其次,较长的java
stack也给gc器造成了较多的扫描时间(为何要扫描后面再说);第三,method
call本身也是一种时间开销,对于很短小的method,call它比它本身代码执行的时间还要多,好比机关枪打蚊子,这也是现代编译器非常讲究
inline优化的原因。
发表评论
-
A Collection of JVM Options
2011-06-24 12:59 1132A Collection of JVM Options ... -
java中堆(heap)和堆栈(stack)有什么区别
2011-05-10 14:29 869stack 和 heep 都是内存的一部分 stack 空间 ... -
JVM & Memory (5) final
2011-05-10 14:25 966先说tuning,gc有两个指标,一个是frequentcy( ... -
JVM & Memory (4) gc
2011-05-10 14:22 889不同的JVM实现对堆结构的设计有所不同,这里先说说共性的,然后 ... -
JVM & Memory (2) java.exe
2011-05-10 14:20 918上篇说到了关于java heap ... -
JVM & Memory (1) paging
2011-05-10 14:19 938近期看了一些有关JVM和内存的资料,为了避免遗忘,特在这里作一 ... -
JDK TOOLS
2011-05-10 14:15 787以下这几种工具(存在于 ... -
jvm日志分析工具应用
2011-05-10 14:14 2782涛涛学习笔记之gc日志分析工具 测试环境:xp+weblog ... -
JVM优化配置
2011-05-10 13:56 911OOM 这个缩写就是Java程 ... -
高手详细介绍JVM是什么?
2011-05-10 13:52 839首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实 ... -
JVM监控工具介绍
2011-03-22 14:25 863... -
正确认识java JVM与c/c++的执行效率
2011-03-22 10:43 1382认为Java 不能写JVM是完全错误的。JNode是一个用 ... -
Java虚拟机(JVM)参数配置说明
2011-03-22 10:26 963Java虚拟机(JVM)参数配置说明 ... -
解析 Java 类和对象的初始化过程
2011-03-21 23:40 884解析 Java 类和对象的初始化过程 由一个单态模式引出的问 ... -
JDK的概念、组成及JDK常用包
2011-03-18 22:09 1109JDK概述 JDK (Java Development ... -
安装JDK后JRE与JVM联系浅谈
2011-03-18 22:08 892安装JDK后JRE、JVM之间的 ... -
详细介绍什么是Java虚拟机
2011-03-18 22:07 814本文由浅入深,先从什么是Java虚拟机、Java虚拟机 ... -
认识Java虚拟机及其性能
2011-03-18 22:04 705Java虚拟机(Java virtual ... -
JVM GC调整优化过程全揭秘
2011-03-18 22:03 816JVM GC调整优化是以个极为复杂的过程,由于各个程序具备 ... -
Java虚拟机的研究与实现(图文)
2011-03-18 21:59 1000引言 Java 虚拟机本质是就是一个程序,当它在命令行 ...
相关推荐
介绍了heap dump和thread dump,以及详细介绍dump工具Memory Analyzer的使用,最后讲解了Java对象的内存布局。
在使用concurrent gc的情况下,防止memory fragmention,对live object进行整理,使memory 碎片减少 h: -XX:CMSInitiatingOccupancyFraction= 指示在old generation 在使用了n%的比例后,启动concurrent collector,...
--total-memory :应用程序可用的总内存,通常用大小分类( B 、 K 、 M 、 G 、 T )表示 --loaded-class-count :应用程序运行时将加载的类数 --thread-count : 用户线程数 --jvm-options : JVM 选项,通常是JAVA...
java程序性能分析thread dump和heap dump,dump文件:在故障定位(尤其是out of memory)和性能分析的时候,dump文件记录了JVM运行期间的内存占用、线程执行等情况。 heap dump:记录某一时刻JVM堆中对象使用情况,哪些...
Duration: 3 Days What you will learn This course teaches the steps to identify the symptoms and causes of the issues, the method of investigating the issues and the ways ofresolving the issues in ...
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads 对于jdk1.5而言,假设操作系统保留120M内存: 1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads 1.0...
JVM: real-time memory usage charts X X X X JVM: status X X X X JVM: advise GC X Java Service Wrapper: status X X X X Java Service Wrapper: restart JVM X System: overview X X X X System: ...
Java性能分析神器-JProfiler 使用方便 界面操作友好 对被分析的应用影响小 CPU,Thread,Memory分析功能尤其强大 支持对jdbc,noSql, jsp, servlet, socket等进行分析 支持多种模式(离线,在线)的分析
Profiler是由ej-technologies GmbH公司开发的一款性能瓶颈分析工具(该...CPU,Thread,Memory分析功能尤其强大 支持对jdbc,noSql, jsp, servlet, socket等进行分析 支持多种模式(离线,在线)的分析 version 11.1.2 x64
5.4 Stopping and starting multi-thread programs . . . . . . . . . . . . . 6 Examining the Stack . . . . . . . . . . . . . . . . . . . . . . 51 6.1 6.2 6.3 6.4 6.5 6.6 7 Stack frames . . . . . . . . . ...
long startMemory = Runtime.getRuntime().freeMemory(); java.util.Properties prop = System.getProperties(); String javaVersion=prop.getProperty("java.version"); String FS=prop.getProperty("file....
---- Minecraft Crash Report ---- // Hey, that tickles! Hehehe! Time: 13-10-26 下午12:05 Description: Unexpected error java.lang.IllegalStateException: Keyboard must be created before you can read ...