JVM&内存管理

JAVA虚拟机简介:

• JAVA平台的 个重要组成部分.

• JAVA应用的运行平台

JAVA RunTime Environment JRE(运行时,非开发目的设计)

• 虚拟机

• 一系列标准类库

• JAVA应用所使用的

Java Development Kit  JDK

•  面向开发.

•  包含JRE.

虚拟机简介:

• 所有运行在虚拟机里面的程序都会编译成小的字节码格式(.class file).

• Jar文件包含一系列class文件

• JIT技术(Just In Time)

• 把字节码转换为本地代码

• 常用的VM执行技术

• 启动时较慢,因为要做bytecdoe compilation


HOTSPOT 架构

• HotSpot是sun java虚拟机技术.

• VM持续的分析程序性能热点(HotSpot),最经常被执行的代码/

• Hot Spots会被高度优化.

Server模式和Client模式

• server模式启动比较慢,但是运行速度得到了优化(生产环境使用)

• client模式启动比较快,但是运行期响应没有Server模式的优化(个人PC服务开发和测试)


查看JVM的Server服务器端环境和Client客户端环境.

java -version //查看JVM默认的环境 

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

java -client -version //查看JVM的客户端环境
java -server -version //查看JVM的服务器端环境


如果安装了公共的JRE环境 执行 java -server -version 会报错:(在安装的时候不选择安装公共JRE即可解决,Linux下无此问题)

“Error: no `server' JVM at `C:/Program Files/Java/jre6/bin/server/jvm.dll'.”x`

虚拟机模式的切换

找到JDK的指定目录的文件:%JAVA_HOME%\jre\lib\i386\jvm.cfg

打开后的内容为:(互换下位置即可)

-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR


HOTSPOT 架构

• 使用本地线程

• 使用操作系统stack区和线程模型

• 垃圾回收

• 大多数对象在创建后很短的时间内就会没有任何对象再使用它了 即未被其它对象引用 它了,即未被其它对象引用。
• 大多数一直被使用的对象(老对象)很少引用新创建的对象。

 HotSpot的内存管理

• 64位模式 方便虚拟机使用更多的物理内存

• 自动
• 在Heap区申请和释放对象空间
• 通过分区,区按照“年代”划分。“年代”是对象池
• GC发生在一个“区”满了的情况

• 通过设置JVM内存参数来管理VM内存,简单有效




内存设置


 影响因素

• 数据处理模型(32位或者64位操作系统)

• Heap的大小不能超过不同操作系统的进程寻址范围 32位 • Heap的大小不能超过不同操作系统的进程寻址范围,32位应用程序寻址空间2G
• 64位没有限制

• 系统地虚拟内存总数
• 系统的物理内存总数

OOM分析与处理

• 常见的代码问题

• 使用Boolean和Integer替代 bool和int
• 使用String或者String数组 应该多使用StringBuffer • 使用String或者String数组,应该多使用StringBuffer
• 不合理的使用集合对象
• 避免过深层次类调用
• 变量只有在用到它的时候才定义和实例化,减少对象的生命周期
•尽量避免使用static变量 类内私有常量可以用final来代替 • 尽量避免使用static变量,类内私有常量可以用final来代替。

• 尽早释放无用对象的引用。

• 常见的代码问题

• 尽量少用finalize函数。它会加大GC的工作量
• 尽量避免在类的默认构造器中创建 初始化大量的对象 防止 • 尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费。
• 尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间 最终时间。
• 尽量避免显式申请数组空间。
• 尽量做远程方法调用类应用开发时使用瞬间值变量 除非远程 • 尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值

• 尽量在合适的场景下使用对象池技术以提高系统性能。




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值