java 虚拟机-内存管理

 
 
 
本地方法
非java代码实现的java方法,使用native关键字,除abstract外可与java关键字连用
程序计数器
可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能。该区域时java虚拟机规范中没有规定outofmeroryError情况的区域
虚拟机栈
 
1、生命周期同线程一致
2、程序员通常指的栈内存区,更确切的是指虚拟机栈中的局部变量表部分
3、局部变量表存放编译器的各种基本数据类型,对象引用
4、线程请求的栈深度大于虚拟机所允许的深度时抛出stackOverFlowError
5、当虚拟机在扩展时申请不到足够的内存的时候会抛出OutOfMemoryError
6、虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧(stack frame),用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行完成就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
本地方法栈
1、功能同虚拟机栈,只不过该区域执行的是native方法
2、同虚拟机栈一样会抛出stackOverFlowError和outOfMemoryError
3、有些虚拟机将本地方法栈和虚拟机栈合二为一
Java堆
1、Java虚拟机所管理的内存中最大的一块
2、存放几乎所有的对象实例
3、GC管理器的主要管理区域
4、根据GC的分代算法将堆分为新生代和老年代,或者更细的分为Eden空间,From Suvivor空间,To Suvivor空间
5、堆为线程共享区
6、从内存分配的角度来看,堆中可以划分出多个线程私有的分配缓冲区(TLAB)
7、对内存的划分是为了更好的回收内存和分配内存
8、Java堆在逻辑上是连续的,在物理上可以不连续
9、大小可调,通过-Xmx和-Xms参数调节大小
10、当堆中没有内存分配给新创建的对象实例,并且堆无法再扩展的时候就会抛出outOfMemoryError
方法区
1、线程共享区
2、存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码
3、俗称永久代
4、通过参数-XX:MaxPermSize来限制方法区的大小
5、该区域的内存回收主要针对常量池和对类型的卸载
6、当该区无法满足内存分配的需求的时候会抛出oytOfMemoryError
运行时常量池
1、方法区的一部分
2、class文件中存放编译期生成的各种字面量和符号的引用的常量池信息,在加载完后放入运行时常量池
3、抛出outofMemoryError的情况同方法区
直接内存
1、不是虚拟机运行时数据区的一部分
2、不受堆内存大小的限制
3、NIO使用Native函数库直接操作堆外内存提高性能,但是如果堆内存分配不合理,就会导致动态扩展的时候抛出outOfMemoryError
 
内存分配与回收策略
  • 对象优先在新生代Eden区分配
          大部分对象创建的时候会在新生代的Eden空间分配空间,当Eden区没有足够的空间时,JVM会发起一次Minor GC
  • 大对象直接进入老年代
          大对象是指需要大量连续的内存空间的Java对象,典型的大对象就是那种长字符串和长数组,大对象经常会导致内存空间还有,但提前触发了GC来腾出空间安置他们。虚拟机提供参数-XX:PretenureSizeThreshold,所需内存超过该参数值的对象直接分配在老年代
  • 长期存活的对象将进入老年代
          虚拟机给每个对象定义了一个年龄计数器,当对象在Eden区出生并且经历一次Minor GC后依然存活并且能被Survivor容纳的话,该对象将会被移到Survivor区并且对象年龄加一,当它的年纪达到一定值(默认是15)时就会被移到老年代,如果老年无法存放的话就会发起一次Full GC,对于晋升老年代的对象年龄阀值可以通过参数-XX:MaxTenuringThresHold来设置
  • 动态对象年龄判断
           通常情况下新生代的对象必须达到对象年龄才会放入老年代,但是如果Survivor区中同一年龄的对象占用的总内存大于Survivor空间的一半,那么Age>=该年龄的对象直接放入老年代
  • 空间分配担保
          在发生Minor GC之前,虚拟机会先检查老年代最大的连续空间是否大于新生代所有对象的总空间,如果大于则可以保证此次Minor GC是安全的,如果不成立,则虚拟机会查看-XX:HandlePromotionFailure的值是否允许担保失败,如果允许则发起Minor GC,尽管此次GC是非安全的,如果不允许则发起一次Full GC
 

 

 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
jAVA基础 提高文件复制性能之多线程复制文件 利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优。因线程的个数可根据文件的大小及需求而定。其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理。以下是实现代码及自己理解的注释,多有偏差请见谅。下面是兄弟连java培训总结的一些代码:供参考。 程序实现类代码
这个是我一个技术相当好的哥们去面试的时候碰到的奇葩问题,那天,这个面试官的答案是不能。后来就带着这个问题去国内外的论坛上搜了一把,也是各说纷纭,实在是没有一个统一的答案,简直有点公说公有理,婆说婆有理的架势。     几个意见大致如下,第一,不能,因为“进程是CPU进行调度的单位,而JVM是一个进程,于是就只能跑在一个CPU上”。第二,“进程是CPU进行调度的单位,这没错,但是OS负责将一个进程在不同的CPU上调度到另外一个CPU上,而这个进程,则是由不同的线程构成的,那么说,线程还是在不同的CPU上运行了
1、一个简单的订单号生成器: 从代码可以看出: long orderNo = (Long.parseLong((date))) * 10000;   orderNo += orderNum + Long.parseLong(RandomStringUtils.randomNumeric(3)); 每毫秒可以保证,10000-999个订单号不重复。     import java.text.SimpleDateFormat;import java.util.Date;import org.apache.co
Java是世界上最流行的程序语言,从1995年问世以来,Java的生态系统在一直在蓬勃的发展着。作为一门健壮的技术,Java社区为广大开发者提供了包括框架、库、web开发sdk、JVM语言等资源。在各种科技行业都能够找到关于Java编程的相关资源,这就是为什么Java会如此受人喜爱。 在今天,发达的网络技术推动了Java的发展,越来越多的人选择在网上学习,查看技术大牛的博客并进行交流成为了日常学习的一个重要手段。在这里,我整理了国外最流行的十大Java技术博客,它们都是由Java技术专家维护的,无论是初学
druid是号称目前最好的java数据库连接池,温少写点代码中有很多设计模式的思想,其中最重要的一个就是filter-chain设计模式给druid所带来的可扩展性。对此,我很感兴趣,并希望日后借鉴,所以看了看他的源码,以此记录一下。 druid中设计到filter-chain设计模式的类或接口主要有一下几个Filter、FilterAdapter、FilterChain、FilterChainImpl、FilterEventAdapter、FilterManager 以及举例讲讲两个具体的filter:

mysql外键实战 - 2016-09-21 14:09:05

一、基本概念 1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。 2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。 3、如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表
会联网前沿技术文档,各大公司技术架构,欢迎各位浏览!!!网址: http://dwz.cn/4bwqKb  

Java的文件读写操作 - 2016-09-20 18:09:14

file(内存)----输入流----【程序】----输出流----file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。使用FileReader读取文件: FileReader fr = new FileReader("mi

后端技术杂谈 - 2016-09-20 18:09:07

http://www.rowkey.me/blog/2016/06/27/java-backend-study/?hmsr=toutiao.ioutm_medium=toutiao.ioutm_source=toutiao.io       1、Web Server,Web container和Application Server区别。 Web Server,Web服务器,同上面所说,Web服务器是指能够为发出请求的浏览器提供文档的程序。服务器是一种被动程序,只有浏览器发出请求的时候才会响应。应用层使用的

JSP简单访问数据库 - 2016-09-20 17:09:01

Java代码 public class DBHelper { private String driverName; private String url; private String user; private String password; private Connection connection; private String createTableSql; private String dropTableSql; public void getConnection() { if (null =