如何优化内存
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!案例介绍这里,我将在平时工作过程中总结的内存溢出的情况
千家信息网最后更新 2025年02月01日如何优化内存
这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!
案例介绍
这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。
接下来,我们就以代码案例的形式来分析各种内存溢出的情况。
定义主类结构
首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。
public class BlowUpJVM {
}
栈深度溢出
public static void testStackOverFlow(){
BlowUpJVM.testStackOverFlow();
}
栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。
永久代内存溢出
public static void testPergemOutOfMemory1(){
//方法一失败
List list = new ArrayList();
while(true){
list.add(UUID.randomUUID().toString().intern());
}
}
打算把String常量池堆满,没想到失败了,JDK1.7后常量池放到了堆里,也能进行垃圾回收了。
然后换种方式,使用cglib,用Class把老年代取堆满
public static void testPergemOutOfMemory2(){
try {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOM.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
catch (Exception e){
e.printStackTrace();
}
}
虚拟机成功内存溢出了,那JDK动态代理产生的类能不能溢出呢?
public static void testPergemOutOfMemory3(){
while(true){
final OOM oom = new OOM();
Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(oom, args);
return result;
}
});
}
}
事实表明,JDK动态代理差生的类不会造成内存溢出,原因是:JDK动态代理产生的类信息,不会放到永久代中,而是放在堆中。
本地方法栈溢出
public static void testNativeMethodOutOfMemory(){
int j = 0;
while(true){
Printer.println(j++);
ExecutorService executors = Executors.newFixedThreadPool(50);
int i=0;
while(i++<10){
executors.submit(new Runnable() {
public void run() {
}
});
}
}
}
这个的原理就是不断创建线程池,而每个线程池都创建10个线程,这些线程池都是在本地方法区的,久而久之,本地方法区就溢出了。
JVM栈内存溢出
public static void testStackOutOfMemory(){
while (true) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
thread.start();
}
}
线程的创建会直接在JVM栈中创建,但是本例子中,没看到内存溢出,主机先挂了,不是JVM挂了,真的是主机挂了,无论在mac还是在windows,都挂了。
温馨提示,这个真的会死机的。
堆溢出
public static void testOutOfHeapMemory(){
List list = new ArrayList();
while(true){
StringBuffer B = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
B.append(i);
}
list.add(B);
}
}
不断往堆中塞新增的StringBuffer对象,堆满了就直接溢出了。
感谢各位的阅读,以上就是"如何优化内存"的内容了,经过本文的学习后,相信大家对如何优化内存这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
内存
不断
线程
方法
案例
动态
情况
代理
学习
主机
代码
内容
就是
常量
形式
深度
永久
温馨
直观
久而久之
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库备份与恢复思政案例
香港服务器的工作原理
易助数据库恢复超时
服务器开启不了任务管理器
网络安全厂商授权代理书
没有安全的网络安全电影
西安的软件开发培训
校园实验楼网络安全设备配置
中资网络安全 杨军
怎么重建sql数据库索引
数据库的查阅列表为固定值
软件开发画图工具有哪些
租用服务器开发app
烟台春牧网络技术有限公司
软件开发技术难度
软件开发高级软件工程师
一个数据库的实现与设计
知网字库里最常见的数据库
中职计算机网络技术论文
小灰灰网络技术有限公司
企腾网络技术
数据库表 自由表
dell服务器添加硬盘
杭州java软件开发机构
网络安全正确使用
医院网络安全保卫工作总结
软件开发刘杰
服务器删除数据
摩臣软件开发多久了
计算机游戏软件开发好就业吗