java.lang.OutOfMemoryError:Java head space 异常解决办法

1、首先是:java.lang.OutOfMemoryError: Java heap space

解释:

Heap size 设置

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

解决方法:

手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m

或修改catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

2、其次是:java.lang.OutOfMemoryError: PermGen space

原因:

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

解决方法:

1. 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

catalina.sh下为:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Java的可暂停贪吃蛇游戏的代码示例,你可以参考一下: ```java import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.LinkedList; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class SnakeGame extends JPanel implements KeyListener, ActionListener { private static final long serialVersionUID = 1L; // 游戏界面大小 private static final int WIDTH = 600; private static final int HEIGHT = 600; // 每个方格大小 private static final int SIZE = 20; // 游戏界面上的行数和列数 private static final int ROWS = HEIGHT / SIZE; private static final int COLS = WIDTH / SIZE; // 初始化蛇的长度和位置 private static final int INIT_LENGTH = 3; private static final int INIT_X = COLS / 2; private static final int INIT_Y = ROWS / 2; // 定义蛇和食物的颜色 private static final Color SNAKE_COLOR = Color.GREEN; private static final Color FOOD_COLOR = Color.RED; // 定义蛇和食物的位置 private LinkedList<Point> snake = new LinkedList<Point>(); private Point food = new Point(); // 定义蛇的移动方向 private static final int LEFT = 0; private static final int RIGHT = 1; private static final int UP = 2; private static final int DOWN = 3; private int direction = LEFT; // 定义定时器和暂停状态 private Timer timer = new Timer(100, this); private boolean paused = false; public SnakeGame() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); setBackground(Color.BLACK); setFocusable(true); addKeyListener(this); // 初始化蛇的位置 for (int i = 0; i < INIT_LENGTH; i++) { snake.add(new Point(INIT_X + i, INIT_Y)); } // 初始化食物的位置 newFood(); } // 生成新的食物位置 private void newFood() { Random random = new Random(); int x = random.nextInt(COLS); int y = random.nextInt(ROWS); food.setLocation(x, y); // 如果新的食物位置和蛇的位置重合,则重新生成 for (Point p : snake) { if (p.equals(food)) { newFood(); break; } } } // 画蛇和食物 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 画蛇 g.setColor(SNAKE_COLOR); for (Point p : snake) { g.fillRect(p.x * SIZE, p.y * SIZE, SIZE, SIZE); } // 画食物 g.setColor(FOOD_COLOR); g.fillRect(food.x * SIZE, food.y * SIZE, SIZE, SIZE); } // 移动蛇 private void move() { // 计算蛇头的新位置 Point head = snake.getFirst(); Point newHead = new Point(head); switch (direction) { case LEFT: newHead.x--; break; case RIGHT: newHead.x++; break; case UP: newHead.y--; break; case DOWN: newHead.y++; break; } // 如果蛇头碰到边界或自己的身体,则游戏结束 if (newHead.x < 0 || newHead.x >= COLS || newHead.y < 0 || newHead.y >= ROWS || snake.contains(newHead)) { timer.stop(); System.out.println("Game Over!"); return; } // 如果蛇头碰到食物,则增加蛇的长度,并生成新的食物 if (newHead.equals(food)) { snake.addFirst(newHead); newFood(); } else { // 否则,将蛇尾移除,并将蛇头插入到新位置 snake.removeLast(); snake.addFirst(newHead); } // 重绘游戏界面 repaint(); } // 处理键盘事件 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: if (direction != RIGHT) { direction = LEFT; } break; case KeyEvent.VK_RIGHT: if (direction != LEFT) { direction = RIGHT; } break; case KeyEvent.VK_UP: if (direction != DOWN) { direction = UP; } break; case KeyEvent.VK_DOWN: if (direction != UP) { direction = DOWN; } break; case KeyEvent.VK_SPACE: if (paused) { timer.start(); paused = false; } else { timer.stop(); paused = true; } break; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } // 定时器事件 @Override public void actionPerformed(ActionEvent e) { move(); } public static void main(String[] args) { JFrame frame = new JFrame("Snake Game"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new SnakeGame()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } ``` 在这个示例代码中,我们使用了Java Swing框架来创建游戏窗口,并使用键盘事件来控制蛇的移动方向和暂停游戏。定时器事件则用于控制蛇的移动和游戏的运行。你可以根据需要对代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值